Gestern gab mir ein Kollege die Ausgabe 9/2005 vom SQL Server Magazine (ich stehe auf dem Umlauf). Er hatte sie in seinem Schrank entdeckt. Seitdem wir eine Clean-Desk-Philosophie haben, müssen wir alles in den Schrank räumen, wo er sie vergessen hat…

Dennoch bin ich dafür dankbar, das er die Ausgabe weitergegeben hat, denn sie enthält mehrere für mich wichtige Artikel. Eine ganz interessante Sache hätte ich in der Feature-Flut des SQL-Servers-2005 sonst glatt übersehen: Included-Columns.

Wer schon mal erlebt hat, wie man eine Abfrage durch Index-Covering beschleunigen kann, der wird meine Begeisterung teilen. Index-Covering beschreibt den selten auftretenden Fakt, dass in der Abfrage sowohl im WHERE- als auch im SELECT-Teil (und überhaupt im gesamten SELECT-Statement) ausschließelich Attribute zugegriffen werden, die in einem (zusammengesetzten) Index verwendet werden. In diesem Fall muss der SQL-Server gar nicht erst die Datenseiten der Tabelle lesen, es reicht den Index auszuwerten. Damit kann locker die Performance verdoppelt werden, meist noch mehr.

Für Non-Clustered-Indexes können am SQL Server 2005 zusätzlich zu den Attributen, die Bestandteil des Index sind, weitere rein beschreibende Attribute beigegeben werden. Deren Werte werden dann nicht im Index-Baum/-Pfad gespeichert, sondern nur in der Leaf-Page. Sie werden bei Index-Covering aber gezielt verwendet.

Risiken und Nebenwirkungen:

  • Speicherplatz
  • Performance bei ändernden Operationen
  • positiv: Umgehung der "900-byte maximum key column size limitation"

Heute habe ich bei awprofessional.com auch noch einen Artikel zu dem Thema entdeckt: SQL Server 2005: Two Little Known Features That Matter Big! Including Non-Key Columns in Non-Clustered Indexes. Dort stehen auch ein paar sehr gute Beispiele, ebenso in den Books-Online weshalb ich sie mir an dieser Stelle spare.