THÍCH vs CONTAIN trên SQL Server


209

Truy vấn nào sau đây nhanh hơn (THÍCH so với CONTAIN)?

SELECT * FROM table WHERE Column LIKE '%test%';

hoặc là

SELECT * FROM table WHERE Contains(Column, "test");

12
Chấp nhận một câu trả lời, bạn sẽ?
AgentFire

7
Anh ấy đã không ở trong nhiều năm.
Chris

Câu trả lời:


174

Thứ hai (giả sử bạn có nghĩa CONTAINSvà thực sự đặt nó trong một truy vấn hợp lệ) sẽ nhanh hơn, bởi vì nó có thể sử dụng một số dạng chỉ mục (trong trường hợp này là một chỉ mục toàn văn). Tất nhiên, hình thức truy vấn này chỉ khả dụng nếu cột nằm trong một chỉ mục toàn văn. Nếu không, thì chỉ có mẫu đầu tiên có sẵn.

Truy vấn đầu tiên, sử dụng THÍCH, sẽ không thể sử dụng một chỉ mục, vì nó bắt đầu bằng ký tự đại diện, do đó sẽ luôn yêu cầu quét toàn bộ bảng.


Các CONTAINStruy vấn nên là:

SELECT * FROM table WHERE CONTAINS(Column, 'test');

@edze - Ý bạn là, cùng một trang đã được liên kết là đề cập đầu tiên của tôi về CONTAINS? Cái gì của nó Hình thức ban đầu của câu hỏi Column CONTAIN("%test%",Column)>0không có giá trị. Nó vẫn chưa hoàn toàn đúng.
Damien_The_Unbeliever

Điều này giúp chúng tôi sắp xếp một truy vấn trên SharePoint. Có một huy hiệu Trả lời tuyệt vời khác.
ngerak

14

Đã chạy cả hai truy vấn trên phiên bản SQL Server 2012, tôi có thể xác nhận truy vấn đầu tiên là nhanh nhất trong trường hợp của mình.

Các truy vấn với LIKEtừ khóa cho thấy quét chỉ mục cụm.

Họ CONTAINScũng đã quét một chỉ mục cụm với các toán tử bổ sung cho kết quả khớp văn bản đầy đủ và nối kết hợp.

Kế hoạch


8
Các trang lá chỉ mục cụm bảng. Một LIKEtruy vấn với ký tự đại diện hàng đầu sẽ không thể sử dụng phần chỉ mục một cách hiệu quả. Nó sẽ chỉ cần quét toàn bộ. Mặc dù chắc chắn có thể có một số trường hợp trong đó quét CI đầy đủ thực hiện tốt hơn truy vấn sử dụng chỉ mục toàn văn bản (có lẽ nếu tỷ lệ rất cao của các hàng khớp với nhau) chẳng hạn, đây sẽ là ngoại lệ không phải là quy tắc chung mà bạn "có thể xác nhận ".
Martin Smith

Vâng, tôi đang xem xét một kế hoạch thực hiện thực tế lấy hơn 200.000 hồ sơ. Đặt cả hai truy vấn theo một đợt, cả hai đều quét chỉ mục được nhóm, nhưng ngoài ra, truy vấn "CONTAIN" còn có thêm chi phí ĐẦY ĐỦ VĂN BẢN và THAM GIA MERGE.
MI C

Nếu nó chọn một phép nối hợp nhất thì SQL Server đang ước tính hơn x% số hàng sẽ kết thúc khớp với vị từ. (Trong đó X = điểm tới hạn ). Trong trường hợp đó, tôi tưởng tượng cả hai có thể kết hợp khá đồng đều. Các chi phí thể hiện trong kế hoạch thực hiện chỉ là ước tính (ngay cả trong kế hoạch thực tế). Trong khi có các toán tử kế hoạch thực hiện bổ sung trong kế hoạch FT, nó có một số lợi ích. Liên kết hợp nhất có thể dừng trước khi kết thúc quá trình quét khi hết kết quả FT và cũng không phải đánh giá LIKE.
Martin Smith

1
Tôi đã chạy một truy vấn tương tự để kiểm tra kế hoạch thực hiện trong sql 2012 và nó đã cho tôi một Index Seek. Có lẽ trong ví dụ ở đây cái bàn gần như trống rỗng. Trong một số trường hợp sql sử dụng quét chỉ mục trong bảng rất nhỏ thay vì sử dụng chỉ mục vì nhanh hơn.
Juan

8

Tôi nghĩ rằng CONTAINSmất nhiều thời gian hơn và được sử dụng Mergevì bạn có dấu gạch ngang ("-") trong truy vấn của mình adventure-works.com.

Dấu gạch ngang là một từ ngắt để CONTAINStìm kiếm chỉ mục toàn văn cho adventurevà hơn nó tìm kiếm works.comvà hợp nhất các kết quả.


8

Cũng thử thay đổi từ đây:

    SELECT * FROM table WHERE Contains(Column, "test") > 0;

Về điều này:

    SELECT * FROM table WHERE Contains(Column, '"*test*"') > 0;

Cái trước sẽ tìm thấy các bản ghi với các giá trị như " đây là một thử nghiệm " và " một trường hợp thử nghiệm là kế hoạch ".

Sau này cũng sẽ tìm thấy các bản ghi với các giá trị như " tôi đang thử nghiệm điều này " và " đây là giá trị lớn nhất ".


4
Việc đặt dấu sao trước và sau cụm từ tìm kiếm có hoạt động không? Khi đọc tài liệu cho CONTAINS, nó chỉ đề cập đến việc sử dụng các thuật ngữ tiền tố như 'test *', không phải các thuật ngữ hậu tố như ' test' và không tìm kiếm chuỗi con đầy đủ như '* test '. Tôi đã không thử nó, mặc dù.
matt forsythe 15/1/2016

4
Nếu bạn đọc tài liệu về CONTAIN ( docs.microsoft.com/en-us/sql/t-sql/queries/ tựa ), chỉ hỗ trợ tìm kiếm tiền tố. Tôi đã thử nghiệm điều này nhiều lần và không thể tìm thấy "đây là điều tuyệt vời nhất" (trong SQL Sever) với Chứa (Cột, '" thử nghiệm "')
cl0rkster
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.