Quando si modifica la dimensione di una colonna nvarchar, è necessario eliminare l'indice univoco? E la tabella verrà bloccata quando si ricrea l'indice?


14

Nel nostro database esiste una grande tabella che più o meno è simile a questa:

CREATE TABLE dbo.production_data
(
    pd_id BIGINT PRIMARY KEY,
    serial NVARCHAR(16) NOT NULL UNIQUE,
    ...
);

ma ora la dimensione del campo seriale è diventata troppo bassa, quindi voglio cambiarlo in 32. Lo strumento di confronto dello schema di Visual Studio suggerisce di fare questo:

DROP INDEX ux_production_data_serial ON dbo.production_data;
GO
ALTER TABLE dbo.production_data ALTER COLUMN serial NVARCHAR(32) NOT NULL;
GO
CREATE INDEX ux_production_data_serial ON dbo.production_data(serial ASC);

È davvero necessario? O più come un modo ultra-salva per farlo?

Inoltre, ricreando l'indice univoco, la mia tabella verrà bloccata? Perché questo sarebbe un grosso problema (poiché la tabella ha 30 milioni di righe e immagino che ricreare l'indice richiederà un po 'di tempo), perché la prossima finestra di manutenzione è tra qualche mese in futuro. Quali sono le mie alternative?

Risposte:


24

Non è necessario eliminare e ricreare l'indice.

Basta usare

ALTER TABLE dbo.production_data
  ALTER COLUMN serial NVARCHAR(32) NOT NULL; 

Questo è solo un cambiamento di metadati.

La modifica di una colonna da NVARCHAR(16)a NVARCHAR(32)non influisce affatto sulla memoria.

Andare al contrario (da NVARCHAR(32)a NVARCHAR(16)) ti darebbe un errore riguardo agli oggetti dipendenti dalla colonna, quindi forse Visual Studio genera sempre quel codice della piastra della caldaia invece di verificare se è effettivamente richiesto.


2
Curioso perché Visual Studio lo script come DROP / CREATE INDEX. Probabilmente non necessario, incondizionato CYA.
Aaron Bertrand

2
@AaronBertrand - Suppongo sia solo un'ottimizzazione mancante per i casi in cui non è richiesto. I libri online indicavano che ciò era necessario in alcuni casi in cui il prodotto non lo richiedeva effettivamente fino a questo aggiornamento
Martin Smith,
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.