Không phải không có nỗ lực chuẩn bị nghiêm túc, hwilson1.
Nguy cơ lặp lại rõ ràng - mọi tối ưu hóa đường dẫn tìm kiếm - dẫn đến quyết định liệu chỉ mục được sử dụng hay loại toán tử nối nào để sử dụng, v.v. (độc lập với DBMS mà chúng ta đang nói đến) hoạt động trên bình đẳng (bằng) hoặc kiểm tra phạm vi (lớn hơn và nhỏ hơn).
Với các ký tự đại diện hàng đầu, bạn đã hết may mắn.
Cách giải quyết là một nỗ lực chuẩn bị nghiêm túc, như đã nêu lên phía trước:
Nó sẽ đun sôi xuống văn bản tìm kiếm tính năng Vertica, nơi vấn đề đó được giải quyết. Xem ở đây:
https://my.vertica.com/docs/8.0.x/HTML/index.htm#Authoring/AdministratorsGuide/Tables/TextSearch/UsingTextSearch.htm
Đối với bất kỳ nền tảng cơ sở dữ liệu khác, bao gồm MS SQL, bạn sẽ phải làm điều đó bằng tay.
Tóm lại: Nó dựa trên khóa chính hoặc số nhận dạng duy nhất của bảng có tìm kiếm văn bản bạn muốn tối ưu hóa.
Bạn tạo một bảng phụ, khóa chính là khóa chính của bảng cơ sở của bạn, cộng với số thứ tự, và cột VARCHAR sẽ chứa một chuỗi các chuỗi của bảng cơ sở ban đầu mà bạn đã tìm kiếm bằng ký tự đại diện. Trong một cách quá đơn giản:
Nếu bảng đầu vào của bạn (chỉ hiển thị các cột quan trọng) là thế này:
id |the_search_col |other_col
42|The Restaurant at the End of the Universe|Arthur Dent
43|The Hitch-Hiker's Guide to the Galaxy |Ford Prefect
bảng tìm kiếm phụ trợ của bạn có thể bao gồm:
id |seq|search_token
42| 1|Restaurant
42| 2|End
42| 3|Universe
43| 1|Hitch-Hiker
43| 2|Guide
43| 3|Galaxy
Thông thường, bạn ngăn chặn các "chất độn" điển hình như các bài báo và giới từ và các dấu nháy đơn, và được chia thành các thẻ được phân tách bằng dấu câu và khoảng trắng. Tuy nhiên, đối với ví dụ '% nham%' của bạn, bạn có thể cần nói chuyện với một nhà ngôn ngữ học chuyên về hình thái học tiếng Anh để tìm các ứng cử viên mã thông báo ....: -]
Bạn có thể bắt đầu bằng kỹ thuật tương tự mà tôi sử dụng khi tôi bỏ trục một loạt ngang các biện pháp mà không có khoản pIVOT, như ở đây:
Pivot sql convert rows to columns
Sau đó, sử dụng một sự kết hợp của, có lẽ lồng nhau, CHARINDEX() và substring() sử dụng các chỉ số bạn nhận được từ CROSS JOIN với một loạt các số nguyên chỉ mục như được mô tả trong bài đăng của tôi được đề xuất ở trên và sử dụng chỉ mục đó làm chuỗi cho bảng tìm kiếm phụ trợ.
Đặt chỉ mục trên search_token
và bạn sẽ có đường dẫn truy cập rất nhanh đến một bảng lớn.
Không đi dạo trong công viên, tôi đồng ý, nhưng đầy hứa hẹn ...
Chúc mừng chơi -
Marco các Sane
Theo như tôi biết, SQL Server không có kiểu chỉ mục được xây dựng sẵn mà thực hiện những gì bạn muốn (Postgres thực hiện). Có nhiều cách để làm những gì bạn muốn, nhưng họ đòi hỏi rất nhiều công việc. –
Bạn đang ở trong các chỉ mục đó sẽ không thể tìm kiếm trên đó, nhưng ngay cả việc quét chỉ mục bằng tra cứu chính có thể nhanh hơn quét bảng nếu đó là những gì nó đang làm bây giờ. Bạn sẽ phải kiểm tra nó và xem. – SqlZim
Một điểm làm rõ: Bạn có thể tìm kiếm các phần của các từ có chỉ mục toàn văn, nhưng nó phải là phần đầu tiên của từ đó. Sử dụng ví dụ về chuỗi của bạn, bạn có thể tận dụng thành công chỉ mục toàn văn bằng cách tìm kiếm 'Guil', nhưng bạn đúng khi nói rằng nó sẽ không hoạt động cho 'nham'. – dfundako