sql >> Database >  >> RDS >> Sqlserver

Wanneer geclusterde of niet-geclusterde indexen gebruiken in SQL Server?

Database-indexen worden gebruikt om de snelheid van databasebewerkingen in een tabel met een groot aantal records te verbeteren. Database-indexen (zowel geclusterde indexen als niet-geclusterde indexen) lijken qua functionaliteit vrij veel op boekindexen. Met een boekenindex kunt u direct naar de verschillende onderwerpen die in het boek worden besproken gaan. Als u naar een specifiek onderwerp wilt zoeken, gaat u gewoon naar index, zoekt u het paginanummer dat het onderwerp bevat dat u zoekt en kunt u vervolgens rechtstreeks naar die pagina gaan. Zonder index zou je het hele boek moeten doorzoeken.

Database-indexen werken op dezelfde manier. Zonder indexen zou u de hele tabel moeten doorzoeken om een ​​specifieke databasebewerking uit te voeren. Met indexen hoeft u niet door alle tabelrecords te bladeren. De index verwijst u rechtstreeks naar de record waarnaar u zoekt, waardoor de uitvoeringstijd van uw query aanzienlijk wordt verkort.

SQL Server-indexen kunnen worden onderverdeeld in twee hoofdtypen:

  1. Geclusterde indexen
  2. Niet-geclusterde indexen

In dit artikel zullen we bekijken wat geclusterde en niet-geclusterde indexen zijn, hoe ze worden gemaakt en wat de belangrijkste verschillen tussen de twee zijn. We zullen ook bekijken wanneer geclusterde of niet-geclusterde indexen in SQL Server moeten worden gebruikt.

Laten we eerst beginnen met een geclusterde index.

Geclusterde index

Een geclusterde index is een index die de fysieke volgorde definieert waarin tabelrecords in een database worden opgeslagen. Aangezien er maar één manier kan zijn waarop records fysiek in een databasetabel worden opgeslagen, kan er slechts één geclusterde index per tabel zijn. Standaard wordt er een geclusterde index gemaakt op een primaire sleutelkolom.

Standaard geclusterde indexen

Laten we een dummytabel maken met een primaire sleutelkolom om de standaard geclusterde index te zien. Voer het volgende script uit:

CREATE DATABASE Hospital

CREATE TABLE Patients
(
id INT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
gender VARCHAR(50) NOT NULL,
age INT NOT NULL
)

Het bovenstaande script maakt een dummy-database Hospital aan. De database heeft 4 kolommen:id, naam, geslacht, leeftijd. De ID-kolom is de primaire sleutelkolom. Wanneer het bovenstaande script wordt uitgevoerd, wordt automatisch een geclusterde index gemaakt op de id-kolom. Om alle indexen in een tabel te zien, kunt u de "sp_helpindex" opgeslagen procedure gebruiken.

USE Hospital
EXECUTE sp_helpindex Patients

Hier is de uitvoer:

U kunt de indexnaam, beschrijving en de kolom zien waarop de index is gemaakt. Als u een nieuw record toevoegt aan de tabel Patiënten, wordt deze opgeslagen in oplopende volgorde van de waarde in de id-kolom. Als het eerste record dat u in de tabel invoegt een id van drie heeft, wordt het record in de derde rij opgeslagen in plaats van in de eerste rij, aangezien de geclusterde index de fysieke volgorde handhaaft.

Aangepaste geclusterde indexen

U kunt uw eigen geclusterde indexen maken. Voordat u dat kunt doen, moet u echter de bestaande geclusterde index maken. We hebben één geclusterde index vanwege de primaire sleutelkolom. Als we de primaire sleutelbeperking verwijderen, wordt het standaardcluster verwijderd. Het volgende script verwijdert de primaire sleutelbeperking.

USE Hospital
ALTER TABLE Patients
DROP CONSTRAINT PK__Patients__3213E83F3DFAFAAD
GO

Het volgende script maakt een aangepaste index "IX_tblPatient_Age" in de leeftijdskolom van de tabel Patiënten. Dankzij deze index worden alle records in de tabel Patiënten opgeslagen in oplopende volgorde van leeftijd.


use Hospital
CREATE CLUSTERED INDEX IX_tblPatient_Age
ON Patients(age ASC)

Laten we nu een paar dummy-records toevoegen aan de tabel Patiënten om te zien of ze daadwerkelijk in oplopende volgorde van leeftijd zijn ingevoegd:

USE Hospital

INSERT INTO Patients

VALUES
(1, 'Sara', 'Female', 34),
(2, 'Jon', 'Male', 20),
(3, 'Mike', 'Male', 54),
(4, 'Ana', 'Female', 10),
(5, 'Nick', 'Female', 29)

In het bovenstaande script voegen we 5 dummy-records toe. Let op de waarden voor de kolom leeftijd. Ze hebben willekeurige waarden en staan ​​niet in een logische volgorde. Omdat we echter een geclusterde index hebben gemaakt, worden de records daadwerkelijk in oplopende volgorde van de waarde in de leeftijdskolom ingevoegd. U kunt dit verifiëren door alle records uit de tabel Patiënten te selecteren.

SELECT * FROM Patients

Hier is de uitvoer:

U kunt zien dat records zijn gerangschikt in oplopende volgorde van de waarden in de leeftijdskolom.

Niet-geclusterde indexen

Een niet-geclusterde index wordt ook gebruikt om zoekacties te versnellen. In tegenstelling tot een geclusterde index, definieert een niet-geclusterde index niet fysiek de volgorde waarin records in een tabel worden ingevoegd. In feite wordt een niet-geclusterde index opgeslagen op een andere locatie dan de gegevenstabel. Een niet-geclusterde index is als een boekenindex, die zich los van de hoofdinhoud van het boek bevindt. Aangezien niet-geclusterde indexen zich op een aparte locatie bevinden, kunnen er meerdere niet-geclusterde indexen per tabel zijn.

Om een ​​niet-geclusterde index te maken, moet u de instructie "CREATE NONCLUSTERED" gebruiken. De rest van de syntaxis blijft hetzelfde als de syntaxis voor het maken van een geclusterde index. Het volgende script maakt een niet-geclusterde index "IX_tblPatient_Name" die de records in oplopende volgorde van de naam sorteert.

use Hospital
CREATE NONCLUSTERED INDEX IX_tblPatient_Name
ON Patients(name ASC)

Het bovenstaande script zal een index maken die de namen van de patiënten en het adres van hun corresponderende records bevat, zoals hieronder weergegeven:

Naam Record Address
Ana Record Address
Jon Record Address
Mike Record Address
Nick Record Address
Sara Record Address

Hier is het "Recordadres" in elke rij de verwijzing naar de werkelijke tabelrecords voor de patiënten met bijbehorende namen.

Als u bijvoorbeeld de leeftijd en het geslacht van de patiënt met de naam "Mike" wilt ophalen, zoekt de database eerst naar "Mick" in de niet-geclusterde index "IX_tblPatient_Name" en haalt uit de niet-geclusterde index de werkelijke recordreferentie op en zal dat gebruiken om de werkelijke leeftijd en het geslacht van de patiënt met de naam "Mike" terug te geven

Aangezien een database twee zoekopdrachten moet uitvoeren, eerst in de niet-geclusterde index en vervolgens in de eigenlijke tabel, kunnen niet-geclusterde indexen langzamer zijn voor zoekbewerkingen. Voor INSERT- en UPDATE-bewerkingen zijn niet-geclusterde indexen echter sneller omdat de volgorde van de records alleen in de index hoeft te worden bijgewerkt en niet in de eigenlijke tabel.

Wanneer geclusterde of niet-geclusterde indexen gebruiken

Nu u de verschillen kent tussen een geclusterde en een niet-geclusterde index, laten we eens kijken naar de verschillende scenario's voor het gebruik van elk van hen.

1. Aantal indexen

Dit is vrij duidelijk. Als u meerdere indexen in uw database moet maken, kies dan voor een niet-geclusterde index, aangezien er maar één geclusterde index kan zijn.

2. KIES bewerkingen

Als u alleen de indexwaarde wilt selecteren die wordt gebruikt om te maken en te indexeren, zijn niet-geclusterde indexen sneller. Als u bijvoorbeeld een index hebt gemaakt in de kolom "naam" en u alleen de naam wilt selecteren, zullen niet-geclusterde indexen de naam snel retourneren.

Als u echter andere kolomwaarden wilt selecteren, zoals leeftijd, geslacht met behulp van de naamindex, zal de SELECT-bewerking langzamer zijn omdat eerst de naam wordt gezocht in de index en vervolgens de verwijzing naar het werkelijke tabelrecord wordt gebruikt om te zoeken de leeftijd en het geslacht.

Aan de andere kant, met geclusterde indexen, aangezien alle records al zijn gesorteerd, is de SELECT-bewerking sneller als de gegevens worden geselecteerd uit andere kolommen dan de kolom met geclusterde index.

3. INSERT/UPDATE-bewerkingen

De INSERT- en UPDATE-bewerkingen zijn sneller met niet-geclusterde indexen, aangezien de werkelijke records niet hoeven te worden gesorteerd wanneer een INSERT- of UPDATE-bewerking wordt uitgevoerd. In plaats daarvan moet alleen de niet-geclusterde index worden bijgewerkt.

4. Schijfruimte

Aangezien niet-geclusterde indexen worden opgeslagen op een andere locatie dan de oorspronkelijke tabel, nemen niet-geclusterde indexen extra schijfruimte in beslag. Als schijfruimte een probleem is, gebruik dan een geclusterde index.

5. Eindoordeel

Als vuistregel moet elke tabel minstens één geclusterde index hebben, bij voorkeur op de kolom die wordt gebruikt voor het SELECTEREN van records en die unieke waarden bevat. De primaire sleutelkolom is een ideale kandidaat voor een geclusterde index.

Aan de andere kant moeten kolommen die vaak betrokken zijn bij INSERT- en UPDATE-query's een niet-geclusterde index hebben, ervan uitgaande dat schijfruimte geen probleem is.


  1. Hoe kan ik gegevens in twee tabellen tegelijk INVOEREN in SQL Server?

  2. Rijdoelen, deel 4:Het anti-join-antipatroon

  3. Hoe verander je 2 zoekopdrachten met gemeenschappelijke kolommen (A, B) en (A, C) in slechts één (A, B, C)?

  4. Hoe de Power()-functie werkt in PostgreSQL