SQLShack (Dansk)
Indekser bruges til at fremskynde forespørgselsprocessen i SQL Server, hvilket resulterer i høj ydeevne. De ligner lærebogindekser. I lærebøger, hvis du har brug for at gå til et bestemt kapitel, skal du gå til indekset, finde sidens nummer på kapitlet og gå direkte til den side. Uden indekser ville processen med at finde dit ønskede kapitel have været meget langsom.
Det samme gælder for indekser i databaser. Uden indekser skal en DBMS gennemgå alle poster i tabellen for at hente de ønskede resultater. Denne proces kaldes tabel-scanning og er ekstremt langsom. På den anden side, hvis du opretter indekser, går databasen først til dette indeks og henter derefter de tilsvarende tabeloptegnelser direkte.
Der er to typer indekser i SQL Server:
- Clustered Index
- Non-Clustered Index
Klynget indeks
Et klynget indeks definerer den rækkefølge, som data fysisk gemmes i en tabel. Tabeldata kan kun sorteres, derfor kan der kun være ét klyngedeks pr. Tabel. I SQL Server opretter den primære nøglebegrænsning automatisk et grupperet indeks på den pågældende kolonne.
Lad os se på det. Opret først en “student” -tabel inde i “schooldb” ved at udføre følgende script, eller sørg for, at din database er fuldt sikkerhedskopieret, hvis du bruger dine live data:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
OPRET DATABASE schooldb
OPRET TABELstuderende
(
id INT PRIMÆR NØGLE,
navn VARCHAR (50) IKKE NULL,
køn VARCHAR (50) IKKE NULL,
DOB datetime IKKE NULL,
total_score INT IKKE NULL,
by VARCHAR (50) IKKE NULL
)
|
Meddelelse her i “student” -tabellen har vi sat prima ry nøglebegrænsning i kolonnen “id”. Dette opretter automatisk et klynget indeks i kolonnen “id”. For at se alle indekserne på en bestemt tabel udføres “sp_helpindex” lagret procedure. Denne lagrede procedure accepterer navnet på tabellen som en parameter og henter alle indekserne i tabellen. Den følgende forespørgsel henter de indekser, der er oprettet på elevtabellen.
1
2
3
4
5
|
BRUG schooldb
EXECUTE sp_helpindex student
|
Ovenstående forespørgsel returnerer dette resultat:
index_name | index_description | index_keys |
PK__student__3213E83F7F60ED59 | grupperet, unik, primær nøgle placeret på PRIMÆR | id |
I output kan du se det eneste indeks. Dette er det indeks, der automatisk blev oprettet på grund af den primære nøglebegrænsning i kolonnen “id”.
Dette klyngede indeks gemmer posten i elevtabellen i stigende rækkefølge af “id”. Derfor, hvis den indsatte post har id’et 5, indsættes posten i 5. række i tabellen i stedet for den første række. Tilsvarende, hvis den fjerde post har en id på 3, indsættes den i tredje række i stedet for den fjerde række. Dette skyldes, at det klyngede indeks skal opretholde den fysiske rækkefølge af de lagrede poster i henhold til den indekserede kolonne, dvs. id. For at se denne rækkefølge i aktion skal du udføre følgende script:
Ovenstående script indsætter ti poster i elevtabellen. Bemærk her, at posterne indsættes i tilfældig rækkefølge af værdierne i kolonnen “id”. Men på grund af det standardklyngede indeks i kolonnen id lagres posterne fysisk i stigende rækkefølge af værdierne i kolonnen “id”. Udfør følgende SELECT-sætning for at hente poster fra elevtabellen.
1
2
3
4
5
|
BRUG schooldb
VÆLG * FRA studerende
|
Optegnelserne hentes i følgende rækkefølge:
Oprettelse af tilpasset klynget indeks
Du kan også oprette dit eget tilpassede indeks samt standardklyngede indeks. For at oprette et nyt grupperet indeks på en tabel skal du først slette det forrige indeks.
For at slette et indeks skal du gå til “Object Explorer- > Databaser- > Database_Name- > Tabeller- > Table_Name – > Indekser”. Højreklik på det indeks, du vil slette, og vælg SLET Se nedenstående skærmbillede.
Nu, for at oprette et nyt grupperet indeks skal du udføre følgende script:
1
2
3
4
5
6
|
brug schooldb
CREATE CLUSTERED INDEX IX_tblStudent_Gender_Score
ON student (gender ASC, total_score DESC)
|
Processen med at skabe ating grupperet indeks svarer til et normalt indeks med en undtagelse. Med klynget indeks skal du bruge nøgleordet “CLUSTERED” før “INDEX”.
Ovenstående script opretter et grupperet indeks med navnet “IX_tblStudent_Gender_Score” på elevtabellen. Dette indeks oprettes i kolonnerne “køn” og “total_score”. Et indeks, der oprettes i mere end en kolonne, kaldes “sammensat indeks”.
Ovenstående indeks sorterer først alle poster i stigende rækkefølge efter køn. Hvis køn er det samme for to eller flere poster, sorteres posterne i faldende rækkefølge af værdierne i deres “total_score” -kolonne. Du kan også oprette et klynget indeks i en enkelt kolonne. Hvis du nu vælger alle poster fra elevtabel, hentes de i følgende rækkefølge:
Ikke-klyngede indekser
Et ikke-klynget indeks sorterer ikke de fysiske data inde i tabellen. ikke-klynget indeks gemmes ét sted, og tabeldata gemmes et andet sted. Dette svarer til en lærebog, hvor bogindholdet er placeret ét sted, og indekset er placeret et andet sted. Dette giver mulighed for mere end en ikke-grupperet indeks pr. tabel.
Det er vigtigt at nævne her, at inden i tabellen vil dataene blive sorteret efter et klynget indeks. Imidlertid er inde i ikke-klyngede indeksdata gemt i den angivne rækkefølge. Indekset indeholder søjleværdier, som indekset oprettes på, og adressen på den post, som søjleværdien tilhører.
Når en forespørgsel udstedes mod en kolonne, som indekset oprettes på, går databasen først til indekset og ser efter adressen på den tilsvarende række i tabellen. Derefter går den til denne rækkeadresse og henter andre kolonneværdier. Det skyldes dette yderligere trin, at ikke-klyngede indekser er langsommere end klyngede indekser.
Oprettelse af et ikke-klynget indeks
Syntaksen til oprettelse af et ikke-klynget indeks svarer til det af klyngede indeks. I tilfælde af ikke-grupperet indeks bruges nøgleordet “NONCLUSTERED” i stedet for “CLUSTERED”. Se på følgende script.
1
2
3
4
5
6
|
brug schooldb
CREATE NONCLUSTERED INDEX IX_tblStudent_Name
ON student (name ASC)
|
Ovenstående script opretter et ikke-grupperet indeks i kolonnen “navn” i elevtabellen. Indekset sorteres efter navn i stigende rækkefølge. Som vi sagde tidligere, vil tabeldataene og indekset blive gemt forskellige steder. Tabelregistreringerne sorteres efter et grupperet indeks, hvis der er en. Indekset sorteres efter dens definition og lagres separat fra bordet.
Data for elevtabel:
IX_tblStudent_Name Indeksdata
navn | Række adresse |
Alan | Række adresse |
Elis | Række adresse |
Jolly | Række adresse |
Jon | Række adresse |
Joseph | Række adresse |
Kate | Række adresse |
Laura | Række adresse |
Mus | Række adresse |
Sara | Række adresse |
Klog | Række adresse |
Bemærk her i indekset har hver række en kolonne, der gemmer adressen på den række, som navnet tilhører. Så hvis der udstedes en forespørgsel for at hente køn og DOB for den studerende ved navn “Jon”, vil databasen først søge på navnet “Jon” inde i indekset. Derefter læses rækkeadressen til “Jon” og går direkte til den række i “studerende” -tabellen for at hente køn og DOB for Jon.
Konklusion
Fra diskussionen vi finder følgende forskelle mellem klyngede og ikke-klyngede indekser.
- Der kan kun være ét klyngedeks efter hver tabel. Du kan dog oprette flere ikke-klyngede indekser på en enkelt tabel.
- Klyngede indekser sorterer kun tabeller. Derfor spiser de ikke ekstra lagerplads. Ikke-klyngede indekser gemmes et separat sted fra den aktuelle tabel, der kræver mere lagerplads.
- Klyngede indekser er hurtigere end ikke-klyngede indekser, da de ikke involverer noget ekstra opslagstrin.
Andre gode artikler fra Ben
Forskel mellem identitet & Sekvens i SQL Server
Hvad er forskellen mellem klyngede og ikke-klyngede indekser i SQL Server?
- Forfatter
- Seneste indlæg
Se alle indlæg af Ben Richardson
- Power BI: Waterfall Charts and Combined Visuals – 19. januar 2021
- Power BI : Betinget formatering og datafarver i aktion – 14. januar 2021
- Power BI: Import af data fra SQL Server og MySQL – 12. januar 2021
573.279 visninger
© 2021 Quest Software Inc. ALLE RETTIGHEDER FORBEHOLDT. | GDPR | Betingelser for brug | Privatliv