sql >> Database teknologi >  >> RDS >> Sqlserver

Hvordan kan et ikke-klynget indeks udskrive en kolonne, der ikke er inkluderet i indekset

Hvis selve tabellen er clustered , så indeholder alle sekundære indekser en kopi af klyngingsnøglen (en nøgle, der bestemmer den fysiske rækkefølge af rækker i den klyngede tabel).

Årsagen:rækker i en klynget tabel er fysisk gemt i et B-træ (ikke tabelbunke), og kan derfor flytte når B-træ noder bliver splittet eller sammensmeltet, så det sekundære indeks kan ikke bare indeholde rækken "pointer" (da den ville være i fare for at "dingle" efter rækken flytter sig).

Det har ofte en skadelig effekt på ydeevnen - forespørgsel gennem sekundært indeks kan kræve dobbeltopslag :

  • Først skal du søge i det sekundære indeks og hente klyngingsnøglen.
  • For det andet, baseret på clustering-nøglen, der er hentet ovenfor, søg i selve klyngetabellen (som er B-træ).

Men hvis alt, du ønsker, er felterne i klyngingsnøglen, er det kun nødvendigt med det første opslag.

Aka "clustered index" under MS SQL Server.

Normalt, men ikke nødvendigvis en PRIMÆR NØGLE under MS SQL Server.

Det er uheldigt, at klyngedannelse er slået til som standard under MS SQL Server - folk forlader ofte standarden uden fuldt ud at overveje dens virkninger. Når klyngedannelse ikke er passende, bør du udtrykkeligt angive NOCLUSTERED søgeord for at slå det fra.



  1. Fjernelse af duplikerede rækker i Postgres

  2. Subtraktion i sql-sætning

  3. Problemer med at oprette forbindelse til sql-server Login mislykkedes. Login er fra et domæne, der ikke er tillid til, og kan ikke bruges med Windows-godkendelse

  4. MySQL sletter ikke poster