Редактировать
С http://technet.microsoft.com/en-us/library/cc721269.aspx#_Toc202506240
Самое главное, что
правильный тип соединения выбран для
полнотекстовый запрос. мощность
оценка на FulltextMatch STVF
очень важно для правильного плана.
Итак, первое, что нужно проверить, это
FulltextMatch оценка мощности.
Это приблизительное количество хитов
в указателе для полнотекстового поиска
строка. Например, в запросе в
Рисунок 3 это должно быть близко к
количество документов, содержащих
термин «слово». В большинстве случаев это должно
быть очень точным, но если оценка
был далеко, вы могли
генерировать плохие планы. Оценка для
отдельные термины, как правило, очень хорошо,
но оценивая несколько терминов, таких как
фразы или AND-запросы более сложны
поскольку невозможно узнать что
пересечение терминов в индексе
будет основываться на частоте
условия в индексе. Если мощность
оценка хорошая, плохой план
вероятно вызвано запросом
оптимизатор стоимости модели. Единственный способ
исправить проблему плана - использовать запрос
намек на принудительное соединение
или оптимизировать для.
Таким образом, по информации, хранящейся в нем, он просто не может знать, могут ли два поисковых термина быть вместе достаточно независимыми или обычно встречаться вместе. Возможно, вам нужно иметь 2 отдельные процедуры: одну для запросов с одним словом, для которой вы позволяете оптимизатору выполнять свою работу, и одну для процедур из нескольких слов, для которых вы навязываете «достаточно хороший» план (sys.dm_fts_index_keywords может помочь, если вы не хотите один размер подходит для всего плана).
Примечание: вашей процедуре с одним словом, скорее всего, понадобится опция WITH RECOMPILE, рассматривающая этот фрагмент статьи.
В полнотекстовом поиске SQL Server 2008 у нас есть возможность изменить план, сгенерированный на основе оценки количества используемых поисковых терминов. Если план запроса фиксирован (как в параметризованном запросе внутри хранимой процедуры), этот шаг не выполняется. Поэтому скомпилированный план всегда обслуживает этот запрос, даже если этот план не идеален для данного поискового запроса.
Оригинальный ответ
Ваш новый план все еще выглядит довольно плохо. Похоже, что он возвращает только 1 строку из полнотекстовой части запроса, но сканирует все 770159 строк в таблице Product.
Как это работает?
CREATE TABLE #tempResults
(
ID int primary key,
Name varchar(200),
DateMadeNew datetime
)
INSERT INTO #tempResults
SELECT
ID, Name, DateMadeNew
FROM Product
WHERE contains(Name, '"White Dress"')
SELECT TOP 1
*
FROM #tempResults
ORDER BY DateMadeNew desc