2011-09-22 3 views
78

Utilizzo SQL Server 2008 e ho bisogno di creare un campo VARCHAR più grande, da (200 a 1200) su una tabella con circa 500.000 righe. Quello che devo sapere è se ci sono problemi che non ho preso in considerazione.Quando si aumenta la dimensione della colonna VARCHAR su un grande tavolo ci possono essere problemi?

Userò questa dichiarazione TSQL:

ALTER TABLE MyTable 
ALTER COLUMN [MyColumn] VARCHAR(1200) 

ho già provato su una copia dei dati e questa dichiarazione non ha avuto effetti negativi che ho potuto vedere.

Quindi ci sono possibili problemi da ciò che potrei non aver considerato?

A proposito, la colonna non è indicizzata.

+1

@nonnb: questa è una pessima idea. http://stackoverflow.com/q/2091284/27535 – gbn

+0

@gbn qualche idea sulla recente risposta di Justin a questa domanda? Sembra essere in qualche modo in contrasto con il tuo. – AakashM

+0

@AakashM: ha ragione sull'archiviazione ma è un sovraccarico, non un'ottimizzazione. Ora leggi questo http://stackoverflow.com/q/2009694/27535 – gbn

risposta

54

Questo è solo un cambiamento dei metadati: è rapido.

Un'osservazione: specificare NULL o NOT NULL in modo esplicito per evitare "incidenti" se una delle impostazioni SET ANSI_xx sono diverse ad esempio corsa nel osql non SSMS per qualche ragione

+1

Tutto è andato bene con questo. Nessun problema. –

+0

Sai se si applicano le stesse regole andando da 'varchar (200)' a 'varchar (max)'? – CodeNaked

+0

@CodeNaked: è molto più complicato rispondere. (max) è un tipo LOB che può essere "in fila" o al di fuori della riga.Tuttavia, sono propenso a dire che dovrebbe essere lo stesso perché i dati sono già "in fila" e non sarebbe necessaria la ricostruzione della tabella – gbn

4

Passaggio a Varchar (1200) da Varchar (200) non dovrebbe causare alcun problema in quanto è solo una modifica dei metadati e poiché SQL Server 2008 tronca spazi vuoti eccessivi non dovresti vedere differenze di prestazioni, quindi in breve non dovrebbero esserci problemi con la modifica.

+0

Credo che questo possa essere vero per le tabelle di piccole dimensioni, ma per le tabelle di grandi dimensioni che vengono interrogate attivamente questo potrebbe bloccare per un periodo di tempo significativo (come server SQL ha bisogno di vedere se ha bisogno di troncare ogni riga). – CodeNaked

-3

Nel mio caso modificare la colonna non funzionava così si può usare il comando 'Modifica', come:

ALTER TABLE [nome_tabella] MODIFICARE colonna [nome_colonna] varchar (1200);

+4

Questo perché non si utilizza SQL Server per la domanda (ma MySQL, probabilmente). "ALTER TABLE ... MODIFY" non è valido T-SQL. –

5

Volevo solo aggiungere i miei 2 centesimi, da quando ho googled questa domanda b/c mi sono trovato in una situazione simile ...

essere consapevoli del fatto che, mentre cambiando varchar(xxx)-varchar(yyy) è una meta-dati cambiare in effetti, ma non è possibile passare a varchar(max). Poiché i valori varchar(max) (ovvero valori BLOB - immagine/testo ecc.) Sono memorizzati in modo diverso sul disco, non all'interno di una riga della tabella, ma "fuori riga". Quindi il server impazzirà su un grande tavolo e non risponderà per minuti (ore).

--no downtime 
ALTER TABLE MyTable ALTER COLUMN [MyColumn] VARCHAR(1200) 

--huge downtime 
ALTER TABLE MyTable ALTER COLUMN [MyColumn] VARCHAR(max) 

PS. lo stesso vale per lo nvarchar o per il corso.