Et indeks hjælper SQL Server med at hente data fra rækker hurtigt. Indekser fungerer som indholdsfortegnelsen i begyndelsen af bøger, så du hurtigt kan slå op på den side et emne er på. Uden indekser skal SQL Server scanne alle rækkerne i en tabel for at finde en post.
Der er to typer indekser i SQL Server: klyngede og ikke-klyngede. Find ud af forskellen mellem klyngede og ikke-klyngede indekser, og hvorfor de er vigtige.
Clustered Index i SQL Server
I et klynget indeks lagres datarækker fysisk på en ordnet måde baseret på nøgleværdien. Da indekset inkluderer tabellen, og det kun kan arrangere rækker i én rækkefølge, kan du kun oprette ét klynget indeks pr. tabel.
Mens indekser gør hentning af rækker i et område hurtigere, INSERT og UPDATE erklæringer kan være langsom, fordi forespørgselsoptimeringsværktøjet scanner indekset i rækkefølge, indtil det finder målindekset.
Ikke-klynget indeks i SQL Server
Et ikke-klynget indeks indeholder nøgleværdierne, hvis indtastning er en markør kaldet en rækkeplacering. For klyngede tabeller (tabeller med et klynget indeks) peger markøren på en nøgle i det klyngede indeks, som igen peger på rækken i tabellen. For rækker uden et klynget indeks peger markøren direkte på tabelrækken.
Sådan opretter du et grupperet indeks i SQL Server
Når du opretter en tabel med en primær nøgle, opretter SQL Server automatisk en klynget indeksnøgle baseret på den primære nøgle. Hvis du ikke har en primær nøgle, kan du udføre følgende sætning for at oprette en klynget indeksnøgle.
SKAB KLUSTERET INDEKS <indeksnavn>
PÅ BORD <tabelnavn>(kolonne_navn)
I denne sætning angiver du navnet på indekset, navnet på tabellen, der skal oprettes ved, og kolonnenavnet, der skal bruges i indekset.
Hvis du tilføjer en primær nøgle til en tabel, der allerede har et klynget indeks, vil SQL Server oprette et ikke-klynget indeks med det.
For at oprette et klynget indeks, der ikke inkluderer den primære nøglekolonne, skal du først droppe den primære nøglebegrænsning.
BRUGdatabasenavn
ÆNDREBORD tabelnavn
DRÅBEBEGRÆNSNING pk_navn
GÅ
Fjernelse af de primære nøglebegrænsninger fjerner også det klyngede indeks, så du kan oprette et brugerdefineret.
Sådan opretter du et ikke-klynget indeks i SQL Server
For at oprette et ikke-klynget indeks skal du bruge følgende sætning.
SKABINDEKS <indeksnavn>
PÅ BORD <tabelnavn>(kolonne_navn)
Du kan også bruge nøgleordet IKKE CLUSTERED som dette:
SKAB [IKKLUSTERET] INDEKS <indeksnavn>
PÅ BORD <tabelnavn>(kolonne_navn)
Denne erklæring opretter et ikke-klynget indeks i den tabel, du angiver, og inkluderer den kolonne, du angiver.
Hvis du vil, kan du sortere kolonnerne i stigende (ASC) eller faldende (DESC) rækkefølge.
SKAB [IKKLUSTERET] INDEKS <indeksnavn>
PÅ BORD <tabelnavn>(kolonnenavn ASC/DESC)
Hvilket indeks skal du vælge?
Både klyngede og ikke-klyngede indekser forbedrer forespørgselstiden. Hvis de fleste af dine forespørgsler er SELECT-operationer på flere kolonner i tabellen, er klyngede indekser hurtigere. For INSERT- eller UPDATE-operationer er ikke-klyngede indekser dog hurtigere, da forespørgselsoptimeringsværktøjet kan finde kolonnen direkte fra indekset.
Som du kan se, fungerer disse indekser bedst til forskellige SQL-forespørgsler. De fleste SQL-databaser vil derfor drage fordel af at have mindst ét klynget indeks og ikke-klyngede indekser for kolonner, der løbende opdateres.
Vigtigheden af indekser i SQL Server
Klyngede og ikke-klyngede indekser fører til højere forespørgselsydeevne. Når du kører en forespørgsel, scanner forespørgselsoptimeringsværktøjet indekset for lagerplaceringen af en række og henter derefter oplysninger fra denne placering. Dette er meget hurtigere end at scanne alle rækkerne i tabellen.
Du kan også bruge ikke-klyngede indekser til at løse deadlocks i bogmærkeopslag ved at oprette et ikke-klynget indeks for kolonner, som de involverede forespørgsler får adgang til.