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");
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");
Câu trả lời:
Thứ hai (giả sử bạn có nghĩa CONTAINS
và 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 CONTAINS
truy vấn nên là:
SELECT * FROM table WHERE CONTAINS(Column, 'test');
CONTAINS
? Cái gì của nó Hình thức ban đầu của câu hỏi Column CONTAIN("%test%",Column)>0
không có giá trị. Nó vẫn chưa hoàn toàn đúng.
Đã 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 LIKE
từ khóa cho thấy quét chỉ mục cụm.
Họ CONTAINS
cũ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.
LIKE
truy 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 ".
LIKE
.
Tôi nghĩ rằng CONTAINS
mất nhiều thời gian hơn và được sử dụng Merge
vì 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 để CONTAINS
tìm kiếm chỉ mục toàn văn cho adventure
và hơn nó tìm kiếm works.com
và hợp nhất các kết quả.
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 ".
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ù.