Enjoy Your SQL Primary Key, Indici e falsi miti - Francesco Quaratino

Primary Key, Indici e falsi miti

sfatiamo un mito...se ce ne fosse ancora bisogno:

a) l'indice clustered può non coincidere con la chiave primaria
b) l'indice clustered può essere non-univoco
c) la/e colonne indicizzate possono ammettere il valore NULL

'indice' e 'chiave primaria' sono due concetti completamente distinti fra loro:
- la chiave primaria è un vincolo che assicura l'univocità di ogni riga della tabella
- un indice clustered è un struttura B+Tree allocata nel file di dati che determina un ordinamento specifico dei dati della tabella nelle pagine di dati

il falso mito è alimentato dal fatto che MS-SQL Server implementa il vincolo di chiava primaria attraverso un 'unique index', in particolare questo indice sarà 'clustered' a meno che

1) creaiamo prima la tabella senza chiave primaria

create table T1 (
    col1 int not null,
    col2 nvarchar(30) null,
)
go


2) quindi l'indice clustered

create clustered index IX_Clustered on T1 (col2)
go


3) infine aggiungiamo il vincolo di chiave primaria

alter table T1
add constraint PK_T1 primary key (col1)
go


4) proviamo a vedere se quanto detto è vero:

insert t1 (col1, col2) values (0, 'Biagio')
insert t1 (col1, col2) values (1, 'Peppino')
insert t1 (col1, col2) values (2, 'Giacinto')
insert t1 (col1, col2) values (3, 'Peppino')
insert t1 (col1, col2) values (4, NULL)
insert t1 (col1, col2) values (5, NULL)

select * from t1 where col2 = 'Peppino'
go

 

5) sbirciamo fra gli indici della tabella T1
sp_helpindex T1
go


index_name: IX_Clustered

index_description: clustered located on PRIMARY

index_keys: col2
-------------------------------------------------------                            

index_name: PK_T1

index_description: nonclustered, unique, primary key located on PRIMARY

index_keys: col1

-------------------------------------------------------       


come si può vedere la chiave primaria è stata implementata attraverso un indice non-clustered.

Filed under: ,

Comments

No Comments