Gefilterte Indizes zur Abfrageoptimierung

Mit dem SQL Server 2008 führte Microsoft ein neues Feature ein: Filtered Index. Mit einem gefilterten Index ist es möglich, lediglich eine Teilmenge der zu indizierenden Tabelle einzubeziehen. Gerade bei oft gestellten, nach Teilbereichen abgegrenzten Anfragen ist es so möglich, eine entsprechende Optimierung herbeizuführen. Ich habe dies anhand eines kleinen Beispiels vorbereitet:

Wir nehmen uns eine Tabelle namens IndexDemo mit den Spalten ID, Name, Vorname und Geschlecht:
Create Table IndexDemo
(    ID nvarchar(38),
Name nvarchar(256),
Vorname nvarchar(256),
Geschlecht char(1),
Constraint PK_IndexDemo Primary Key(ID)
)

Diese Tabelle habe ich für meine Demo mit 80 Datensätzen gefüllt. Wir stellen uns vor, das wir regelmäßig die Namen aller Personen erheben müssen, die männlichen Geschlechts sind und formulieren folgende Abfrage:
Select Name from IndexDemo where Geschlecht = ‚M‘

Ohne Abfrageoptimierung erhalte ich via Execution Plan die folgenden Lastkennzahlen:
CPU COST: 0,000245
I/O COST: 0,0038657

Zum Vergleich legen wir jetzt einen gefilterten Index über die Spalte Name, mit der Einschränkung auf das männliche Geschlecht:
Create Nonclustered Index IX_IndexDemo_M
On IndexDemo(Name)
Where Geschlecht = ‚M‘

Eine erneute Abfrage ergibt via Execution Plan die folgenden Lastkennzahlen:
CPU COST: 0,000201
I/O COST: 0,003125

Wie man deutlich erkennt, konnte sowohl die CPU-Last als auch die I/O-Last erkennbar gesenkt werden. Wendet man gefilterte Indizes geeignet auf große Datenmengen an, lassen sich durchaus beachtliche Performancesteigerungen erreichen.

Weitere Informationen zu diesem Feature sowie der Verwendung finden sich in den Filtered Index Design Guidelines