Die SQL Server Datenbank kann where
-Bedingungen (Prädikate) auf drei verschiedene Arten anwenden:
- Zugriffsprädikat („Seek Predicates“)
Die Zugriffsprädikate bestimmen den Anfangs- und End-Punkt beim Verfolgen der Blattknote-Liste.
- Index-Filterprädikat („Predicate“ oder „where“ bei Indexoperationen)
Index-Filterprädikate werden während des Durchsuchens der Blattknoten-Liste angewandt. Sie haben aber keinen Einfluss auf die Start- und Stopp-Bedingungen und grenzen den durchsuchten Indexbereich nicht ein.
- Filterprädikat auf Tabellenebene („Predicate“ oder „where“)
Prädikate, die sich auf Spalten beziehen, die nicht im Index sind, können erst auf Tabellenebene berücksichtigt werden. Dafür muss zuerst ein Tabellenzugriff durchgeführt werden.
Das folgende Beispiel zeigt Zugriffs- und Index-Filterprädikate.
CREATE TABLE scale_data (
section NUMERIC NOT NULL,
id1 NUMERIC NOT NULL,
id2 NUMERIC NOT NULL
)
CREATE INDEX scale_slow ON scale_data(section, id1, id2)
Die Beispielabfrage sucht mit den Spalten SECTION
und ID2
:
SELECT count(*)
FROM scale_data
WHERE section = @sec
AND id2 = @id2
In grafischen Ausführungsplänen
Der grafische Ausführungsplan versteckt die Prädikatsinformation im Tool-Tip:Er wird nur angezeigt, wenn die Maus über dem Index Seek
Icon ist ‒ das ist auch auf dieser Webseite so.
Zugriffsprädikate werden in SQL Server-Ausführungsplänen als „Seek Predicates“ bezeichnet. Sie entsprechen den „access predicates“ der Oracle Datenbank. Die Seek Predicates grenzen also den durchsuchten Indexbereich ein. Die Filterprädikate werden im grafischen Ausführungsplan einfach als „Predicates“ bezeichnet.
Hinweis in eigener Sache
Ich biete SQL Schulungen, Optimierung und Beratung an. Auch der Kauf meines Buches „SQL Performance Explained“ (ab €9,95) unterstützt meine Arbeit an dieser Webseite.
In tabellarischen Ausführungsplänen
In tabellarischen Ausführungsplänen scheint die Prädikatsinformation direkt bei den Operationen auf und kann einfach mittels Copy & Paste kopiert werden.
DECLARE @sec numeric
DECLARE @id2 numeric
SET STATISTICS PROFILE ON
SELECT count(*)
FROM scale_data
WHERE section = @sec
AND id2 = @id2
SET STATISTICS PROFILE OFF
Der Ausführungsplan wird als zweites Ergebnis angezeigt. Die Spalte StmtText
zeigt die Prädikatsinformation an – im Folgenden zur besseren Lesbarkeit formatiert:
|--Compute Scalar(DEFINE:([Expr1004]=CONVERT_IMPLICIT(...))
|--Stream Aggregate(DEFINE:([Expr1008]=Count(*)))
|--Index Seek(OBJECT:([scale_data].[scale_slow]),
SEEK: ([scale_data].[section]=[@sec])
ORDERED FORWARD
WHERE:([scale_data].[id2]=[@id2]))
Die Zugriffsprädikate werden hier als SEEK
bezeichnet, die Filterprädikate mit WHERE
.
Tipp
Der Abschnitt „Größer, Kleiner und
BETWEEN
“ erklärt den Unterschied zwischen Zugriffs- und Index-Filterprädikaten anhand eines Beispieles.Kapitel 3, „Performance und Skalierbarkeit“, zeigt den Performance-Unterschied zwischen Zugriffs- und Index-Filterprädikaten.