web-dev-qa-db-fra.com

Changer de varchar (max) à Varchar (255) nécessite une table de reconstruction

Nos développeurs (avant moi d'être DBA) définissent le type de données d'un champ sur VARCHAR(MAX) En réalité, il suffit d'être VARCHAR(255). Cela n'a pas été découvert que lorsque notre table avait augmenté de plus de plusieurs millions d'enregistrements et presque un téraoctet de données. Lorsque je vais au mode de conception sur cette table pour tester ce changement dans notre environnement de test, je trouve que le script qu'il crée crée une copie de table _TMP de la table, puis dépose l'original et renorme _tmp à l'original. Je semble me souvenir d'apprendre la raison derrière cela avait quelque chose à voir avec qui devait déplacer les données de la section "LOB" d'un enregistrement à la section de longueur fixe d'un enregistrement (ou donc mon souvenir de ma mémoire). Cependant, je ne trouve aucune documentation sur la raison pour laquelle cela se produit exactement (au lieu de simplement changer la taille en place). Quelqu'un peut-il me signaler dans la bonne direction afin que je puisse mieux expliquer à la direction Pourquoi faire de cette modification maintenant sur plusieurs millions de table d'enregistrement va prendre beaucoup de temps.

2
Chris Woods

Le script que génère que SSMS génère n'est pas le meilleur.

Vous devriez être capable d'utiliser simple ALTER TABLE:

ALTER TABLE TableName
ALTER COLUMN ColumnName VARCHAR(255) NOT NULL

Évidemment, assurez-vous d'avance que le texte que vous stockez dans cette colonne s'intègre dans une limite de 255 caractères.

Je recommanderais fortement de l'essayer dans un environnement de test d'abord de vous donner une idée de combien de temps cela prendrait. Je ne suis pas sûr et cela peut dépendre de la version et édition de votre serveur, mais il est probable que ce type de changement serait effectué non En tant que changement de métadonnées, ce qui signifie que pour un téraoctet de données, il prendrait une durée importante.


Cette question (- pourquoi la colonne alterne-t-elle pas NULL provoque une croissance massive du fichier journal? ) a beaucoup de détails sur ALTER COLUMN.

4
Vladimir Baranov