Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Gäller för:SQL Server
Azure SQL Database
Azure SQL Managed Instance
SQL-databas i Förhandsversion av 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 SQL Server att hitta raden eller raderna som är associerade med nyckelvärdena snabbt och effektivt.
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 följande typer av index:
Clustered
- 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. Det kan bara finnas ett grupperat index per tabell, eftersom själva dataraderna bara kan lagras i 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 för en klustrad tabell. Om en tabell inte har något grupperat index lagras dess datarader i en osorterad struktur som kallas heap.
Nonclustered
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).
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.
Se Index för fler typer av specialindex.
Index och begränsningar
SQL Server skapar automatiskt index när PRIMARY KEY och UNIQUE begränsningar definieras i tabellkolumner. När du till exempel skapar en tabell med en UNIQUE begränsning skapar Databasmotorn automatiskt ett icke-grupperat index. Om du konfigurerar en PRIMARY KEYskapar databasmotorn automatiskt ett klustrat index, såvida inte ett klustrat index redan finns. När du försöker framtvinga en PRIMARY KEY begränsning för en befintlig tabell och det redan finns ett klustrat index i den tabellen, tillämpar SQL Server primärnyckeln med hjälp av ett icke-grupperat index.
Mer information finns i Skapa primära nycklar och Skapa unika begränsningar.
Hur index används av frågeoptimeraren
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 AdventureWorks2022 databasen. När den här frågan körs 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 tabellgenomsökning eller genomsöka ett eller flera index om de 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. Din uppgift är att utforma och skapa index som passar bäst för din miljö så att frågeoptimeraren har ett urval av effektiva index att välja mellan. SQL Server tillhandahåller Database Engine Tuning Advisor för att hjälpa till med analysen av din databasmiljö och valet av lämpliga index.
Important
Mer information om riktlinjer och interna indexdesign finns i arkitekturen och designguiden för SQL Server- och Azure SQL-index.