- 02/11/2019
- 4 minuten om te lezen
-
- M
- M
- C
- M
- r
-
+9
Is van toepassing op: SQL Server (alle ondersteunde versies) Azure SQL-database
Een index is een structuur op de schijf die is gekoppeld aan een tabel of weergave die het ophalen van rijen uit de tabel of weergave versnelt. Een index bevat sleutels die zijn opgebouwd uit een of meer kolommen in de tabel of weergave. Deze sleutels worden opgeslagen in een structuur (B-boom) waardoor SQL Server de rij of rijen die aan de sleutelwaarden zijn gekoppeld snel en efficiënt kan vinden.
Een tabel of weergave kan de volgende soorten indexen bevatten:
-
Geclusterd
- Geclusterde indexen sorteren en slaan de gegevensrijen op in de tabel of weergave op basis van hun sleutelwaarden. Dit zijn de kolommen die zijn opgenomen in de indexdefinitie. Er kan slechts één geclusterde index per tabel zijn, omdat de gegevensrijen zelf in slechts één volgorde kunnen worden opgeslagen.
- De enige keer dat de gegevensrijen in een tabel in gesorteerde volgorde worden opgeslagen, is wanneer de tabel een geclusterde index bevat. Als een tabel een geclusterde index heeft, wordt de tabel een geclusterde tabel genoemd. Als een tabel geen geclusterde index heeft, worden de gegevensrijen opgeslagen in een ongeordende structuur die een heap wordt genoemd.
-
Niet-geclusterd
-
Niet-geclusterde indexen hebben een structuur die los staat van de gegevensrijen. Een niet-geclusterde index bevat de niet-geclusterde indexsleutelwaarden en elke sleutelwaarde-invoer heeft een pointer naar de gegevensrij die de sleutelwaarde bevat.
-
De pointer van een indexrij in een niet-geclusterde index naar een gegevensrij wordt een rijlocator genoemd. De structuur van de rijlocator hangt af van het feit of de gegevenspagina’s in een heap of in een geclusterde tabel zijn opgeslagen. Voor een hoop is een rij-locator een aanwijzer naar de rij. Voor een geclusterde tabel is de rijlocator de geclusterde indexsleutel.
-
U kunt niet-sleutelkolommen toevoegen aan het bladniveau van de niet-geclusterde index om bestaande indexsleutellimieten te omzeilen, en voer volledig gedekte, geïndexeerde zoekopdrachten uit. Zie Indexen maken met opgenomen kolommen voor meer informatie. Zie Maximale capaciteitsspecificaties voor SQL Server voor details over limieten voor indexsleutels.
-
Zowel geclusterde als niet-geclusterde indexen kunnen uniek zijn. Dit betekent dat geen twee rijen dezelfde waarde kunnen hebben voor de indexsleutel. Anders is de index niet uniek en kunnen meerdere rijen dezelfde sleutelwaarde delen. Voor meer informatie, zie Unieke indexen maken.
Indexen worden automatisch bijgehouden voor een tabel of weergave wanneer de tabelgegevens worden gewijzigd.
Zie Indexen voor aanvullende soorten indexen voor speciale doeleinden.
Indexen en beperkingen
Indexen worden automatisch aangemaakt wanneer PRIMAIRE SLEUTEL en UNIEKE beperkingen worden gedefinieerd op tabelkolommen. Als u bijvoorbeeld een tabel maakt met een UNIEKE beperking, maakt Database Engine automatisch een niet-geclusterde index. Als u een PRIMAIRE SLEUTEL configureert, maakt Database Engine automatisch een geclusterde index, tenzij er al een geclusterde index bestaat. Wanneer u een PRIMARY KEY-beperking probeert af te dwingen op een bestaande tabel en er bestaat al een geclusterde index in die tabel, dwingt SQL Server de primaire sleutel af met een niet-geclusterde index.
Zie Primaire sleutels maken en voor meer informatie. Creëer unieke beperkingen.
Hoe indexen worden gebruikt door de Query Optimizer
Goed ontworpen indexen kunnen schijf-I / O-bewerkingen verminderen en minder systeembronnen verbruiken, waardoor de queryprestaties worden verbeterd. Indexen kunnen nuttig zijn voor een verscheidenheid aan query’s die SELECT-, UPDATE-, DELETE- of MERGE-instructies bevatten. Beschouw de zoekopdracht SELECT Title, HireDate FROM HumanResources.Employee WHERE EmployeeID = 250
in de AdventureWorks2012-database. Wanneer deze query wordt uitgevoerd, evalueert de query-optimizer elke beschikbare methode voor het ophalen van de gegevens en selecteert de meest efficiënte methode. De methode kan een tabelscan zijn, of kan een of meer indexen scannen, indien deze bestaan.
Bij het uitvoeren van een tabelscan leest de queryoptimalisatie alle rijen in de tabel en extraheert de rijen die voldoen aan de criteria van de zoekopdracht. Een tabelscan genereert veel schijf-I / O-bewerkingen en kan resource-intensief zijn. Een tabelscan kan echter de meest efficiënte methode zijn als de resultatenset van de query bijvoorbeeld een hoog percentage rijen uit de tabel is.
Wanneer het queryoptimalisatieprogramma een index gebruikt, zoekt het de index-sleutelkolommen, vindt de opslaglocatie van de rijen die nodig zijn voor de query en haalt de overeenkomende rijen uit die locatie. Over het algemeen is het doorzoeken van de index veel sneller dan het doorzoeken van de tabel, omdat in tegenstelling tot een tabel een index vaak zeer weinig kolommen per rij bevat en de rijen in gesorteerde volgorde staan.
De query-optimizer selecteert doorgaans de meest efficiënte methode bij het uitvoeren van query’s. Als er echter geen indexen beschikbaar zijn, moet de queryoptimalisatie een tabelscan gebruiken. Het is uw taak om indexen te ontwerpen en te maken die het meest geschikt zijn voor uw omgeving, zodat de query-optimalisator een selectie efficiënte indexen heeft waaruit u kunt kiezen. SQL Server biedt de Database Engine Tuning Advisor om te helpen bij de analyse van uw databaseomgeving en bij de selectie van geschikte indexen.
Belangrijk
Voor meer informatie over richtlijnen voor het ontwerpen van indexen en internals, zie de SQL Server Index Design Guide.
- SQL Server Index Design Guide
- Creëer geclusterde indexen
- Creëer niet-geclusterde Indexen