У меня есть хранимая процедура, которая ищет продукты (250 000 строк) с помощью полнотекстового индекса.
Хранимая процедура принимает параметр, который является условием полнотекстового поиска. Этот параметр может быть null, поэтому я добавил проверку на null, и запрос внезапно стал выполняться на порядки медленнее.
-- 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)
Вот планы выполнения:
Запрос #1
Запрос №2
Должен признаться, что я не очень хорошо знаком с планами выполнения. Единственное очевидное различие для меня - это то, что джоины разные. Я бы попробовал добавить подсказку, но, не имея join в моем запросе, я не уверен, как это сделать.
Я также не совсем понимаю, почему используется индекс IX_SectionID, поскольку это индекс, который содержит только столбец SectionID, а этот столбец нигде не используется.