Creative Saplings

SQLShack (Dansk)

februar 22, 2021
No Comments

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:

  1. Clustered Index
  2. 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.

  1. Der kan kun være ét klyngedeks efter hver tabel. Du kan dog oprette flere ikke-klyngede indekser på en enkelt tabel.
  2. 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.
  3. 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
Ben Richardson driver Acuity Training, en førende leverandør af SQL-træning i Storbritannien. Det tilbyder et komplet udvalg af SQL-træning fra introduktionskurser til avanceret administration og data warehouse-træning – se her for flere detaljer. Acuity har kontorer i London og Guildford, Surrey. Han blogger også lejlighedsvis på Acuitys blog
Se alle indlæg af Ben Richardson

Seneste indlæg af Ben Richardson (se alle)
  • 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

Articles
Previous Post

Topuniversiteter, hvor du kan studere regnskab og finansiering

Next Post

9 hunde med blå øjne, der vil hypnotisere dig

Skriv et svar Annuller svar

Seneste indlæg

  • Verdens bedste fotografiskoler, 2020
  • Suveræne borgere tager deres regeringsfilosofi til vejene
  • Guide til reparation af stuk reparationer
  • Muckrakers (Dansk)
  • Precision Oncology

Arkiver

  • februar 2021
  • januar 2021
  • december 2020
  • november 2020
  • oktober 2020
  • september 2020
  • Deutsch
  • Nederlands
  • Svenska
  • Norsk
  • Dansk
  • Español
  • Français
  • Português
  • Italiano
  • Română
  • Polski
  • Čeština
  • Magyar
  • Suomi
  • 日本語
  • 한국어
Proudly powered by WordPress | Theme: Fmi by Forrss.