Wie kann eine Abfrage mit einer TOP 10 unendlich länger dauern als die gleiche Abfrage ohne die TOP 10?

9

Ich habe eine sehr einfache Situation:

Ich habe eine Tabellenwertfunktion namens FullTextPagina wie folgt definiert:

%Vor%

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:

  1. Ich habe den Volltextindex richtig eingerichtet
  2. Ich habe einen nicht gruppierten, nicht eindeutigen absteigenden Index für DtPagina
  3. Der Ausführungsplan ist hier: Ссылка

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

%Vor%     
André Pena 24.11.2011, 13:54
quelle

1 Antwort

5

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

Option 1

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.

Option 2

  1. Bewerten Sie das Volltextprädikat
  2. Abrufen der DtPagina -Spaltenwerte für alle übereinstimmenden Zeilen
  3. Sortiere sie und hol dir die Top 10.

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

umzuschreiben

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.

    
Martin Smith 24.11.2011, 14:54
quelle