Плохо выполнять план запроса после добавления заказа по полному тексту содержит поиск

dba.stackexchange https://dba.stackexchange.com/questions/2966

Вопрос

Следующий запрос оказывается вне моих способностей исправить - надеюсь, кто -то сможет помочь.

SELECT top 100 Id, Name, InsertDate
FROM Foo
WHERE CONTAINS(FooText, '"test*" and "hello*" and "goodbye*"')
ORDER BY InsertDate desc

Без предложения по заказу за заказ запрос работает нормально (<2 секунды). Но когда я добавляю заказ, производительность ужасна (> 2 минуты).

Проблема, кажется, неверный план запроса.

План запросов, который работает хорошо, заключается в следующем:enter image description here

План запросов, который работает плохо, заключается в следующем:enter image description here

Ix_foo_insertdate определяется как: Создайте кластерный индекс Ix_foo_insertdate НА Foo] ([InsertDate Посяк )

Что вызывает изменение планов запросов? Как я могу это исправить?

Это было полезно?

Решение

Оптимизатор выбирает различный план, потому что он считает выгоду от предварительного сортированного InsertDate (с использованием IX_Foo_InsertDate) перевешивает стоимость, как только вы добавите order by пункт.

Оптимизатор не может быть идеальным, он может выбрать более медленный путь, даже если статистика является точной - но он, безусловно, сделает плохой выбор, если статистика не является точной - Auto_create_statistics и Auto_update_statistics?

При необходимости вы сможете «обмануть» оптимизатор, как это:

SELECT top 100 Id, Name, InsertDate
FROM Foo
WHERE CONTAINS(FooText, '"test*" and "hello*" and "goodbye*"')
ORDER BY some_function_of(InsertDate) desc

куда some_function_of(InsertDate) имеет тот же заказ, что и InsertDate

Лицензировано под: CC-BY-SA с атрибуция
Не связан с dba.stackexchange
scroll top