Ich habe eine sehr einfache Situation:
Ich habe eine Tabellenwertfunktion namens FullTextPagina
wie folgt definiert:
Und dann habe ich zwei Fragen:
%Vor% Sie sind identisch mit Ausnahme der Tatsache, dass die zweite eine TOP 10
-Anweisung enthält. Und sie geben nichts zurück. 0 Zeilen.
Der erste wird sofort ausgeführt. Die Sekunden benötigen 1: 20m.
Warum?
PS:
DtPagina
BEARBEITEN
Als Antwort auf @MartinSmith beträgt die "Anzahl der Ausführungen" für die Table-Valued-Funktionen kurioserweise 1,18 Millionen für den Fall TOP 10 und 1 für den anderen Fall
BEARBEITEN 2
Ausführungsplan XML Ссылка
EDIT 3
Das Hinzufügen von Optionen (Neukompilieren) oder das Entfernen der Parameter hat keinen Einfluss auf das Ergebnis
%Vor%EDIT 4
Vollständiger Code für FullTextPagina
Das Problem, das Sie bekommen, ist, weil SQL Server nicht genau abschätzen kann, wie viele Zeilen dem Prädikat entsprechen.
Ihre Abfrage verarbeitet SELECT TOP 10 Id, DtPagina ... ORDER BY DtPagina DESC
. Es gibt ein paar Möglichkeiten, wie es dies tun könnte
Es könnte einfach den DtPagina DESC
Index in der Reihenfolge scannen und sehen, ob jede Zeile mit dem Volltextprädikat übereinstimmt, und dann beenden, wenn die ersten 10 in der Indexreihenfolge gefunden wurden.
DtPagina
-Spaltenwerte für alle übereinstimmenden Zeilen Beim Berechnen der ersten Option zeigt der untere Plan an, dass erwartet wird, dass ungefähr 600 Zeilen gescannt werden müssen, bevor 10 Übereinstimmungen gefunden werden und beendet werden kann. Dies ist eine massive Unterschätzung, da tatsächlich keine Zeilen mit dem Prädikat übereinstimmen und dies für die gesamten 1.186.533 Zeilen erforderlich ist.
Wenn die zweite Option aus dem oberen Plan berechnet wird, wird angenommen, dass davon ausgegangen wird, dass 13.846.2 übereinstimmende Zeilen vorhanden sind, die von der Volltextindexabfrage zurückgebracht werden und zusammengefügt und sortiert werden müssen. Dies ist eine große Überschätzung, da die tatsächliche Zahl Null ist.
Diese falschen Schätzungen führen also dazu, dass die erste Option fälschlicherweise bevorzugt wird.
Ich bin nicht sicher, was getan werden kann, um die Genauigkeit der Volltext-Indexierungsstatistiken zu verbessern. Versuchen Sie vielleicht, die Abfrage mit containstable
Edit: Dies ist ein bisschen wie ein Hack, aber es könnte gut funktionieren. Was ist, wenn Sie
versuchen? %Vor% Dann wird angenommen, dass TOP 100
ausreichend ist, um es in die Auswahl des anderen effizienteren Plans zu kippen.
Tags und Links sql sql-server sql-server-2008 full-text-search user-defined-functions