Tôi có một proc được lưu trữ để tìm kiếm các sản phẩm (250.000 hàng) bằng cách sử dụng chỉ mục văn bản đầy đủ.Tại sao màn trình diễn của 2 truy vấn này lại khác biệt?
proc được lưu trữ có tham số là điều kiện tìm kiếm toàn văn bản. Tham số này có thể là null, vì vậy tôi đã thêm một kiểm tra rỗng và truy vấn đột nhiên bắt đầu chạy các đơn đặt hàng có cường độ chậm hơn.
-- This is normally a parameter of my stored proc
DECLARE @Filter VARCHAR(100)
SET @Filter = 'FORMSOF(INFLECTIONAL, robe)'
-- #1 - Runs < 1 sec
SELECT TOP 100 ID FROM dbo.Products
WHERE CONTAINS(Name, @Filter)
-- #2 - Runs in 18 secs
SELECT TOP 100 ID FROM dbo.Products
WHERE @Filter IS NULL OR CONTAINS(Name, @Filter)
Sau đây là các kế hoạch thực hiện:
Query # 1
Query # 2
Tôi phải thừa nhận rằng tôi không phải là rất quen thuộc với kế hoạch thực hiện. Sự khác biệt rõ ràng duy nhất với tôi là sự gia nhập là khác nhau. Tôi sẽ thử thêm một gợi ý nhưng không tham gia vào truy vấn của tôi Tôi không chắc chắn làm thế nào để làm điều đó.
Tôi cũng không hiểu tại sao chỉ mục được gọi là IX_SectionID được sử dụng, vì đó là chỉ mục chỉ chứa cột SectionID và cột đó không được sử dụng ở bất kỳ đâu.
Nice bài viết - thêm 'OPTION (biên dịch lại) 'thực sự giải quyết vấn đề hiệu suất trên các truy vấn thứ 2 (tuy nhiên một vấn đề khác là' CHỨA()' tăng lương một lỗi khi tham số là NULL, nhưng đó là một vấn đề khác). –