Al cambiar el tamaño de una columna nvarchar, ¿debo eliminar el índice único? ¿Y se bloqueará la tabla al recrear el índice?


14

En nuestra base de datos existe una gran tabla que se ve más o menos así:

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

pero ahora el tamaño del campo en serie se ha reducido, por lo que quiero cambiarlo a 32. La herramienta de comparación de esquemas de Visual Studio sugiere hacer esto de la siguiente manera:

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);

¿Es esto realmente necesario? ¿O más como una forma ultra salva de hacer esto?

Además, al recrear el índice único, ¿se bloqueará mi tabla? Porque esto sería un gran problema (ya que la tabla tiene 30 millones de filas y supongo que volver a crear el índice llevará bastante tiempo), porque la próxima ventana de mantenimiento es de unos meses en el futuro. ¿Cuales son mis alternativas?

Respuestas:


24

No es necesario soltar y volver a crear el índice.

Solo usa

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

Este es un cambio de metadatos solamente.

Alterar una columna de NVARCHAR(16)a NVARCHAR(32)no afecta el almacenamiento en absoluto.

Ir al revés (de NVARCHAR(32)a NVARCHAR(16)) le daría un error sobre los objetos que dependen de la columna, por lo que tal vez Visual Studio siempre genere ese código de placa de caldera en lugar de verificar si realmente es necesario.


2
Curioso por qué Visual Studio lo escribe como DROP / CREATE INDEX. Probablemente innecesario, incondicional CYA.
Aaron Bertrand

2
@AaronBertrand: supongo que es solo una optimización que falta para los casos en los que no es necesario. Los libros en línea indicaron que esto era necesario en algunos casos en los que el producto no lo requería realmente hasta esta actualización
Martin Smith
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.