Qual è il modo più efficiente per modificare una definizione di colonna in una tabella con milioni di righe


9

Ho bisogno di cambiare una colonna da NOT NULL a NULL in una tabella che contiene milioni di righe. Ho provato un semplice

alter table Table1 ALTER COLUMN Column1 XML NULL

ma ci vuole un'eternità. Quindi, ecco le mie domande:

  1. Perché ci vuole così tanto tempo per applicare l'alter?
  2. C'è un modo migliore per farlo?

Risposte:


3

1) Uno richiederebbe maggiori informazioni sulla struttura completa della tabella + indici non cluster per capire correttamente cosa sta succedendo, ma il mio sospetto è qualcosa a che fare con la bitmap NULL.

Fare riferimento a per maggiori dettagli sull'argomento. http://www.sqlskills.com/BLOGS/PAUL/post/Misconceptions-around-null-bitmap-size.aspx

http://www.sqlskills.com/BLOGS/PAUL/post/A-SQL-Server-DBA-myth-a-day-(630)-three-null-bitmap-myths.aspx

2) Sì, a condizione che si disponga dello spazio di archiviazione, creare una nuova tabella con nullità corretta e trasferire i dati in più batch per evitare un'eccessiva crescita del registro e cambiare la tabella utilizzando la tecnica elencata di seguito. L'ho fatto più volte con tempi di fermo minimi o nulli.

http://jahaines.blogspot.com/2009/12/sql-server-2005-how-to-move-10-millions.html


6

Sarebbe più veloce per:

  1. Crea una nuova tabella con la definizione corretta per Column1
  2. INSERT INTO <NewTable> SELECT * FROM <OriginalTable>;
  3. Rinomina OriginalTable in OriginalTable_old; Rinomina NewTable in OriginalTable
  4. Convalida e rilascia OriginalTable_old

Il vantaggio qui è che non si tiene un blocco sulla tabella originale per la durata dell'operazione. La tabella deve essere bloccata solo durante la fase di ridenominazione. (Si presume che SQL Server supporti una ridenominazione a livello di oggetto.)


Sì, SQL Server supporta rinominazioni a livello di oggetto utilizzando la procedura memorizzata dal sistema sp_rename.
gonsalu,

Sono stato in grado di modificare una colonna in questo modo con 3,5 milioni di righe in 1 minuto.
Mohsen Afshin,

2

Ogni riga deve essere toccata quando si cambia la colonna da NOT NULL a NULL, motivo per cui il completamento del processo richiede così tanto tempo. Non c'è modo di farlo impiegare meno tempo.


1

Un'altra opzione è quella di creare una nuova colonna con la definizione corretta per la tabella in questione, aggiornare la colonna con i dati della vecchia colonna, quindi rilasciare la vecchia colonna.

Oppure puoi fare riferimento a un post precedente di SE che tratta un problema simile su una colonna INT.

/programming/4311559/sql-server-performance-for-alter-table-alter-column-change-data-type


Nel mio caso, la mia colonna è semplicemente piena di NULL, quindi sto pensando che questa sarebbe la strada da percorrere, la creazione di una nuova colonna completamente NULL con il nome giusto non dovrebbe richiedere tempo ... quindi eliminare la vecchia colonna, invece di gestire milioni di inserti ...
Zack

0

Se si apre il monitor attività SQL mentre il comando è in esecuzione, sarà possibile sapere se lo sta effettivamente elaborando o se è in attesa di una forma di blocco esclusivo della tabella.

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.