web-dev-qa-db-fra.com

Lorsque je modifie la taille d'une colonne nvarchar, dois-je supprimer l'index unique? Et la table sera-t-elle verrouillée lors de la recréation de l'index?

Dans notre base de données existe une grande table qui ressemble plus ou moins à ceci:

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

mais maintenant la taille du champ série est devenue trop faible, donc je veux le changer à 32. L'outil de comparaison de schéma de Visual Studio suggère de le faire en:

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

Est-ce vraiment nécessaire? Ou plus comme une façon ultra économique de le faire?

De plus, lors de la recréation de l'index unique, ma table sera-t-elle verrouillée? Parce que ce serait un gros problème (car la table a 30 millions de lignes et je suppose que recréer l'index prendra un certain temps), car la prochaine fenêtre de maintenance est de quelques mois dans le futur. Quelles sont mes alternatives?

14
Staeff

Il n'est pas nécessaire de supprimer et de recréer l'index.

Utilisez simplement

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

Il s'agit uniquement d'un changement de métadonnées.

La modification d'une colonne de NVARCHAR(16) à NVARCHAR(32) n'affecte pas du tout le stockage.

Inverser (de NVARCHAR(32) à NVARCHAR(16)) vous donnerait une erreur sur les objets dépendant de la colonne, alors peut-être que Visual Studio génère toujours ce code de plaque de chaudière au lieu de vérifier si c'est en fait requis.

24
Martin Smith