Grupperade och icke-grupperade index

Gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL-databas i Microsoft Fabric

Ett index är en struktur på disken som är associerad med en tabell eller vy som påskyndar hämtningen av rader från tabellen eller vyn. Ett index innehåller nycklar som skapats från en eller flera kolumner i tabellen eller vyn. Dessa nycklar lagras i en struktur (B-träd) som gör det möjligt för Databasmotor för SQL Server att snabbt och effektivt hitta raden eller raderna kopplade till nyckelvärdena.

Note

I dokumentationen används termen B-träd vanligtvis som referens till index. I radlagringsindex implementerar databasmotorn ett B+-träd. Detta gäller inte för kolumnlagringsindex eller index i minnesoptimerade tabeller. Mer information finns i arkitekturen och designguiden för SQL Server och Azure SQL-index.

En tabell eller vy kan innehålla klustrade och icke-klustrade index.

Både klustrade och icke-grupperade index kan vara unika. Med ett unikt index kan inga två rader ha samma värde för indexnyckeln. Annars är indexet inte unikt och flera rader kan dela samma nyckelvärde. Mer information finns i Skapa ett unikt index.

Index underhålls automatiskt för en tabell eller vy när tabelldata ändras.

För fler typer av specialindex, inklusive index på minnesoptimerade tabeller, se Index.

Klusterindex

Grupperade index sorterar och lagrar dataraderna i tabellen eller vyn baserat på deras nyckelvärden. Dessa nyckelvärden är de kolumner som ingår i indexdefinitionen. Du kan bara ha ett klustrat index per tabell, eftersom dataraderna själva kan lagras i endast en ordning.

Den enda gången dataraderna i en tabell lagras i sorterad ordning är när tabellen innehåller ett grupperat index. När en tabell har ett klustrat index kallas tabellen en klustrad tabell. Om en tabell inte har något klustrat index lagras dess datarader i en oordnad struktur som kallas en heap.

Icke-grupperade index

Icke-grupperade index har en struktur som är separat från dataraderna. Ett icke-klustrat index innehåller de icke-klustrade indexnyckelvärdena och varje nyckelvärdespost har en pekare till dataraden som innehåller nyckelvärdet.

Pekaren från en indexrad i ett icke-grupperat index till en datarad kallas för en radlokaliserare. Strukturen för radlokaliseraren beror på om datasidorna lagras i en heap eller en klustrad tabell. För en heap är radlokaliseraren en pekare till raden. För en klustrad tabell är radlokaliseraren den klustrade indexnyckeln.

Du kan lägga till icke-nyckelkolumner på lövnivån för det icke-klustrade indexet för att kringgå befintliga indexnyckelgränser och köra fullständigt täckande frågor. Mer information finns i Skapa index med inkluderade kolumner. Mer information om indexnyckelgränser finns i Maximum capacity specifications for SQL Server (Maximal kapacitetsspecifikation för SQL Server).

Index och begränsningar

Database Engine skapar automatiskt index när du definierar PRIMARY KEY och UNIQUE begränsningar på tabellkolumner. Till exempel, när du skapar en tabell med en UNIQUE begränsning, skapar Database Engine automatiskt ett icke-klustrat index. Om du konfigurerar en PRIMARY KEY, skapar Database Engine automatiskt ett klustrat index, om inte ett klustrat index redan existerar. När du försöker upprätthålla en PRIMARY KEY begränsning på en befintlig tabell och ett klustrat index redan finns i den tabellen, upprätthåller Database Engine primärnyckeln genom att använda ett icke-klustrat index.

Mer information finns i Skapa primära nycklar och Skapa unika begränsningar.

Hur frågeoptimeraren använder index

Väl utformade index kan minska diskens I/O-åtgärder och förbruka färre systemresurser. Därför förbättrar dessa index frågeprestanda. Index kan vara till hjälp för olika frågor som innehåller SELECT, UPDATE, DELETEeller MERGE -instruktioner. Överväg frågan SELECT JobTitle, HireDate FROM HumanResources.Employee WHERE BusinessEntityID = 250 i AdventureWorks2025 databasen. När du kör denna fråga utvärderar frågeoptimeraren varje tillgänglig metod för att hämta data och väljer den mest effektiva metoden. Metoden kan vara en tabellskanning, eller så kan det vara att skanna ett eller flera index om sådana finns.

Under en tabellgenomsökning läser frågeoptimeraren alla rader i tabellen och extraherar de rader som uppfyller frågans villkor. En tabellgenomsökning genererar många disk-I/O-åtgärder och kan vara resursintensiva. En tabellgenomsökning kan dock vara den mest effektiva metoden om till exempel resultatuppsättningen för frågan är en hög procentandel rader från tabellen.

När frågeoptimeraren använder ett index söker den igenom indexnyckelkolumnerna, hittar lagringsplatsen för de rader som behövs av frågan och extraherar matchande rader från den platsen. I allmänhet går det mycket snabbare att söka i indexet än att söka i tabellen. Till skillnad från en tabell innehåller ett index ofta mycket få kolumner per rad och raderna är i sorterad ordning.

Frågeoptimeraren väljer vanligtvis den mest effektiva metoden när frågor körs. Men om inga index är tillgängliga måste frågeoptimeraren använda en tabellgenomsökning. Du behöver designa och skapa index som passar din miljö bäst så att frågeoptimeraren har ett urval av effektiva index att välja från. Database Engine tillhandahåller Database Engine Tuning Advisor för att hjälpa till med analysen av din databasmiljö och med valet av lämpliga index.

När ett lämpligt index saknas noterar optimeraren förslaget i körningsplanerna och i de dynamiska hanteringsvyerna för saknade index. Om du vill följa de förslagen, se Justera icke-klustrade index med förslag på saknade index.

Note

Ett inaktiverat index finns kvar i metadata, men optimeraren ignorerar det tills du bygger om det. Mer information finns i Inaktivera index och begränsningar och Aktivera index och begränsningar.

För mer information om indexdesignriktlinjer och interna funktioner, se Indexarkitektur och designguide.