Một điểm lớn là chỉ mục sẽ không giúp ích gì cho một số loại tìm kiếm nhất định. Ví dụ:
SELECT * FROM [MyTable] WHERE [MyVarcharColumn] LIKE '%' + @SearchText + '%'
Không có số lượng chỉ mục bình thường sẽ giúp truy vấn đó. Nó mãi mãi phải chịu số phận chậm. Biểu hiện LIKE
không chỉ là sargable.
Tại sao? Trước tiên, bạn cần phải hiểu cách các chỉ mục hoạt động. Về cơ bản, họ lấy các cột được lập chỉ mục cùng với khóa chính (con trỏ ghi) vào một bảng mới. Sau đó, họ sắp xếp bảng đó trên cột được lập chỉ mục thay vì khóa. Khi bạn tìm kiếm bằng cách sử dụng chỉ mục, nó có thể nhanh chóng tìm thấy (các) hàng bạn muốn vì chỉ mục này được sắp xếp để tạo điều kiện tìm kiếm hiệu quả hơn bằng các thuật toán như tìm kiếm nhị phân và các thuật toán khác.
Bây giờ hãy xem lại truy vấn đó. Bằng cách đặt một ký tự đại diện ở phía trước văn bản tìm kiếm, bạn vừa nói với cơ sở dữ liệu mà bạn không biết chắc chắn cột của bạn bắt đầu bằng gì. Không có số lượng phân loại sẽ giúp; bạn vẫn cần phải đi qua toàn bộ bảng để chắc chắn rằng bạn tìm thấy mọi bản ghi phù hợp với biểu thức. Và điều đó có nghĩa là bất kỳ chỉ mục bình thường nào trên cột đều vô giá trị cho truy vấn này.
Nếu bạn muốn tìm kiếm cột văn bản cho chuỗi tìm kiếm ở bất kỳ đâu trong cột, bạn cần phải sử dụng một chút khác biệt: chỉ mục toàn văn.
Bây giờ cho độ tương phản nhìn vào truy vấn này:
SELECT * FROM [MyTable] WHERE [MyVarcharColumn] LIKE @SearchText + '%'
này sẽ làm việc hoàn toàn tốt đẹp với một chỉ số bình thường, bởi vì bạn biết làm thế nào bạn mong đợi cột để bắt đầu. Nó vẫn có thể khớp với các giá trị được sắp xếp được lưu trữ trong chỉ mục, và vì vậy chúng ta có thể nói rằng nó là sargable.
Nguồn
2009-09-09 13:10:09
Hãy suy nghĩ về chuỗi là một chuỗi số ... trợ giúp? –