Почему производительность этих двух запросов настолько разная?

У меня есть хранимая процедура, которая ищет продукты (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 Execution plant #1

Запрос №2 Execution plant #2

Должен признаться, что я не очень хорошо знаком с планами выполнения. Единственное очевидное различие для меня - это то, что джоины разные. Я бы попробовал добавить подсказку, но, не имея join в моем запросе, я не уверен, как это сделать.

Я также не совсем понимаю, почему используется индекс IX_SectionID, поскольку это индекс, который содержит только столбец SectionID, а этот столбец нигде не используется.

11
задан Xavier Poinas 24 January 2012 в 19:04
поделиться