web-dev-qa-db-fra.com

Façon efficace de changer de varchar dans des champs Nvarchar dans une grande table dans SQL Server 2008?

Je suis conscient de l'ajout de nouveaux champs à de grandes tables, il est recommandé de les ajouter à la fin des champs plutôt que quelque part au milieu et de se demander si quelque chose comme cela s'applique lors de la modification de types de champs?

J'ai une table avec environ un million d'enregistrements comportant plusieurs champs de type Varchare. Je voudrais les changer à Nvarchars, mais si je comprends bien, cela prendra du temps et des ressources, car les champs sont au milieu de la table et que SQL Server doit faire un tas de copier/réchérir.

Quel est un moyen efficace d'accomplir cela?

7
ElHaix

Une solution pourrait être à:

  1. Ajouter une colonne nullable Nvarchar
  2. Utilisation des lots, mettez à jour un certain nombre de lignes à la fois (par exemple 1000 ou 10000 rangées)
  3. Sauvegarde du journal, du point de contrôle, de quoi avez-vous entre-tu entre lots
  4. Lorsque toutes les lignes ont été mises à jour, laissez tomber l'ancienne colonne et renommez le nouveau
  5. Index de reconstruction

Ce ne sera pas plus rapide à long terme et nécessite toujours une fenêtre de maintenance (puisque vous ne souhaitez pas que les utilisateurs mises à jour des lignes que vous avez déjà mises à jour, à moins que vous ne mettriez un déclencheur temporaire en place pour contrer cela), mais cela évitera un Une vaste transaction et après quelques mises à jour vous donneront plus de prévisibilité sur la durée de la durée.

Vous pouvez faire la même chose en créant une nouvelle table et en faisant renommer qu'une fois que c'est fait ... tandis que cela évite la nécessité d'une étape 5, cela entraînerait une baratte encore plus de données et peut être plus problématique en raison de contraintes, de clés étrangères, de déclencheurs etc. qui pourraient être impliqués dans la table.

20
Aaron Bertrand