Überlegen Sie, was ein Index in SQL ist - und Index ist wirklich ein Speicherblock, der auf andere Speicherblöcke zeigt (dh Zeiger auf Zeilen). Der Index ist in Seiten unterteilt, sodass Teile des Index je nach Verwendung aus dem Speicher geladen und entladen werden können.
Wenn Sie nach einer Reihe von Zeilen fragen, verwendet SQL den Index, um die Zeilen schneller zu finden als das Scannen von Tabellen (wobei jede Zeile betrachtet wird).
SQL verfügt über geclusterte und nicht geclusterte Indizes. Mein Verständnis von Clustered-Indizes ist, dass sie ähnliche Indexwerte auf derselben Seite gruppieren. Auf diese Weise kann SQL diese Zeilen von einer gruppierten Speicherseite zurückgeben, wenn Sie nach allen Zeilen fragen, die einem Indexwert entsprechen. Aus diesem Grund ist der Versuch, eine GUID-Spalte zu gruppieren, eine schlechte Idee. Sie versuchen nicht, zufällige Werte zu gruppieren.
Wenn Sie eine Ganzzahlspalte indizieren, enthält der SQL-Index eine Reihe von Zeilen für jeden Indexwert. Wenn Sie einen Bereich von 1 bis 10 haben, haben Sie 10 Indexzeiger. Je nachdem, wie viele Zeilen es gibt, kann dies unterschiedlich ausgelagert werden. Wenn Ihre Abfrage nach dem Index sucht, der mit "1" übereinstimmt, und dann, wo Name "Fred" enthält (vorausgesetzt, die Spalte "Name" ist nicht indiziert), erhält SQL sehr schnell den Satz von Zeilen, die mit "1" übereinstimmen, und die Tabelle durchsucht den Rest.
Was SQL also wirklich tut, ist zu versuchen, die Arbeitsmenge (Anzahl der Zeilen) zu reduzieren, über die es iterieren muss.
Wenn Sie ein Bitfeld (oder einen engen Bereich) indizieren, reduzieren Sie den Arbeitssatz nur um die Anzahl der Zeilen, die diesem Wert entsprechen. Wenn Sie eine kleine Anzahl übereinstimmender Zeilen haben, würde dies Ihren Arbeitssatz erheblich reduzieren. Bei einer großen Anzahl von Zeilen mit einer 50/50-Verteilung kann dies zu einem sehr geringen Leistungsgewinn führen, während der Index auf dem neuesten Stand gehalten wird.
Der Grund, warum jeder sagt, dass er testen soll, ist, dass SQL einen sehr cleveren und komplexen Optimierer enthält, der einen Index möglicherweise ignoriert, wenn er entscheidet, dass das Scannen von Tabellen schneller ist, eine Sortierung verwendet oder Speicherseiten organisiert, wie es ihm gefällt.