SQLShack
Indexen worden gebruikt om het queryproces in SQL Server te versnellen, wat resulteert in een hoge prestatie. Ze zijn vergelijkbaar met leerboekindexen. Als u in leerboeken naar een bepaald hoofdstuk moet gaan, gaat u naar de index, zoekt u het paginanummer van het hoofdstuk en gaat u rechtstreeks naar die pagina. Zonder indexen zou het proces om het gewenste hoofdstuk te vinden erg traag zijn geweest.
Hetzelfde geldt voor indexen in databases. Zonder indexen moet een DBMS alle records in de tabel doorlopen om de gewenste resultaten op te halen. Dit proces wordt tabelscanning genoemd en is extreem traag. Aan de andere kant, als u indexen maakt, gaat de database eerst naar die index en haalt vervolgens de bijbehorende tabelrecords rechtstreeks op.
Er zijn twee soorten indexen in SQL Server:
- Geclusterde index
- Niet-geclusterde index
Geclusterde index
Een geclusterde index definieert de volgorde waarin gegevens fysiek in een tabel worden opgeslagen. Tabelgegevens kunnen alleen op een manier worden gesorteerd, daarom kan er slechts één geclusterde index per tabel zijn. In SQL Server creëert de primaire sleutelbeperking automatisch een geclusterde index voor die specifieke kolom.
Laten we eens kijken. Maak eerst een “student” -tabel in “schooldb” door het volgende script uit te voeren, of zorg ervoor dat uw database volledig is geback-upt als u uw live gegevens gebruikt:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
MAAK DATABASE schooldb
CREATE TABLE student
(
id INT PRIMARY KEY,
naam VARCHAR (50) NOT NULL,
geslacht VARCHAR (50) NOT NULL,
DOB datetime NOT NULL,
total_score INT NOT NULL,
stad VARCHAR (50) NOT NULL
)
|
Opmerking hier in de “studententafel” hebben we prima gedekt ry sleutelbeperking op de “id” -kolom. Dit creëert automatisch een geclusterde index op de “id” -kolom. Om alle indexen op een bepaalde tabel te zien, voert u de “sp_helpindex” opgeslagen procedure uit. Deze opgeslagen procedure accepteert de naam van de tabel als parameter en haalt alle indexen van de tabel op. Met de volgende zoekopdracht worden de indexen opgehaald die op de leerlingentafel zijn gemaakt.
1
2
3
4
5
|
GEBRUIK schooldb
EXECUTE sp_helpindex student
|
De bovenstaande zoekopdracht zal dit resultaat opleveren:
index_name | index_description | index_keys |
PK__student__3213E83F7F60ED59 | geclusterde, unieke, primaire sleutel op PRIMARY | id |
In de uitvoer kun je de enige index zien. Dit is de index die automatisch is gemaakt vanwege de primaire sleutelbeperking in de kolom “id”.
Deze geclusterde index slaat het record op in de studententabel in oplopende volgorde van de “id”. Als de ingevoegde record de id 5 heeft, wordt de record daarom in de 5e rij van de tabel ingevoegd in plaats van in de eerste rij. Evenzo, als het vierde record een id van 3 heeft, wordt het in de derde rij ingevoegd in plaats van in de vierde rij. Dit komt omdat de geclusterde index de fysieke volgorde van de opgeslagen records moet behouden volgens de geïndexeerde kolom, d.w.z. id. Om deze volgorde in actie te zien, voert u het volgende script uit:
Het bovenstaande script voegt tien records in de leerlingentabel in. Merk op dat de records in willekeurige volgorde van de waarden in de kolom “id” worden ingevoegd, maar vanwege de standaard geclusterde index in de kolom id, worden de records fysiek opgeslagen in oplopende volgorde van de waarden in de kolom “id”. Voer de volgende SELECT-instructie uit om de records uit de leerlingentabel op te halen.
1
2
3
4
5
|
GEBRUIK schooldb
SELECTEER * VAN leerling
|
De records worden in de volgende volgorde opgehaald:
Aangepaste geclusterde index maken
U kunt uw eigen aangepaste index maken, evenals de standaard geclusterde index. Om een nieuwe geclusterde index op een tabel te maken, moet u eerst de vorige index verwijderen.
Om een index te verwijderen, ga naar “Object Explorer- > Databases- > Database_Name- > Tabellen- > Tabelnaam – > Indexen”. Klik met de rechtermuisknop op de index die u wilt verwijderen en selecteer VERWIJDEREN . Zie de onderstaande schermafbeelding.
Nu, om een nieuwe geclusterde index te maken, voert u het volgende script uit:
1
2
3
4
5
6
|
gebruik schooldb
CREËER GECLUSTERDE INDEX IX_tblStudent_Gender_Score
OP leerling (geslacht ASC, totale_score DESC)
|
Het proces van cre ating geclusterde index is vergelijkbaar met een normale index met één uitzondering. Bij een geclusterde index moet u het trefwoord “CLUSTERED” vóór “INDEX” gebruiken.
Het bovenstaande script maakt een geclusterde index met de naam “IX_tblStudent_Gender_Score” op de studententabel. Deze index wordt gemaakt op de kolommen “geslacht” en “total_score”. Een index die is gemaakt op meer dan één kolom wordt genoemd “samengestelde index”.
De bovenstaande index sorteert eerst alle records in oplopende volgorde van geslacht. Als het geslacht hetzelfde is voor twee of meer records, worden de records gesorteerd in aflopende volgorde van de waarden in hun kolom “total_score”. U kunt ook een geclusterde index voor één kolom maken. Als u nu alle records uit de studententabel, worden ze in de volgende volgorde opgehaald:
Niet-geclusterde indexen
Een niet-geclusterde index sorteert de fysieke gegevens in de tabel niet. niet-geclusterde index wordt op de ene plaats opgeslagen en tabelgegevens worden op een andere plaats opgeslagen. Dit is vergelijkbaar met een leerboek waarin de inhoud van het boek zich op de ene plaats bevindt en de index zich op een andere plaats. Hierdoor kunnen er meer dan één niet-geclusterd index per tabel.
Het is belangrijk om hier te vermelden dat in de tabel de gegevens worden gesorteerd door een geclusterde index. Binnen de niet-geclusterde index worden de gegevens echter opgeslagen in de opgegeven volgorde. De index bevat kolomwaarden waarop de index is gemaakt en het adres van het record waartoe de kolomwaarde behoort.
Als er een query wordt uitgevoerd op een kolom waarop de index is gemaakt, gaat de database eerst naar de index en zoekt het adres van de overeenkomstige rij in de tabel. Het gaat dan naar dat rijadres en haalt andere kolomwaarden op. Door deze extra stap zijn niet-geclusterde indexen langzamer dan geclusterde indexen.
Een niet-geclusterde index maken
De syntaxis voor het maken van een niet-geclusterde index is vergelijkbaar met die van geclusterde index. In het geval van een niet-geclusterde index wordt het trefwoord “NONCLUSTERED” gebruikt in plaats van “CLUSTERED”. Bekijk het volgende script.
1
2
3
4
5
6
|
gebruik schooldb
CREËER NIET-CLUSTERED INDEX IX_tblStudent_Name
OP student (naam ASC)
|
Het bovenstaande script maakt een niet-geclusterde index op de kolom “naam” van de leerlingentafel. De index sorteert op naam in oplopende volgorde. Zoals we al eerder zeiden, worden de tabelgegevens en index op verschillende plaatsen opgeslagen. De tabelrecords worden gesorteerd op een geclusterde index als die er is. De index wordt gesorteerd op basis van de definitie en wordt afzonderlijk opgeslagen van de tafel.
Leerlingentafelgegevens:
IX_tblStudent_Name Indexgegevens
naam | Rij-adres |
Alan | Rij-adres |
Elis | Adres rij |
Jolly | Adres rij |
Jon | Adres rij |
Joseph | Adres rij |
Kate | Adres rij |
Laura | Adres rij |
Muizen | Adres rij |
Sara | Adres rij |
Wijs | Rij-adres |
Opmerking , hier in de index heeft elke rij een kolom met het adres van de rij waartoe de naam behoort. Dus als er een zoekopdracht wordt uitgevoerd om het geslacht en de DOB van de student met de naam “Jon” te achterhalen, zal de database eerst de naam “Jon” in de index doorzoeken. Het leest dan het rij-adres van “Jon” en gaat direct naar die rij in de “student” -tabel om het geslacht en de geboortedatum van Jon op te halen.
Conclusie
Uit de discussie we vinden de volgende verschillen tussen geclusterde en niet-geclusterde indexen.
- Er kan slechts één geclusterde index per tabel zijn. U kunt echter meerdere niet-geclusterde indexen op een enkele tabel maken.
- Geclusterde indexen sorteren alleen tabellen. Daarom verbruiken ze geen extra opslagruimte. Niet-geclusterde indexen worden op een andere plaats opgeslagen dan de feitelijke tabel, waardoor ze meer opslagruimte claimen.
- Geclusterde indexen zijn sneller dan niet-geclusterde indexen omdat ze geen extra opzoekstap met zich meebrengen.
Andere geweldige artikelen van Ben
Verschil tussen identiteit & Volgorde in SQL Server
Wat is het verschil tussen geclusterde en niet-geclusterde indexen in SQL Server?
- Auteur
- Recente berichten
Bekijk alle berichten van Ben Richardson
- Power BI: Waterfall Charts and Combined Visuals – 19 januari 2021
- Power BI : Voorwaardelijke opmaak en gegevenskleuren in actie – 14 januari 2021
- Power BI: gegevens importeren uit SQL Server en MySQL – 12 januari 2021
573.279 weergaven
© 2021 Quest Software Inc. ALLE RECHTEN VOORBEHOUDEN.AVG | Gebruiksvoorwaarden | Privacy