Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Wie kann ein Non-Clustered-Index eine Spalte ausgeben, die nicht im Index enthalten ist?

Wenn die Tabelle selbst geclustert ist , dann enthalten alle Sekundärindizes eine Kopie des Gruppierungsschlüssels (ein Schlüssel, der die physische Reihenfolge der Zeilen in der gruppierten Tabelle festlegt).

Der Grund:Zeilen in einer geclusterten Tabelle werden physisch in einem B-Baum (nicht Tabellen-Heap) gespeichert und können sich daher verschieben wenn B-Tree-Knoten geteilt oder verschmolzen werden, kann der Sekundärindex also nicht einfach den Zeilen-"Zeiger" enthalten (da die Gefahr besteht, dass er "hängt", nachdem sich die Zeile bewegt).

Dies wirkt sich häufig nachteilig auf die Leistung aus – Abfragen über den sekundären Index erfordern möglicherweise eine doppelte Suche :

  • Durchsuchen Sie zuerst den sekundären Index und rufen Sie den Clusterschlüssel ab.
  • Zweitens, basierend auf dem oben abgerufenen Gruppierungsschlüssel, durchsuchen Sie die geclusterte Tabelle selbst (die B-Baum ist).

Wenn Sie jedoch nur die Felder des Clusterschlüssels benötigen, ist nur die erste Suche erforderlich.

Auch bekannt als "Clustered Index" unter MS SQL Server.

Normalerweise, aber nicht unbedingt ein PRIMARY KEY unter MS SQL Server.

Es ist bedauerlich, dass Clustering standardmäßig unter MS SQL Server aktiviert ist – Leute lassen oft einfach die Standardeinstellung, ohne ihre Auswirkungen vollständig zu berücksichtigen. Wenn Clustering nicht angemessen ist, sollten Sie das Schlüsselwort NONCLUSTERED explizit angeben, um es zu deaktivieren.