У меня есть сохраненный proc, который ищет продукты (250 000 строк), используя полный текстовый индекс.Почему характеристики этих двух запросов настолько разные?
Сохраненная процедура proc принимает параметр, который является условием полного текстового поиска. Этот параметр может быть нулевым, поэтому я добавил нулевую проверку, и запрос неожиданно начал работать на порядки медленнее.
-- 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
Я должен признать, что я не очень хорошо знакомы с планами выполнения. Единственное очевидное отличие для меня в том, что соединения разные. Я бы попытался добавить подсказку, но не присоединился к моему запросу. Я не уверен, как это сделать.
Я также не совсем понимаю, почему используется индекс с именем IX_SectionID, поскольку он является индексом, который содержит только столбец SectionID и этот столбец нигде не используется.
Nice статьи - добавление 'ВАРИАНТ (RECOMPILE)' фактически решает проблему производительности на 2 запроса (однако другая проблема в том, что 'СОДЕРЖИТ()' прибавки ошибка, когда параметр равен NULL, но это еще одна проблема). –