Проблема, которую вы получаете, заключается в том, что SQL Server точно не определяет, сколько строк будет соответствовать предикату.
Ваш запрос делает SELECT TOP 10 Id, DtPagina ... ORDER BY DtPagina DESC
.Есть несколько вариантов того, как это можно сделать
Опция 1
Он может просто сканировать индекс DtPagina DESC
по порядку и посмотреть, соответствует ли каждая строка полнотекстовому предикату, а затем выйтикогда найдены первые 10 в порядке индекса.
Опция 2
- Оценка полнотекстового предиката
- Получение значений столбца
DtPagina
для всех соответствующихСтроки - Сортируйте их и получите верхние 10.
При оценке первого варианта нижний план показывает, что он должен отсканировать около 600 строк, чтобы получить 10 соответствующихв состоянии выйти.Это огромная недооценка, так как на самом деле ни одна строка не соответствует предикату, и это необходимо сделать для целых 1 186 533 строк.
При оценке второго варианта из верхнего плана видно, что он предполагает наличие13,846.2 совпадающих строк, которые будут возвращены из запроса полнотекстового индекса и должны быть объединены и отсортированы.Это большая переоценка, поскольку фактическая цифра равна нулю.
Таким образом, эти неправильные оценки приводят к неправильному выбору первого варианта.
Я не уверен, что можно сделать, чтобы улучшитьточность статистики полнотекстового индексирования.Может быть, попробуйте переписать запрос, используя containstable
Редактировать: Это немного хак, но вполне может сработать.Что если вы попробуете
declare @term nvarchar(4000)= N'"DIEGO NUNES J COMBINADO"'
declare @num int = 10
SELECT TOP (@num) Id, DtPagina
FROM FullTextPagina(@term)
ORDER BY DtPagina DESC
Тогда он примет TOP 100
, что вполне может оказаться достаточным, чтобы склонить его к выбору другого более эффективного плана.