Ich versuche, die Leistung einer Abfrage in SQL Server 2014 Enterprise zu optimieren.
Ich habe den eigentlichen Abfrageplan im SQL Sentry Plan Explorer geöffnet und kann auf einem Knoten sehen, dass er ein Suchprädikat und auch ein Prädikat hat
Was ist der Unterschied zwischen Suchprädikat und Prädikat ?
Hinweis: Ich kann sehen, dass es mit diesem Knoten viele Probleme gibt (z. B. die Zeilen "Geschätzt" und "Ist", "Rest-E / A"), aber die Frage bezieht sich nicht auf irgendetwas davon.
The Seek Predicate can be used to find the start of the RangeScan and then when to stop, while the Predicate is the "check" that is applied to every row in the Range.
Antworten:
Lassen Sie uns eine Million Zeilen zusammen mit einigen Spalten in eine temporäre Tabelle werfen:
Hier habe ich einen Clustered-Index (standardmäßig) für die
PK
Spalte. Es gibt einen nicht gruppierten IndexCOL1
, der eine Schlüsselspalte vonCOL1
und enthältCOL2
.Betrachten Sie die folgende Abfrage:
Hier benutze ich nicht,
BETWEEN
weil Aaron Bertrand um diese Frage herumhängt.Wie sollte SQL Server Optimizer diese Abfrage? Nun, ich weiß, dass der Filter
PK
die Ergebnismenge auf fünf Zeilen reduziert. SQL Server kann den Clustered-Index verwenden, um zu diesen fünf Zeilen zu springen, anstatt alle Millionen Zeilen in der Tabelle zu lesen. Der Clustered-Index enthält jedoch nur die PK-Spalte als Schlüsselspalte. Sobald die Zeile in den Speicher eingelesen ist, müssen wir den Filter anwendenCOL2
. HierPK
ist ein Suchprädikat undCOL2
ist ein Prädikat.SQL Server findet fünf Zeilen unter Verwendung des Suchprädikats und reduziert diese fünf Zeilen mit dem normalen Prädikat auf eine Zeile.
Wenn ich den Clustered-Index anders definiere:
Und führen Sie die gleiche Abfrage aus, ich erhalte unterschiedliche Ergebnisse:
In diesem Fall kann SQL Server beide Spalten in der
WHERE
Klausel verwenden. Mit den Schlüsselspalten wird genau eine Zeile aus der Tabelle gelesen.Betrachten Sie für ein weiteres Beispiel diese Abfrage:
Der IX_174860_IX-Index ist ein Deckungsindex, da er alle für die Abfrage erforderlichen Spalten enthält. Es ist jedoch nur
COL1
eine Schlüsselspalte. SQL Server kann mit dieser Spalte suchen, um die 1000 Zeilen mit einem übereinstimmendenCOL1
Wert zu finden. Diese Zeilen in derCOL2
Spalte können weiter gefiltert werden , um die endgültige Ergebnismenge auf 0 Zeilen zu reduzieren.quelle