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.
Questa non è un'opzione. Ho una tabella da 1 TB su un RAID da 1,5 TB. –
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
È possibile trasferire righe su blocchi, eliminandoli dalla sorgente man mano che si procede. Questo probabilmente sarebbe un processo molto lento. –