von Markus Winand.

SQL Server Zugriffs- und Filterprädikate unterscheiden


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 Blatt­kno­ten-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 Pre­di­cates“ bezeichnet. Sie entsprechen den „access predicates“ der Oracle Datenbank. Die Seek Predicates grenzen also den durchsuchten Index­be­reich ein. Die Filterprädikate werden im grafischen Ausführungs­plan 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

Vorherige SeiteNächste Seite

Du kannst nicht alles an einem Tag lernen. Abonniere den Newsletter via E-Mail, Twitter oder RSS um sukzessive aufzuholen. Und sieh dir auch modern-sql.com an.

Über den Autor

Foto von Markus Winand

Markus Winand gibt auf modern-sql.com Einblick in SQL und zeigt, wie es von verschiedenen Systemen unterstützt wird. Zuvor machte er use-the-index-luke.com, was er noch immer wartet. Markus kann als Trainer, Sprecher und Berater auf winand.at engagiert werden.

Sein Buch kaufen

Titelbild von „SQL Performance Explained“: Eichhörnchen läuft durchs Grass

Die Essenz: SQL-Tuning auf 200 Seiten

Jetzt Kaufen
(Taschenbuch und/oder PDF)

Sein Training

Markus verwandelt veraltetes SQL-92-Wissen in solides und zeitgemäßes SQL-Know-how

Erfahren Sie mehr»

Mit Markus Winand verbinden

Markus Winand auf LinkedInMarkus Winand auf XINGMarkus Winand auf Twitter
„Use The Index, Luke!“ von Markus Winand ist unter einer Creative Commons Attribution-Noncommercial-No Derivative Works 3.0 Unported License lizenziert.
Impressum | Kontakt | KEINE GEWÄHR | Handelsmarken | Datenschutz und DSGVO | CC-BY-NC-ND 3.0 Lizenz