SQLShack (Italiano)
Gli indici vengono utilizzati per accelerare il processo di query in SQL Server, risultando prestazione. Sono simili agli indici dei libri di testo. Nei libri di testo, se hai bisogno di andare a un particolare capitolo, vai all’indice, trova il numero di pagina del capitolo e vai direttamente a quella pagina. Senza gli indici, il processo di ricerca del capitolo desiderato sarebbe stato molto lento.
Lo stesso vale per gli indici nei database. Senza indici, un DBMS deve passare attraverso tutti i record nella tabella per recuperare i risultati desiderati. Questo processo è chiamato scansione delle tabelle ed è estremamente lento. D’altra parte, se si creano indici, il database va prima a quell’indice e poi recupera direttamente i record della tabella corrispondente.
Esistono due tipi di indici in SQL Server:
- Indice cluster
- Indice non cluster
Indice cluster
Un indice cluster definisce l’ordine in cui i dati vengono archiviati fisicamente in una tabella. I dati della tabella possono essere ordinati in un unico modo, quindi può esserci un solo indice cluster per tabella. In SQL Server, il vincolo di chiave primaria crea automaticamente un indice cluster su quella particolare colonna.
Diamo un’occhiata. Per prima cosa, crea una tabella “studente” all’interno di “schooldb” eseguendo il seguente script o assicurati che il tuo database sia completamente sottoposto a backup se stai utilizzando i tuoi dati in tempo reale:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
CREATE DATABASE schooldb
CREATE TABLE studente
(
id INT PRIMARY KEY,
name VARCHAR (50) NOT NULL,
sesso VARCHAR (50) NOT NULL,
DOB datetime NOT NULL,
total_score INT NOT NULL,
città VARCHAR (50) NOT NULL
)
|
Avviso qui nella tavola “studentesca” abbiamo messo prima ry key vincolo sulla colonna “id”. Questo crea automaticamente un indice cluster sulla colonna “id”. Per vedere tutti gli indici su una particolare tabella, eseguire la procedura memorizzata “sp_helpindex”. Questa procedura memorizzata accetta il nome della tabella come parametro e recupera tutti gli indici della tabella. La seguente query recupera gli indici creati nella tabella degli studenti.
1
2
3
4
5
|
USO schooldb
EXECUTE sp_helpindex student
|
La query precedente restituirà questo risultato:
index_name | index_description | index_keys |
PK__student__3213E83F7F60ED59 | clustered, unica, chiave primaria situata su PRIMARY | id |
Nell’output puoi vedere l’unico indice. Questo è l’indice che è stato creato automaticamente a causa del vincolo di chiave primaria nella colonna “id”.
Questo indice cluster memorizza il record nella tabella degli studenti in ordine crescente di “id”. Pertanto, se il record inserito ha l’id 5, il record verrà inserito nella quinta riga della tabella anziché nella prima riga. Allo stesso modo, se il quarto record ha un id di 3, verrà inserito nella terza riga anziché nella quarta riga. Questo perché l’indice cluster deve mantenere l’ordine fisico dei record archiviati in base alla colonna indicizzata, ovvero id. Per vedere questo ordine in azione, eseguire il seguente script:
Lo script precedente inserisce dieci record nella tabella degli studenti. Notare che qui i record vengono inseriti in ordine casuale dei valori nella colonna “id”, ma a causa dell’indice cluster predefinito sulla colonna id, i record vengono memorizzati fisicamente in ordine crescente dei valori nella colonna “id”. Eseguire la seguente istruzione SELECT per recuperare i record dalla tabella degli studenti.
1
2
3
4
5
|
USA schooldb
SELEZIONA * DA studente
|
I record verranno recuperati nel seguente ordine:
Creazione di un indice cluster personalizzato
È possibile creare il proprio indice personalizzato nonché l’indice cluster predefinito. Per creare un nuovo indice cluster su una tabella, devi prima eliminare l’indice precedente.
Per eliminare un indice, vai a “Esplora oggetti- > Database- > Nome_database- > Tabelle- > Table_Name – > Indici”. Fai clic con il pulsante destro del mouse sull’indice che desideri eliminare e seleziona ELIMINA . Guarda lo screenshot qui sotto.
Ora, per creare un nuovo indice cluster, eseguire il seguente script:
1
2
3
4
5
6
|
usa schooldb
CREA INDICE CLUSTERATO IX_tblStudent_Gender_Score
ON studente (genere ASC, total_score DESC)
|
Il processo di creazione L’indice clusterizzato è simile a un indice normale con un’eccezione. Con l’indice cluster, è necessario utilizzare la parola chiave “CLUSTER” prima di “INDICE”.
Lo script precedente crea un indice cluster denominato “IX_tblStudent_Gender_Score” nella tabella degli studenti. Questo indice viene creato nelle colonne “gender” e “total_score”. Viene chiamato un indice creato su più di una colonna “indice composito”.
L’indice precedente ordina prima tutti i record in ordine crescente in base al sesso. Se il sesso è lo stesso per due o più record, i record vengono ordinati in ordine decrescente di valori nella loro colonna “total_score”. Puoi anche creare un indice cluster su una singola colonna. Ora se selezioni tutti i record dal tabella studenti, verranno recuperati nel seguente ordine:
Indici non cluster
Un indice non cluster non ordina i dati fisici all’interno della tabella. In effetti, un L’indice non cluster viene archiviato in un punto e i dati della tabella in un altro. È simile a un libro di testo in cui il contenuto del libro si trova in un punto e l’indice in un altro. Ciò consente più di un indice per tabella.
È importante ricordare qui che all’interno della tabella i dati verranno ordinati in base a un indice cluster. Tuttavia, all’interno dell’indice non cluster i dati vengono memorizzati nell’ordine specificato. L’indice contiene valori di colonna su cui viene creato l’indice e indirizzo del record a cui appartiene il valore di colonna.
Quando viene eseguita una query su una colonna su cui è stato creato l’indice, il database andrà prima all’indice e cercherà l’indirizzo della riga corrispondente nella tabella. Andrà quindi a quell’indirizzo di riga e recupererà altri valori di colonna. È a causa di questo passaggio aggiuntivo che gli indici non cluster sono più lenti degli indici cluster.
Creazione di un indice non cluster
La sintassi per la creazione di un indice non cluster è simile a quello dell’indice cluster. Tuttavia, in caso di indice non cluster, la parola chiave “NONCLUSTER” viene utilizzata al posto di “CLUSTER”. Dai un’occhiata al seguente script.
1
2
3
4
5
6
|
usa schooldb
CREA INDICE NON CLASSIFICATO IX_tblStudent_Name
ON studente (nome ASC)
|
Lo script precedente crea un indice non cluster nella colonna “nome” della tabella degli studenti. L’indice ordina per nome in ordine crescente. Come abbiamo detto in precedenza, i dati e l’indice della tabella verranno archiviati in luoghi diversi. I record della tabella verranno ordinati in base a un indice cluster, se presente. L’indice verrà ordinato in base alla sua definizione e verrà archiviato separatamente dal tavolo.
Dati tabella studenti:
IX_tblStudent_Name Index Data
nome | Indirizzo riga |
Alan | Indirizzo riga |
Elis | Indirizzo riga |
Jolly | Indirizzo riga |
Jon | Indirizzo riga |
Joseph | Indirizzo riga |
Kate | Indirizzo riga |
Laura | Indirizzo riga |
Mouse | Indirizzo riga |
Sara | Indirizzo riga |
Saggio | Indirizzo riga |
Avviso , qui nell’indice ogni riga ha una colonna che memorizza l’indirizzo della riga a cui appartiene il nome. Quindi, se viene eseguita una query per recuperare il sesso e il DOB dello studente denominato “Jon”, il database cercherà prima il nome “Jon” all’interno dell’indice. Quindi leggerà l’indirizzo della riga di “Jon” e andrà direttamente a quella riga nella tabella “student” per recuperare il sesso e il DOB di Jon.
Conclusione
Dalla discussione troviamo le seguenti differenze tra indici cluster e non cluster.
- Può esserci un solo indice cluster per tabella. Tuttavia, puoi creare più indici non cluster su una singola tabella.
- Gli indici cluster ordinano solo le tabelle. Pertanto, non consumano spazio di archiviazione aggiuntivo. Gli indici non cluster vengono archiviati in una posizione separata dalla tabella effettiva che richiede più spazio di archiviazione.
- Gli indici cluster sono più veloci degli indici non cluster poiché non comportano alcun passaggio di ricerca aggiuntivo.
Altri fantastici articoli di Ben
Differenza tra Identity & Sequenza in SQL Server
Qual è la differenza tra gli indici cluster e non cluster in SQL Server?
- Autore
- Post recenti
Visualizza tutti i post di Ben Richardson
- Power BI: grafici a cascata e immagini combinate – 19 gennaio 2021
- Power BI : Formattazione condizionale e colori dei dati in azione – 14 gennaio 2021
- Power BI: importazione di dati da SQL Server e MySQL – 12 gennaio 2021
573.279 visualizzazioni
© 2021 Quest Software Inc. TUTTI I DIRITTI RISERVATI. | GDPR | Termini di utilizzo | Privacy