sql >> Database >  >> RDS >> Sqlserver

Hoe kan een niet-geclusterde index een kolom uitvoeren die niet in de index is opgenomen?

Als de tabel zelf geclusterd is , dan bevatten alle secundaire indexen een kopie van de clustersleutel (een sleutel die de fysieke volgorde van rijen in de clustertabel bepaalt).

De reden:rijen in een geclusterde tabel worden fysiek opgeslagen in een B-tree (geen tabelheap), en kunnen daarom verplaatsen wanneer B-tree-knooppunten worden gesplitst of samengevoegd, zodat de secundaire index niet alleen de rij "pointer" kan bevatten (omdat deze het risico loopt te "bengelen" nadat de rij is verplaatst).

Vaak heeft dat een nadelig effect op de prestaties - voor zoekopdrachten via de secundaire index kan dubbel opzoeken nodig zijn :

  • Zoek eerst in de secundaire index en verkrijg de clustersleutel.
  • Ten tweede, op basis van de hierboven opgehaalde clustersleutel, doorzoek de geclusterde tabel zelf (wat B-tree is).

Als u echter alleen de velden van de clustersleutel wilt, is alleen de eerste zoekopdracht nodig.

Ook wel "geclusterde index" genoemd onder MS SQL Server.

Meestal, maar niet noodzakelijk een PRIMAIRE SLEUTEL onder MS SQL Server.

Het is jammer dat clustering standaard is ingeschakeld onder MS SQL Server - mensen laten de standaard vaak gewoon staan ​​zonder de effecten ervan volledig in overweging te nemen. Als clustering niet geschikt is, moet u het trefwoord NONCLUSTERED expliciet specificeren om het uit te schakelen.



  1. Bizar prestatieprobleem:algemene tabeluitdrukkingen in inline door de gebruiker gedefinieerde functie

  2. Hoe subquery te gebruiken om Mysql SELECT LIMIT offset te definiëren?

  3. Dubbele aanhalingstekens in aliassen van Oracle-kolommen

  4. Toegang tot het SQL Server-exemplaar herstellen zonder opnieuw op te starten