Плохо выполнять план запроса после добавления заказа по полному тексту содержит поиск
-
16-10-2019 - |
Вопрос
Следующий запрос оказывается вне моих способностей исправить - надеюсь, кто -то сможет помочь.
SELECT top 100 Id, Name, InsertDate
FROM Foo
WHERE CONTAINS(FooText, '"test*" and "hello*" and "goodbye*"')
ORDER BY InsertDate desc
Без предложения по заказу за заказ запрос работает нормально (<2 секунды). Но когда я добавляю заказ, производительность ужасна (> 2 минуты).
Проблема, кажется, неверный план запроса.
План запросов, который работает хорошо, заключается в следующем:
План запросов, который работает плохо, заключается в следующем:
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