SQL Server 2008: Mit gefilterten Indexen die Performance verbessern

Gefilterte Indexe sind eine praktische Funktion von SQL Server 2008, mit der man Indexe für Teilmengen von Daten definieren kann. ZDNet erklärt ihre Vor- und Nachteile und zeigt, wie man einen gefilterten Index erstellt.

Ein gefilterter Index ist ein nicht-geclusterter Index, der für eine genau definierte Datenteilmenge in einem SQL-Server-Tabellenobjekt erstellt wird. "Genau definiert" bedeutet in diesem Fall diejenigen Datenteilmengen, die ausschließlich zur Erfüllung der Abfragekriterien verwendet werden. Wenn beispielsweise ein Feld in einer Tabelle enthalten ist, die vorwiegend NULL-Werte aufweist, könnte das Erstellen eines gefilterten Index von Vorteil sein, der ausschließlich die Werte enthält, die NICHT NULL sind. Allerdings lassen sich keine geclusterten Indexe mit einem Filter definieren.

Warum ein gefilterter Index?

Gefilterte Indexe können Performancevorteile in Szenarien bieten, in denen ein Großteil der Abfragen in einer Tabelle eine Filterung für eine bestimmte Datenteilmenge durchführen. Diese Indexe sind meist viel kleiner als ein Index für das gesamte Feld, so dass weniger Indexspeicher erforderlich ist. Außerdem erfordern gefilterte Indexe in der Regel weniger Administrationsaufwand. Da der gefilterte Index kleiner ist, betreffen an den Daten vorgenommene Bearbeitungsvorgänge kleinere Teilmengen des Index und erfordern somit weniger Datenbank-I/O-Operationen.

Erstellen eines gefilterten Index

Im Folgenden wird dargestellt, wie man einen gefilterten Index erstellt und wie sich die durch seine Nutzung erreichten Performance-Vorteile auswirken. Dazu muss man als Erstes das folgende Script ausführen, um die SalesHistory-Tabelle zu erstellen und zu bevölkern.


Mit einigen Einträgen in der SalesHistory-Tabelle aktualisiert man dann das SaleDate auf NULL, und zwar für 6 von 7 Einträgen in der Tabelle. So entsteht eine recht spärliche Verteilung von Werten im SaleDate-Feld. Nach der Aktualisierung soll ein normaler nicht-geclusterter Index im SaleDate-Feld erstellt werden.


Dann den folgenden Befehl ausführen, um eine IO-Statistik hierfür auszuführen. So kann man die IO-Werte für jeden ausgeführten TSQL-Befehl anzeigen.


Die folgende Abfrage gibt alle Zeilen aus SalesHistory-Tabelle aus, in denen SaleDate einen Wert enthält. Diese Abfrage verwendet den vorher erstellten Index idx_SalesHistory_SaleDate sowie eine Index-Seek-Operation zur Ausgabe von 2142 Zeilen. Diese Abfrage erfordert 8 logische Lesevorgänge aus der Datenbank, um die erforderlichen Zeilen auszugeben.

Dabei ist zu beachten, dass die in diesem Artikel verwendeten Abfragen nur das SaleDate-Feld im Resultset ausgeben. Das liegt daran, dass ein Ausschließen von Feldern oder Hinzufügen zusätzlicher Felder in der SELECT-Liste den Ausführungsplan verändert. Für den Zweck dieses Artikels soll nur das Feld ausgegeben werden, für das Kriterien festgelegt werden.


Die indexbezogenen Daten für den idx_SalesHistory_SaleDate-Index können durch Abfragen einiger System-Views angezeigt werden.


Die folgende Abfrage ähnelt der oben genannten Abfrage, filtert jedoch die Zeilen, in denen SaleDate einen NULL-Wert enthält. Diese Abfrage führt außerdem einen Index-Seek für den oben erstellten Index durch, benötigt dabei jedoch 31 logische Lesevorgänge aus der Datenbank, da die Abfrage 12858 Einträge ausgibt.


Fanden Sie diesen Artikel nützlich?
1 von 3 Lesern fanden diesen Artikel nützlich.

Aktuelle Job-Angebote

Lesermeinungen zum Artikel

 
von Klaus Oberdalhoff
am 15. Oktober 2009, 18:25 Uhr
Gefilterte Indexe
Die gefilterten Indexe sind auch sehr prktisch, wenn es darum geht, den in Access möglichen eindeutigen Index mit erlaubten mehrfachen NULL-Werten zu emulieren.

MS schrieb mir dazu auf meinen Wunsch:

Missing a possibillity (like in MSAccess) to have an unique Index which allows (ignores) multiple NULL values.

In SQL Server 2008 you can work around this by creating a unique filterered index.
Example:
CREATE TABLE dbo.TestTable (
Col1 INT NULL
);
CREATE UNIQUE INDEX Col1Index ON dbo.TestTable (Col1) WHERE Col1 IS NOT NULL;
GO
INSERT dbo.TestTable (Col1) VALUES (1); -- Succeeds
INSERT dbo.TestTable (Col1) VALUES (1); -- Fails
INSERT dbo.TestTable (Col1) VALUES (NULL); -- Succeeds
INSERT dbo.TestTable (Col1) VALUES (NULL); -- Succeeds

For SQL Server 2005 you can get the same behaviour with an indexed view.

mit freundlichen Grüßen aus Nürnberg
Klaus Oberdalhoff

ZDNet.de Live

Chart ...

Chart Show: "wenn ich Candle in the Wind" höre, denke ich sofort an Lady Di" ... ach? Nein! Wie das nur?!? #gigafail

10.02.12, 23:39 von coke4all
Chrom ...

Chrome for Android -- best mobile browser t.co/...

10.02.12, 22:35 von ZDNet
UL, ...

UL, Drexel University partner to establish research hub t.co/...

10.02.12, 22:15 von ZDNet
wow! ...

wow! ein wirklich schickes Android, das nicht Tablet-Größe hat: t.co/... ... leider nur mäßige technische Daten.

10.02.12, 21:25 von coke4all
Googl ...

Google arbeitet angeblich an Home Entertainment System mit Cloudanbindung t.co/...

10.02.12, 21:10 von zdnet_de
Why ...

Why are young Japanese men losing interest in sex? t.co/...

10.02.12, 20:55 von ZDNet
What ...

What AMD's new roadmap means for users t.co/...

10.02.12, 20:40 von ZDNet
Manch ...

Manchester City is expanding its online reach to Japan t.co/...

10.02.12, 20:35 von ZDNet
Fours ...

Foursquare evolving into one-stop shop with NFC support t.co/...

10.02.12, 20:35 von ZDNet
Websi ...

Website der Gelben Seiten baut Bewertungsfunktionen aus t.co/...

10.02.12, 20:30 von zdnet_de
Motor ...

Motorola: Android-Updates verzögern sich wegen der Hardware-Vielfalt t.co/...

10.02.12, 20:00 von zdnet_de
Aktie ...

Aktienkurse dort wo man sie am liebsten sieht: auf dem Mülleimer! t.co/...

10.02.12, 19:50 von coke4all
Faceb ...

Facebook details Zuckerberg's $500,000 salary, 45% bonus t.co/...

10.02.12, 19:45 von ZDNet
New ...

New Microsoft Office University product comes with tougher verification rules t.co/...

10.02.12, 19:35 von ZDNet
#Prad ...

#Prada Phone by #LG 3.0 ausgepackt und ausprobiert - #smartphone #android t.co/...

10.02.12, 19:30 von cnet_de
Schon ...

Schon im Test: Prada Phone by LG 3.0 mit Android und superhellem Display t.co/...

10.02.12, 19:30 von cnet_de
Beta ...

Beta von Chrome 18 erweitert Hardwarebeschleunigung t.co/...

10.02.12, 19:30 von zdnet_de
Sage ...

Sage helps chocolate business manage seasonality t.co/...

10.02.12, 19:20 von ZDNet
Colum ...

Columbia University excludes Google Docs t.co/...

10.02.12, 19:20 von ZDNet