SQLShack (Norsk)
Indekser brukes til å øke hastigheten på søkeprosessen i SQL Server, noe som resulterer i høy opptreden. De ligner på lærebokindekser. I lærebøker, hvis du trenger å gå til et bestemt kapittel, går du til indeksen, finner sidenummeret til kapittelet og går direkte til den siden. Uten indekser ville prosessen med å finne ønsket kapittel vært veldig treg.
Det samme gjelder indekser i databaser. Uten indekser må en DBMS gå gjennom alle postene i tabellen for å hente de ønskede resultatene. Denne prosessen kalles tabellskanning og er ekstremt langsom. På den annen side, hvis du oppretter indekser, går databasen til den indeksen først og henter deretter de tilsvarende tabelloppføringene direkte.
Det er to typer indekser i SQL Server:
- Clustered Index
- Non-Clustered Index
Klynget indeks
En klynget indeks definerer rekkefølgen data lagres fysisk i en tabell. Tabelldata kan sorteres på bare måte, derfor kan det bare være en gruppert indeks per tabell. I SQL Server oppretter den primære nøkkelbegrensningen automatisk en gruppert indeks på den aktuelle kolonnen.
La oss ta en titt. Først oppretter du en «student» -tabell i «schooldb» ved å utføre følgende skript, eller sørg for at databasen din er sikkerhetskopiert hvis du bruker live dataene:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
OPPRETT DATABASE schooldb
OPPRETT TABELLstudent
(
id INT PRIMÆR NØKKEL,
navn VARCHAR (50) IKKE NULL,
kjønn VARCHAR (50) IKKE NULL,
DOB datetime NOT NULL,
total_score INT IKKE NULL,
city VARCHAR (50) NOT NULL
)
|
Merknad her i «student» -tabellen har vi satt prima ry nøkkelbegrensning i kolonnen «id». Dette oppretter automatisk en gruppert indeks i kolonnen «id». For å se alle indeksene på en bestemt tabell, utfør «sp_helpindex» lagret prosedyre. Denne lagrede prosedyren godtar navnet på tabellen som en parameter og henter alle indeksene i tabellen. Følgende spørsmål henter indeksene som er opprettet på studenttabellen.
1
2
3
4
5
|
BRUK schooldb
EXECUTE sp_helpindex student
|
Spørringen ovenfor vil returnere dette resultatet:
indeksnavn | indeksbeskrivelse | indeksnøkler |
PK__student__3213E83F7F60ED59 | gruppert, unik, primærnøkkel plassert på PRIMÆR | id |
I utgangen kan du se den eneste indeksen. Dette er indeksen som ble opprettet automatisk på grunn av den primære nøkkelbegrensningen i «id» -kolonnen.
Denne grupperte indeksen lagrer posten i studenttabellen i stigende rekkefølge av «id». Derfor, hvis den innsatte posten har ID 5, vil posten settes inn i 5. rad i tabellen i stedet for den første raden. På samme måte, hvis den fjerde posten har en ID på 3, vil den bli satt inn i tredje rad i stedet for den fjerde raden. Dette er fordi den klyngede indeksen må opprettholde den fysiske rekkefølgen på de lagrede postene i henhold til den indekserte kolonnen, dvs. id. For å se denne bestillingen i aksjon, utfør følgende skript:
Skriptet ovenfor setter inn ti poster i studenttabellen. Legg merke til at postene settes inn i tilfeldig rekkefølge av verdiene i «id» -kolonnen. Men på grunn av den standard grupperte indeksen på id-kolonnen, lagres postene fysisk i stigende rekkefølge av verdiene i «id» -kolonnen. Utfør følgende SELECT-setning for å hente postene fra studenttabellen.
1
2
3
4
5
|
BRUK schooldb
VELG * FRA student
|
Postene blir hentet i følgende rekkefølge:
Opprette tilpasset klynget indeks
Du kan også lage din egen tilpassede indeks, samt standard klyngedeks. For å opprette en ny gruppert indeks på en tabell, må du først slette den forrige indeksen.
For å slette en indeks, gå til «Object Explorer- > Databaser- > Database_Name- > Tabeller- > Table_Name – > Indekser». Høyreklikk på indeksen du vil slette, og velg SLETT . Se skjermbildet nedenfor.
Nå, for å opprette en ny gruppert indeks, utfør følgende skript:
1
2
3
4
5
6
|
bruk schooldb
OPPRETT KLASSERT INDEKS IX_tblStudent_Gender_Score
PÅ student (kjønn ASC, total_score DESC)
|
Prosessen med å lage ating gruppert indeks ligner på en normal indeks med ett unntak. Med klynget indeks, må du bruke nøkkelordet «KLUSTERT» før «INDEKS».
Ovenstående skript oppretter en gruppert indeks med navnet «IX_tblStudent_Gender_Score» på studenttabellen. Denne indeksen opprettes i kolonnene «kjønn» og «total_score». En indeks som er opprettet i mer enn en kolonne kalles «sammensatt indeks».
Ovennevnte indeks sorterer først alle postene i stigende rekkefølge av kjønnet. Hvis kjønn er likt for to eller flere poster, blir postene sortert i fallende rekkefølge av verdiene i «total_score» -kolonnen. Du kan også opprette en gruppert indeks i en enkelt kolonne. Hvis du nå velger alle postene fra studenttabellen, blir de hentet i følgende rekkefølge:
Ikke-klyngede indekser
En ikke-klynget indeks sorterer ikke de fysiske dataene i tabellen. ikke-gruppert indeks er lagret på ett sted og tabelldata lagres på et annet sted. Dette ligner på en lærebok der bokinnholdet er plassert på ett sted og indeksen er plassert på et annet sted. Dette gir mulighet for mer enn en ikke-gruppert indeks per tabell.
Det er viktig å nevne her at inne i tabellen blir dataene sortert etter en klynget indeks. Imidlertid lagres dataene i den ikke-klyngede indeksen i den angitte rekkefølgen. Indeksen inneholder kolonneverdier som indeksen er opprettet for, og adressen til posten som kolonneverdien tilhører.
Når et spørsmål blir utstedt mot en kolonne som indeksen er opprettet på, vil databasen først gå til indeksen og se etter adressen til den tilsvarende raden i tabellen. Den vil da gå til den radadressen og hente andre kolonneverdier. Det er på grunn av dette ekstra trinnet at ikke-klyngede indekser er tregere enn klyngede indekser.
Opprette en ikke-klynget indeks
Syntaksen for å lage en ikke-gruppert indeks ligner på den for gruppert indeks. Imidlertid, i tilfelle ikke-gruppert indeks, brukes nøkkelordet «NONCLUSTERED» i stedet for «CLUSTERED». Ta en titt på følgende skript.
1
2
3
4
5
6
|
bruk schooldb
OPPRETT IKKE-KLUSTERT INDEKS IX_tblStudent_Name
PÅ student (navn ASC)
|
Ovenstående skript oppretter en ikke-gruppert indeks i kolonnen «navn» i studenttabellen. Indeksen sorterer etter navn i stigende rekkefølge. Som vi sa tidligere, vil tabelldataene og indeksen lagres på forskjellige steder. Tabelloppføringene vil bli sortert etter en gruppert indeks hvis det er en. Indeksen vil bli sortert i henhold til definisjonen og vil bli lagret separat fra bordet.
Studenttabelldata:
IX_tblStudent_Name Indeksdata
navn | Radeadresse |
Alan | Radeadresse |
Elis | Radeadresse |
Jolly | Radeadresse |
Jon | Radeadresse |
Joseph | Radeadresse |
Kate | Radeadresse |
Laura | Radeadresse |
Mus | Radeadresse |
Sara | Radeadresse |
Klok | Radeadresse |
Merknad , her i indeksen har hver rad en kolonne som lagrer adressen til raden som navnet tilhører. Så hvis det blir utstedt et spørsmål for å hente kjønn og DOB til studenten som heter «Jon», vil databasen først søke i navnet «Jon» i indeksen. Den vil da lese radeadressen til «Jon» og gå direkte til den raden i «student» -tabellen for å hente kjønn og DOB for Jon.
Konklusjon
Fra diskusjonen vi finner følgende forskjeller mellom klyngede og ikke-klyngede indekser.
- Det kan bare være en klynget indeks per tabell. Du kan imidlertid opprette flere ikke-grupperte indekser på en enkelt tabell.
- Klyngede indekser sorterer bare tabeller. Derfor bruker de ikke ekstra lagring. Ikke-klyngede indekser lagres på et annet sted fra den faktiske tabellen og krever mer lagringsplass.
- Klyngede indekser er raskere enn ikke-klyngede indekser, siden de ikke innebærer noe ekstra oppslagstrinn.
Andre flotte artikler fra Ben
Forskjell mellom identitet & Sekvens i SQL Server
Hva er forskjellen mellom klyngede og ikke-klyngede indekser i SQL Server?
- Forfatter
- Nylige innlegg
Vis alle innlegg av Ben Richardson
- Power BI: Waterfall Charts and Combined Visuals – 19. januar 2021
- Power BI : Betinget formatering og datafarger i aksjon – 14. januar 2021
- Power BI: Importerer data fra SQL Server og MySQL – 12. januar 2021
573,279 visninger
© 2021 Quest Software Inc. ALLE RETTIGHETER FORBEHOLDT. | GDPR | Vilkår for bruk | Personvern