Schlechtem Abfrageberplan nach dem Hinzufügen von Bestellung zum Volltext enthält die Suche
-
16-10-2019 - |
Frage
Die folgende Abfrage beweist über meine Fähigkeiten, um zu reparieren - hoffe, jemand kann helfen.
SELECT top 100 Id, Name, InsertDate
FROM Foo
WHERE CONTAINS(FooText, '"test*" and "hello*" and "goodbye*"')
ORDER BY InsertDate desc
Ohne die Bestellung durch Klausel funktioniert die Abfrage gut (<2 Sekunden). Aber wenn ich die Bestellung nach hinzufüge, ist die Leistung schrecklich (> 2 Minuten).
Das Problem scheint ein falscher Abfrageplan zu sein.
Der Abfrageplan, der gut abschneidet, lautet:
Der Abfrageplan, der schlecht abschneidet, ist Folgendes:
Ix_foo_insertdate ist definiert als: Erstellen Sie Clustered Index Ix_foo_insertdate AN Foo] ([InsertDate Vor )
Was verursacht die Änderung der Abfragepläne? Wie kann ich es reparieren?
Lösung
Der Optimierer wählt den verschiedenen Plan aus InsertDate
(Verwendung IX_Foo_InsertDate
) Überwiegt die Kosten, sobald Sie die hinzugefügt haben order by
Klausel.
Der Optimierer kann nicht perfekt sein, er kann einen langsameren Pfad wählen, selbst wenn die Statistiken korrekt sind - aber er wird sicherlich schlechte Entscheidungen treffen, wenn die Statistiken nicht korrekt sind - sind auto_create_statistics und auto_update_statistics auf?
Bei Bedarf können Sie den Optimierer wie diesen möglicherweise "betrügen":
SELECT top 100 Id, Name, InsertDate
FROM Foo
WHERE CONTAINS(FooText, '"test*" and "hello*" and "goodbye*"')
ORDER BY some_function_of(InsertDate) desc
wo some_function_of(InsertDate)
hat die gleiche Reihenfolge wie InsertDate