Schlechtem Abfrageberplan nach dem Hinzufügen von Bestellung zum Volltext enthält die Suche

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

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:enter image description here

Der Abfrageplan, der schlecht abschneidet, ist Folgendes:enter image description here

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?

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit dba.stackexchange
scroll top