Optimierung der SQL Server-Abfrage - Unerwartete Langsamkeit in einer einfachen Abfrage

9
  

Mögliche Erklärung ist hier im Kommentar

In SQL Server 2014 Enterprise Edition (64-Bit) - Ich versuche, von einer Ansicht zu lesen. Eine Standardabfrage enthält nur eine ORDER BY und OFFSET-FETCH -Klausel wie diese.

Ansatz 1

%Vor%

Diese ziemlich einfache Abfrage führt jedoch fast 9 mal langsamer (bemerkbar beim Überspringen einer großen Anzahl von Zeilen wie 150k) als die folgende Abfrage, die das gleiche Ergebnis liefert.

In diesem Fall lese ich zuerst den Primärschlüssel und dann diesen als Parameter für WHERE...IN function

Ansatz 2

%Vor%

Bench-marking diese beiden zeigt diesen Unterschied

%Vor%

Ich habe Indizes für den Primärschlüssel, PubilshDate , und ihre Fragmentierung ist sehr gering. Ich habe auch versucht, ähnliche Abfragen für die Datenbanktabelle auszuführen, aber in jedem Fall führt der zweite Ansatz zu großen Leistungssteigerungen. Ich habe dies auch auf SQL Server 2012 getestet.

Kann jemand erklären, was vor sich geht?

Schema

Ansatz 1: Ausführungsplan

Ansatz 2: Ausführungsplan (linker Teil)

Ansatz 2: Ausführungsplan (rechter Teil)

    
undefined 24.08.2016, 10:59
quelle

2 Antworten

1

Für unterschiedlich strukturierte Abfragen mit gleichem Ergebnissatz erhalten Sie unterschiedliche Abfragepläne mit unterschiedlichen Ansatz- und Abfragekosten. Dies ist bei einer Vielzahl von SQL-RDBMS-Implementierungen üblich.

Grundsätzlich in Beispiel oben bei der Auswahl kleiner Teil der Daten aus großen Tabelle ist gut Ansatz zuerst zu reduzieren und zu minimieren Anzahl der Zeilen im Ergebnis und wählen Sie dann vollständige Zeilen mit allen Spalten genau wie Ihre 2. Abfrage.

Ein anderer Ansatz besteht darin, einen exakten korrekten Index zum Reduzieren des Ergebnissatzes im ersten Schritt zu erstellen. In der obigen Abfrage könnten wahrscheinlich Spalten aus der ORDER BY-Klausel in derselben Spalte und Sortierreihenfolge eine Lösung sein.

(Sie haben die in den Abfrageplänen angegebene Struktur der Indizes nicht gesendet. Ich kann mir einfach vorstellen, was sich hinter ihren Namen verbirgt.)

Sie können auch den SQL-Index-Hinweis verwenden, um den SQL-Optimierer an einen bestimmten Index zu verweisen, den Sie für den Fall, dass der SQL-Optimierer den Auftrag nicht ausführt, als den besten für die Aufgabe halten.

    
Alesj 29.11.2016 09:56
quelle
0

Wenn Sie eine Abfrage ausführen, sucht die Engine nach einem Index, der verwendet werden kann, um die beste Leistung zu erzielen. Ihr Ansatz 1 verwendet einen Index, der nicht alle Spalten in der SELECT-Anweisung enthält, dies verursacht die Schlüsselsuche im Abfrageplan. Dies führt meiner Erfahrung nach immer zu einer geringeren Leistung, die nur indizierte Spalten in Ihrer SELECT-Anweisung verwendet. p>

Sie können den Unterschied sehen, wenn Sie einen Index für AgeInHours, RankingPoint, PublishDate erstellen und alle Spalten einschließen (nur für Testzwecke empfohlen).

Für Ihren zweiten Ansatz können Sie sogar eine bessere Leistung erzielen, wenn Sie ein CTE verwenden und dann einen JOIN anstelle von WHERE mit IN oder eine temporäre Tabelle mit Index erstellen, wenn Sie Millionen von Zeilen haben.

    
Andres GR 25.08.2016 23:29
quelle