2010-03-12 3 views
13

Se corro Profiler, allora suggerisce un sacco di indici come questoUna chiave primaria è automaticamente un indice?

CREATE CLUSTERED INDEX [_dta_index_Users_c_9_292912115__K1] ON [dbo].[Users] 
(
[UserId] ASC 
)WITH (SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, 
ONLINE = OFF) ON [PRIMARY] 

UserId è la chiave primaria della tabella Utenti. E 'questo indice migliore di quello già in tabella:

ALTER TABLE [dbo].[Users] ADD CONSTRAINT [PK_Users] PRIMARY KEY NONCLUSTERED 
(
[UserId] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, 
IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, 
ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 

risposta

6

Ogni tabella richiede un indice cluster e una chiave primaria. Per impostazione predefinita, il PK è in cluster ma può essere non cluster se vuoi come hai finito.

È stato specificato un PK non cluster in modo che il profiler suggerisce un indice cluster ...

Nota: una tabella senza un indice cluster è chiamato un "mucchio", perché si tratta di un mucchio di dati non strutturati ...

+4

I dati in una tabella non indicizzata sono sicuramente strutturati – Charlie

+0

"Ogni tabella ha bisogno di un indice cluster" "Nota: una tabella senza indice cluster ...." Ti sei contraddetto lì - cosa volevi dire? E come per ogni tabella che necessitano di una chiave primaria - nella mia esperienza, SQL Server vi permetterà di creare un tavolo senza uno, così come la maggior parte dei DBMS. – Stewart

1

È migliore perché è in cluster.

+0

è cluster di default, ma non deve essere –

+0

PK dal post è esplicitamente non cluster. – wRAR

2

Sta essenzialmente suggerendo di rendere la chiave primaria un indice cluster piuttosto che uno non selezionato. Nella maggior parte dei casi, questa sarebbe una buona cosa da fare.

21

Sì, una chiave primaria è sempre un indice.

Se non si dispone di qualsiasi altro indice cluster della tabella, quindi è facile: un indice cluster rende un tavolo più veloce, per ogni operazione. SÌ! Lo fa. Guarda l'eccellente The Clustered Index Debate continues di Kim Tripp per informazioni di base.

Quindi, in realtà, ogni tabella utile (tranne forse le tabelle di staging per il bulkload o un altro raro caso) dovrebbe avere un indice cluster. Se non ne hai uno, è abbastanza ovvio che il DTA ne consiglierebbe uno e lo inserirà sulle colonne chiave primaria per impostazione predefinita.

+3

"... rende una tabella più veloce, per ogni operazione" diversa dall'inserimento? Non inserire più lavoro da fare, in quanto deve anche aggiornare l'indice? –

+2

NO !! Leggi post sul blog di Kim Tripp - citando: "Inserti ** sono più veloci in una tabella cluster ** (ma solo nella '' tabella cluster a destra) che, rispetto ad un cumulo Il problema principale è che le ricerche nella IAM/PFS a. determinare la posizione di inserimento in un mucchio sono più lento di una tabella cluster (dove location inserto è noto, definito dal tasto cluster). " –