2009-04-01 6 views
6

Ho una tabella che ha un indice cluster su due colonne, la chiave primaria per la tabella. Esso è definito come segue:Il modo migliore per modificare l'indice cluster (PK) in SQL 2005

ALTER TABLE Table ADD CONSTRAINT [PK_Table] PRIMARY KEY CLUSTERED 
(
    [ColA] ASC, 
    [ColB] ASC 
)WITH (SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF) ON [PRIMARY] 

Voglio rimuovere questo PK indice cluster e aggiungere un indice cluster come segue e aggiungere un vincolo di chiave primaria utilizzando un indice non cluster, mostrato anche al di sotto.

CREATE CLUSTERED INDEX [IX_Clustered] ON [Table] 
(
    [ColC] ASC, 
    [ColA] ASC, 
    [ColD] ASC, 
    [ColE] ASC, 
    [ColF] ASC, 
    [ColG] ASC 
)WITH (PAD_INDEX = ON, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF,  DROP_EXISTING = OFF, IGNORE_DUP_KEY = OFF, FILLFACTOR = 90, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = OFF) ON [PRIMARY] 

ALTER TABLE Table ADD CONSTRAINT 
    PK_Table PRIMARY KEY NONCLUSTERED 
    (
    ColA, 
    ColB 
) WITH(STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 

mi stava per cadere solo il PK cluster indice, quindi aggiungere il nuovo indice cluster e quindi aggiungere l'indice della chiave non cluster primario, ma ho imparato che far cadere l'indice cluster esistente provocherebbe i dati della tabella a essere riordinato (vedi risposta qui What happens when I drop a clustered primary key in SQL 2005), che non credo dovrebbe essere necessario. Il tavolo sta battendo 1 TB, quindi voglio davvero evitare inutili riordini.

La mia domanda è: qual è il modo migliore per passare dalla struttura esistente alla struttura desiderata?

MODIFICA: Voglio solo chiarire. La tabella è di 1 TB e, sfortunatamente, non ho spazio per creare una tabella temporanea. Se c'è un modo per farlo senza creare una tabella temporanea, per favore fatemelo sapere.

risposta

8

Se la tabella è ottenere fino a 1 TB di dimensioni e probabilmente ha un sacco di righe in esso, consiglio vivamente di NON rendere l'indice cluster più grasso!

Prima di tutto, l'eliminazione e la ricomposizione dell'indice cluster metterà a punto TUTTI i dati almeno una volta, che da soli impiegheranno anni.

In secondo luogo, il grande indice composto composto che si sta tentando di creare aumenterà in modo significativo la dimensione di tutti gli indici non cluster (poiché contengono l'intero valore dell'indice cluster su ciascun nodo foglia, per le ricerche nei segnalibri).

La domanda è più: perché stai provando a farlo ?? Non potresti semplicemente aggiungere un altro indice non cluster con quelle colonne, per coprire potenzialmente le tue domande? Perché questo deve essere l'indice cluster ?? Non vedo alcun vantaggio in questo ....

Per ulteriori informazioni sull'indicizzazione e in particolare sul dibattito sull'indice cluster, vedere Kimberly Tripp's blog sugli indici di SQL Server - molto utile!

Marc

4
  1. Creare una nuova tabella:

    CREATE TABLE newtable (colA INT, colB INT) 
    
    • Inserire tutti i valori della vecchia tabella nella nuova tabella:

      INSERT INTO nuovatabella SELECT * FROM tabella

    • Lascia cadere il vecchio Tabella:

      tabella DROP TABLE

    • rinominare la nuova tabella al vecchio tavolo

      EXEC sp_rename 'nuovatabella', 'table'

    • Costruire gli indici:

      ALTER TABLE Tabella ADD CONSTRAINT PK_Table PRIMARY KEY NONCLUSTERED ( ColA, ColB ) CON (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

+0

Questa non è un'opzione. Ho una tabella da 1 TB su un RAID da 1,5 TB. –

+0

SQL Server richiederà spazio sia per il riordino che per lo spostamento. Se hai esaurito lo spazio, puoi utilizzare l'opzione MOVE TO in DROP INDEX per creare il tuo tavolo su una memoria temporanea e quindi ricrearlo di nuovo sul tuo RAID. – Quassnoi

+0

È possibile trasferire righe su blocchi, eliminandoli dalla sorgente man mano che si procede. Questo probabilmente sarebbe un processo molto lento. –

11

Questa non è una risposta completa alla tua domanda, ma assicurarsi che che se hai altri indici sulla tabella che li lasci per primi. In caso contrario, SQL Server dovrà ricostruirli tutti quando si rimuove l'indice cluster, quindi ricostruirli di nuovo tutti quando si aggiunge un nuovo indice cluster.Le fasi usuali sono:

  1. Rimuovere tutti gli indici non cluster
  2. Rimuovi cluster indice
  3. Inserisci nuova indice cluster
  4. aggiungere nuovamente tutti gli indici non cluster
+0

Bene, quello era il mio piano iniziale, ma il 2o passo della rimozione dell'indice cluster fa spostare tutti i dati. Speravo di unire i passaggi 2 e 3 in qualche modo, per evitare un movimento inutile di dati. –

-1

indici cluster in realtà non modificare l'ordine fisico dei dati che vengono memorizzati nella tabella è di per sé. Non è stato così dal momento che SQL 6.5.

I dati presenti nelle pagine vengono memorizzati nell'ordine corretto. Le pagine possono essere memorizzate sul disco in qualsiasi ordine fisico.

+0

è vero? Avevo l'impressione che l'ordine fisico dei dati fosse determinato dalla chiave di clustering. –

+0

I dati nelle pagine sono memorizzati nell'ordine corretto. Le pagine possono essere memorizzate sul disco in qualsiasi ordine fisico. – mrdenny

+2

Si potrebbe voler aggiornare la risposta per includere questa distinzione. –

Problemi correlati