Ao alterar o tamanho de uma coluna nvarchar, preciso eliminar o índice exclusivo? E a tabela será bloqueada ao recriar o índice?

14

Em nosso banco de dados existe uma grande tabela que mais ou menos se parece com isso:

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

mas agora o tamanho do campo serial ficou baixo, então eu quero alterá-lo para 32. A ferramenta de comparação de esquema do Visual Studio sugere fazer isso:

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

Isso é realmente necessário? Ou mais como uma maneira ultra salva de fazer isso?

Além disso, ao recriar o índice exclusivo, minha tabela será bloqueada? Porque esse seria um grande problema (como a tabela possui 30 milhões de linhas e acho que a recriação do índice levará algum tempo), porque a próxima janela de manutenção será daqui a alguns meses. Quais são minhas alternativas?

Staeff
fonte

Respostas:

24

Não há necessidade de descartar e recriar o índice.

Apenas use

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

Esta é uma alteração apenas de metadados.

Alterar uma coluna de NVARCHAR(16)para NVARCHAR(32)não afeta o armazenamento.

Indo ao contrário (de NVARCHAR(32)para NVARCHAR(16)), você geraria um erro sobre os objetos serem dependentes da coluna; portanto, talvez o Visual Studio sempre gere esse código de chapa da caldeira em vez de verificar se é realmente necessário.

Martin Smith
fonte
2
Curioso por que o Visual Studio o rotula como DROP / CREATE INDEX. Provavelmente desnecessário, CYA incondicional.
Aaron Bertrand
2
@AaronBertrand - Suponho que seja apenas uma otimização ausente para os casos em que não é necessária. Livros on-line indicou que esta era necessária em poucos casos em que o produto não chegou a exigir, pois bem até que esta atualização
Martin Smith