SQLShack (Svenska)
Index används för att påskynda frågeprocessen i SQL Server, vilket resulterar i hög prestanda. De liknar index för läroböcker. I läroböcker, om du behöver gå till ett visst kapitel, går du till indexet, hittar sidnumret för kapitlet och går direkt till den sidan. Utan index skulle processen att hitta önskat kapitel ha varit mycket långsam.
Detsamma gäller index i databaser. Utan index måste ett DBMS gå igenom alla poster i tabellen för att hämta önskat resultat. Denna process kallas tabellsökning och är extremt långsam. Å andra sidan, om du skapar index, går databasen först till indexet och hämtar sedan motsvarande tabellposter direkt.
Det finns två typer av index i SQL Server:
- Clustered Index
- Non-Clustered Index
Clustered Index
Ett clustered index definierar i vilken ordning data fysiskt lagras i en tabell. Tabelldata kan bara sorteras, därför kan det bara finnas ett klusterindex per tabell. I SQL Server skapar den primära nyckelbegränsningen automatiskt ett klusterindex i just den kolumnen.
Låt oss ta en titt. Skapa först en ”student” -tabell i ”schooldb” genom att köra följande skript, eller se till att din databas är fullständigt säkerhetskopierad om du använder dina live-data:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
CREATE DATABASE schooldb
CREATE TABLE student
(
id INT PRIMÄR NYCKEL,
namn VARCHAR (50) INTE NULL,
kön VARCHAR (50) INTE NULL,
DOB datetime NOT NULL,
total_score INT INTE NULL,
city VARCHAR (50) NOT NULL
)
|
Meddelande här i tabellen ”student” har vi satt prima ry tangentbegränsning i kolumnen ”id”. Detta skapar automatiskt ett klusterindex i kolumnen ”id”. För att se alla index i en viss tabell kör du ”sp_helpindex” lagrad procedur. Denna lagrade procedur accepterar namnet på tabellen som en parameter och hämtar alla index i tabellen. Följande fråga hämtar indexen som skapats i studenttabellen.
1
2
3
4
5
|
ANVÄNDNING schooldb
EXECUTE sp_helpindex student
|
Frågan ovan returnerar detta resultat:
indexnamn | index_description | indexnycklar |
PK__student__3213E83F7F60ED59 | klustrade, unika, primära nycklar på PRIMÄRA | id |
I utgången kan du se det enda indexet. Detta är indexet som skapades automatiskt på grund av den primära nyckelbegränsningen i kolumnen ”id”.
Detta klustrade index lagrar posten i studenttabellen i stigande ordning på ”id”. Därför, om den infogade posten har id: t 5, kommer posten att infogas i 5: e raden i tabellen istället för den första raden. På samma sätt, om den fjärde posten har ett id på 3, kommer den att införas i den tredje raden istället för den fjärde raden. Detta beror på att det klustrade indexet måste bibehålla den fysiska ordningen för de lagrade posterna enligt den indexerade kolumnen dvs id. För att se denna beställning i handling, kör följande skript:
Ovanstående skript infogar tio poster i studenttabellen. Observera här att posterna infogas i slumpmässig ordning av värdena i kolumnen ”id”. Men på grund av det standardklusterade indexet på id-kolumnen lagras posterna fysiskt i stigande ordning av värdena i kolumnen ”id”. Kör följande SELECT-uttalande för att hämta posterna från studenttabellen.
1
2
3
4
5
|
ANVÄND schooldb
VÄLJ * FRÅN student
|
Posterna kommer att hämtas i följande ordning:
Skapa Custom Clustered Index
Du kan skapa ditt eget anpassade index samt standardklusterindex. För att skapa ett nytt klusterindex i en tabell måste du först ta bort föregående index.
För att radera ett index, gå till ”Object Explorer- > Databaser- > Database_Name- > Tabeller- > Table_Name – > Index”. Högerklicka på indexet som du vill ta bort och välj RADERA Se nedanstående skärmdump.
Nu, för att skapa ett nytt klustrat index, kör följande skript:
1
2
3
4
5
6
|
använd schooldb
CREATE CLUSTERED INDEX IX_tblStudent_Gender_Score
ON student (gender ASC, total_score DESC)
|
Processen med att skapa ating klusterindex liknar ett normalt index med ett undantag. Med klusterindex måste du använda nyckelordet ”CLUSTERED” före ”INDEX”.
Ovanstående skript skapar ett grupperat index med namnet ”IX_tblStudent_Gender_Score” på studenttabellen. Detta index skapas i kolumnerna ”gender” och ”total_score”. Ett index som skapas i mer än en kolumn kallas ”sammansatt index”.
Ovanstående index sorterar först alla poster i stigande ordning på kön. Om kön är samma för två eller flera poster, sorteras posterna i den fallande ordningen av värdena i kolumnen ”total_score”. Du kan också skapa ett klusterindex i en enda kolumn. Om du nu väljer alla poster från studenttabellen kommer de att hämtas i följande ordning:
Icke-klustrade index
Ett icke-grupperat index sorterar inte de fysiska uppgifterna i tabellen. icke-klustrat index lagras på en plats och tabelldata lagras på en annan plats. Detta liknar en lärobok där bokinnehållet finns på en plats och indexet finns på en annan plats. Detta möjliggör mer än en icke-kluster index per tabell.
Det är viktigt att nämna här att inuti tabellen kommer data att sorteras efter ett klusterindex. Inom de icke-klustrade indexdata lagras dock i den angivna ordningen. Indexet innehåller kolumnvärden som indexet skapas på och adressen till posten som kolumnvärdet tillhör.
När en fråga utfärdas mot en kolumn där indexet skapas, går databasen först till indexet och letar efter adressen till motsvarande rad i tabellen. Det kommer sedan att gå till den radadressen och hämta andra kolumnvärden. Det är på grund av detta ytterligare steg att icke-klustrade index är långsammare än klustrade index.
Skapa ett icke-klustrat index
Syntaxen för att skapa ett icke-klustrat index liknar det för grupperade index. I fallet med icke-klustrade index används dock nyckelordet ”NONCLUSTERED” istället för ”CLUSTERED”. Ta en titt på följande skript.
1
2
3
4
5
6
|
använd schooldb
SKAPA INKLUSTERAD INDEX IX_tblStudent_Name
PÅ student (namn ASC)
|
Ovanstående skript skapar ett icke-grupperat index i kolumnen ”namn” i studenttabellen. Indexet sorterar efter namn i stigande ordning. Som vi sa tidigare kommer tabelldata och index att lagras på olika platser. Tabellposterna kommer att sorteras med ett klusterindex om det finns en. Indexet sorteras enligt dess definition och kommer att lagras separat från bordet.
Data för studenttabeller:
IX_tblStudent_Name Indexdata
namn | Radadress |
Alan | Radadress |
Elis | Radadress |
Jolly | Radadress |
Jon | Radadress |
Joseph | Radadress |
Kate | Radadress |
Laura | Radadress |
Möss | Radadress |
Sara | Radadress |
Wise | Radadress |
Meddelande , här i indexet har varje rad en kolumn som lagrar adressen till raden som namnet tillhör. Så om en fråga skickas för att hämta kön och DOB för den student som heter ”Jon”, kommer databasen först att söka efter namnet ”Jon” i indexet. Den läser sedan radadressen till ”Jon” och går direkt till den raden i ”student” -tabellen för att hämta kön och DOB för Jon.
Slutsats
Från diskussionen Vi hittar följande skillnader mellan klustrade och icke-klusterade index.
- Det kan bara finnas ett klusterindex per tabell. Du kan dock skapa flera icke-klustrade index i en enda tabell.
- Klusterade index sorterar bara tabeller. Därför förbrukar de inte extra lagring. Icke-klustrade index lagras på en separat plats från den faktiska tabellen och kräver mer lagringsutrymme.
- Klustrade index är snabbare än icke-klustrade index eftersom de inte innebär något extra uppslagssteg.
Andra fantastiska artiklar från Ben
Skillnad mellan identitet & Sekvens i SQL Server
Vad är skillnaden mellan klustrade och icke-klustrade index i SQL Server?
- Författare
- Senaste inlägg
Visa alla inlägg av Ben Richardson
- Power BI: Waterfall Charts and Combined Visuals – 19 januari 2021
- Power BI : Villkorlig formatering och datafärger i aktion – 14 januari 2021
- Power BI: Importera data från SQL Server och MySQL – 12 januari 2021
573,279 visningar
© 2021 Quest Software Inc. ALLA Rättigheter reserverade. | GDPR | Användarvillkor | Sekretess