web-dev-qa-db-fra.com

Augmentez la colonne de modification de la vitesse sur une grande table à NON NULL

J'ai récemment ajouté une colonne de bits NULL à une table qui compte près de 500 millions de lignes. Il n'y a pas de valeur par défaut sur la colonne, mais toutes les insertions spécifient une valeur de 0 ou 1, et j'ai exécuté une routine unique pour attribuer 0 ou 1 à toutes les lignes existantes (mise à jour des lignes par petits lots). Chaque ligne doit maintenant avoir un 0 ou 1 dans cette colonne.

Je veux cependant que la colonne de bits ne soit pas nullable lorsque j'ai essayé de le faire via ALTER TABLE t1 ALTER COLUMN c1 bit not null, il a commencé à fonctionner pendant 3 minutes et je l'ai arrêté car il bloquait toutes les lectures sur la table et je soupçonnais que cela allait prendre beaucoup de temps. Il est possible que cela ne prenne pas trop de temps, mais je ne pouvais pas risquer trop d'indisponibilité. Le retour en arrière lui-même a pris 6 minutes.

Avez-vous des suggestions sur la façon dont je peux rendre la colonne non nullable sans que cela prenne potentiellement des heures à se terminer? De plus, existe-t-il un moyen d'estimer la durée de ALTER TABLE ALTER COLUMN déclaration que j'ai commencée puis annulée prendrait à compléter?

J'utilise SQL Server 2017 Web Edition.

12
Ben Amada

Au lieu de modifier la définition de la colonne, vous pouvez ajouter un CHECK CONSTRAINT qui n'autorise pas les valeurs NULL pour cette colonne. Le tableau devra toujours être analysé, mais il n'aura pas besoin de modifier chaque page de données, ce devrait donc être une opération beaucoup plus rapide. Malheureusement, un verrou Sch-M sera toujours maintenu pendant l'opération. Une astuce consiste à essayer d'obtenir autant de la table dans le pool de mémoire tampon que possible avant d'essayer d'ajouter la contrainte. Cela peut réduire la durée de maintien du verrou Sch-M.

Vous pouvez ensuite supprimer la contrainte et modifier la définition de colonne lors de votre prochaine fenêtre de maintenance.

12
Joe Obbish

Si vous utilisez Enterprise Edition (EE), une meilleure stratégie aurait pu être de l'ajouter en tant que NOT NULL avec une valeur par défaut de 0 ou 1 (selon la plus courante).

Il s'agit d'un changement de métadonnées uniquement dans EE . Mettez ensuite à jour ceux qui doivent être retournés. Cela signifie moins de mises à jour et pas besoin de modifier la valeur Null de la colonne une fois terminé. - martin-smith

11
user126897