exécution plan de requête Badly après avoir ajouté ORDER BY au texte intégral CONTIENT recherche
-
16-10-2019 - |
Question
La requête suivante se révèle au-delà de mes capacités à fixer -. L'espoir que quelqu'un peut aider
SELECT top 100 Id, Name, InsertDate
FROM Foo
WHERE CONTAINS(FooText, '"test*" and "hello*" and "goodbye*"')
ORDER BY InsertDate desc
Sans la clause ORDER BY, la requête effectue fines (<2 secondes). Mais quand j'ajoute ORDER BY, la performance est terrible (> 2 minutes).
Le problème semble être un plan de requête incorrect.
Le plan de requête qui exécute est bien ceci:
Le plan de requête qui est mal ce exécute:
IX_Foo_InsertDate est défini comme: CREATE INDEX CLUSTERED [IX_Foo_InsertDate] ON [Foo] ([InsertDate] DESC )
Quelle est l'origine du changement dans les plans de requête? Comment puis-je résoudre ce problème?
La solution
L'optimiseur choisit les différents plan parce qu'il pense l'avantage d'avoir la InsertDate
prétriés (en utilisant IX_Foo_InsertDate
) l'emporte sur le coût une fois que vous ajoutez la clause order by
.
L'optimiseur ne peut pas être parfait, il peut choisir un chemin plus lent, même si les statistiques sont exactes - mais il va certainement faire de mauvais choix si les statistiques ne sont pas exactes - sont AUTO_CREATE_STATISTICS et AUTO_UPDATE_STATISTICS sur
Si nécessaire, vous pourriez être en mesure de « truc » l'optimiseur comme ceci:
SELECT top 100 Id, Name, InsertDate
FROM Foo
WHERE CONTAINS(FooText, '"test*" and "hello*" and "goodbye*"')
ORDER BY some_function_of(InsertDate) desc
où some_function_of(InsertDate)
a le même ordre que InsertDate