Lors du changement de 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?


14

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 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?

Réponses:


24

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 la chaudière au lieu de vérifier s'il est réellement requis.


2
Curieux de savoir pourquoi Visual Studio l'écrit comme DROP / CREATE INDEX. CYA probablement inutile et inconditionnel.
Aaron Bertrand

2
@AaronBertrand - Je suppose que c'est juste une optimisation manquante pour les cas où elle n'est pas requise. Les livres en ligne ont indiqué que cela était nécessaire dans quelques cas où le produit n'en avait pas réellement besoin avant cette mise à jour
Martin Smith
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.