Relazione tra chiave primaria e indice cluster


91

Può TABLEavere una chiave primaria senza un indice cluster?

E può TABLEavere un indice cluster senza avere una chiave primaria?

Qualcuno può dirmi brevemente la relazione tra chiave primaria e indice cluster?

Risposte:


102

Una chiave primaria è un concetto logico : è l'identificatore univoco di una riga in una tabella. In quanto tale, ha una serie di attributi: potrebbe non essere nullo e deve essere univoco. Ovviamente, poiché è probabile che tu stia cercando molto i record in base al loro identificatore univoco, sarebbe bene avere un indice sulla chiave primaria.

Un indice cluster è un concetto fisico : è un indice che influisce sull'ordine in cui i record vengono archiviati sul disco. Ciò lo rende un indice molto veloce durante l'accesso ai dati, sebbene possa rallentare le scritture se la chiave primaria non è un numero sequenziale.

Sì, puoi avere una chiave primaria senza un indice cluster e, a volte, potresti volerlo (ad esempio quando la tua chiave primaria è una combinazione di chiavi esterne su una tabella di join e non vuoi incorrere nel sovraccarico di shuffle del disco durante la scrittura).

Sì, puoi creare un indice cluster su colonne che non sono una chiave primaria.


1
Ciao. L'argomento è vecchio, ma forse qualcuno può rispondere alla mia domanda. Se la colonna è dichiarata come INDICE UNICO CLUSTER NON NULLO, rendendola PRIMARY KEY cambierà effettivamente le prestazioni o altro?
jesse

Questa è una domanda interessante. Presumo di no, dal momento che deve eseguire tutti gli stessi controlli in entrambi i casi.
Jonathan Allen

Risposta brillante.
NikosV

Ma soprattutto , una colonna chiave primaria con un indice cluster sarà utile poiché semplifica molto la ricerca dell'intervallo.
hunter_tech

33

Una tabella può avere una chiave primaria non cluster e una tabella cluster non richiede una chiave primaria. Quindi la risposta a entrambe le domande è sì.

Un indice cluster archivia tutte le colonne a livello foglia. Ciò significa che un indice cluster contiene tutti i dati nella tabella. Una tabella senza un indice cluster è chiamata heap.

Una chiave primaria è un indice univoco raggruppato per impostazione predefinita. Per impostazione predefinita, quando crei una chiave primaria, se la tabella non è ancora in cluster, la chiave primaria verrà creata come indice univoco cluster. A meno che tu non specifichi esplicitamente l' nonclusteredopzione.

Un esempio, dove t1ha una chiave primaria t2non cluster e non è in cluster ma ha una chiave primaria:

create table t1 (id int not null, col1 int);
alter table t1 add constraint PK_T1 primary key nonclustered (id);
create clustered index IX_T1_COL1 on t1 (col1);

create table t2 (id int not null, col1 int);
alter table t2 add constraint PK_T2 primary key nonclustered (id);

Esempio in SQL Fiddle.


18

Prima di tutto, dai un'occhiata alle tabelle organizzate in base agli indici e agli indici raggruppati . In realtà, vi consiglio di leggere l'intero Use the Index Luke! sito dall'inizio fino a raggiungere l'argomento del clustering per capire veramente cosa sta succedendo.

Ora, alle tue domande ...


Una TABELLA può avere una chiave primaria senza un indice cluster?

Sì, utilizza la parola chiave NONCLUSTER quando dichiari la tua chiave primaria per creare una tabella basata sull'heap. Per esempio:

CREATE TABLE YOUR_TABLE (
    YOUR_PK int PRIMARY KEY NONCLUSTERED
    -- Other fields...
);

Questo è un peccato, poiché molte persone sembrano accettare semplicemente l'impostazione predefinita (che è CLUSTER), anche se in molti casi una tabella basata su heap sarebbe effettivamente migliore (come discusso nell'articolo collegato).


e una TABELLA può avere un indice cluster senza chiave primaria?

A differenza di altri DBMS, MS SQL Server ti consentirà di avere un indice di clustering diverso dalla chiave primaria, o anche senza avere la chiave primaria.

L'esempio seguente crea un indice di clustering separato dal PK, che ha un vincolo UNIQUE sopra di esso, che è quello che probabilmente vorresti nella maggior parte dei casi:

CREATE TABLE YOUR_TABLE (
    YOUR_PK int PRIMARY KEY,
    YOUR_CLUSTERED_KEY int NOT NULL UNIQUE CLUSTERED
    -- Other fields...
);

Se scegli un indice di clustering non univoco (utilizzando CREATE CLUSTERED INDEX ...), MS SQL Server lo renderà automaticamente univoco aggiungendovi un campo nascosto.

Si noti che i vantaggi del clustering sono più visibili per le scansioni a distanza. Se si utilizza un indice di clustering che non "si allinea" con le scansioni dell'intervallo eseguite dalle applicazioni client (come quando si fa eccessivo affidamento sulla colonna nascosta menzionata sopra o si esegue il clustering su una chiave surrogata ), si è praticamente sconfiggere lo scopo del raggruppamento.


Qualcuno può dirmi brevemente la relazione tra chiave primaria e indice cluster?

In MS SQL Server, anche la chiave primaria è raggruppata per impostazione predefinita . È possibile modificare tale impostazione predefinita, come discusso sopra.


4

Risposte tratte da MSDN utilizzando indici cluster

Una TABELLA può avere una chiave primaria senza un indice cluster? - Sì.

Una TABELLA può avere un indice cluster senza chiave primaria? - Sì.

Una chiave primaria è un vincolo che garantisce l'unicità dei valori, in modo tale che una riga possa sempre essere identificata in modo specifico da quella chiave.

Un indice viene assegnato automaticamente a una chiave primaria (poiché le righe vengono spesso "cercate" dalla loro chiave primaria).

Un indice non cluster è un ordine logico delle righe, in base a una (o più) delle sue colonne. Pensala come effettivamente un'altra "copia" della tabella, ordinata in base alle colonne su cui si trova l'indice.

Un indice cluster è quando la tabella effettiva è fisicamente ordinata da una particolare colonna. Una tabella non avrà sempre un indice cluster (ad esempio, anche se sarà fisicamente ordinata da qualcosa , quella cosa potrebbe essere indefinita ). Una tabella non può avere più di un indice cluster, sebbene possa avere un singolo indice cluster composito (cioè la tabella è fisicamente ordinata per es. Cognome, Nome, DOB).

Il PK è spesso (ma non sempre) un indice cluster.


In SQL Server, la chiave primaria verrà raggruppata per impostazione predefinita, a meno che non si dica esplicitamente che non lo sia. Ma è solo un'impostazione predefinita, non un requisito.
marc_s

Una tabella può avere una chiave primaria senza alcun indice? Perché, quando dico che una colonna è la chiave primaria, per impostazione predefinita viene creato l'indice cluster. Quando si elimina l'indice, la tabella non contiene più la chiave primaria?
veljasije

1

Per quello che può valere, in MS SQL Server tutte le colonne nella chiave primaria devono essere definite come NOT Null, mentre la creazione di un indice cluster univoco non lo richiede. Tuttavia, non sono sicuro di altri sistemi DB.


Questo è più un commento sotto la risposta contrassegnata come quella corretta.
Jan Doggen

1
Benvenuto: ti do un +1 perché vedo che non hai ancora la reputazione di aggiungere commenti. (Ci sono stato, l'ho fatto :)
Ingegnere inverso

0

Potrebbe non riguardare come risposta a questa domanda, ma alcuni aspetti importanti sulla chiave primaria e sugli indici cluster sono ->

Se è presente una chiave primaria (per impostazione predefinita, che è l'indice cluster, tuttavia possiamo cambiarla) con l'indice cluster, non possiamo creare un indice cluster in più per quella tabella. Ma se non è ancora presente un set di chiavi primarie e c'è un indice cluster, non possiamo creare una chiave primaria con Indice cluster.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.