exécution plan de requête Badly après avoir ajouté ORDER BY au texte intégral CONTIENT recherche

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

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: entrer image description ici

Le plan de requête qui est mal ce exécute: entrer image description ici

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?

Était-ce utile?

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

some_function_of(InsertDate) a le même ordre que InsertDate

Licencié sous: CC-BY-SA avec attribution
Non affilié à dba.stackexchange
scroll top