Quelle est la manière la plus efficace de modifier une définition de colonne dans une table avec des millions de lignes


9

J'ai besoin de changer une colonne de NOT NULL à NULL dans une table qui contient des millions de lignes. J'ai essayé un simple

alter table Table1 ALTER COLUMN Column1 XML NULL

mais cela prend une éternité. Donc, voici mes questions:

  1. Pourquoi faut-il autant de temps pour appliquer l'alter?
  2. Y a-t-il une meilleure façon de le faire?

Réponses:


3

1) Il faudrait plus d'informations sur la structure complète de la table + index non clusterisés pour comprendre correctement ce qui se passe, mais mon soupçon est lié au bitmap NULL.

Veuillez vous référer à pour plus de détails sur le sujet. http://www.sqlskills.com/BLOGS/PAUL/post/Misconceptions-around-null-bitmap-size.aspx

http://www.sqlskills.com/BLOGS/PAUL/post/A-SQL-Server-DBA-myth-a-day-(630)-three-null-bitmap-myths.aspx

2) Oui, à condition que vous disposiez de l'espace de stockage, créez une nouvelle table avec la nullité correcte et transférez les données en plusieurs lots pour éviter une croissance excessive du journal et changez de table en utilisant la technique indiquée ci-dessous. Je l'ai fait plusieurs fois avec peu ou pas de temps d'arrêt.

http://jahaines.blogspot.com/2009/12/sql-server-2005-how-to-move-10-millions.html


6

Serait-il plus rapide de:

  1. Créez un nouveau tableau avec la définition correcte pour Column1
  2. INSERT INTO <NewTable> SELECT * FROM <OriginalTable>;
  3. Renommez OriginalTable en OriginalTable_old; Renommer NewTable en OriginalTable
  4. Valider et supprimer OriginalTable_old

L'avantage ici est que vous ne tenez pas de verrou sur la table d'origine pendant la durée de l'opération. La table ne doit être verrouillée que pendant la phase de renommage. (Il suppose que SQL Server prend en charge un renommage de niveau objet.)


Oui, SQL Server prend en charge les renommages de niveau objet à l'aide de la procédure stockée système sp_rename.
gonsalu

J'ai pu modifier une colonne de cette façon avec 3,5 millions de lignes en 1 minute.
Mohsen Afshin

2

Chaque ligne doit être touchée lors du changement de la colonne de NOT NULL à NULL, c'est pourquoi cela prend tellement de temps à terminer. Il n'y a aucun moyen de faire en sorte que cela prenne moins de temps.


1

Une autre option consiste à créer une nouvelle colonne avec une définition correcte pour la table en question, à mettre à jour la colonne avec les données de l'ancienne colonne, puis à supprimer l'ancienne colonne.

Ou vous pouvez vous référer à un article plus ancien de SE qui traite un problème similaire sur une colonne INT.

/programming/4311559/sql-server-performance-for-alter-table-alter-column-change-data-type


Dans mon cas, ma colonne est simplement pleine de NULL, donc je pense que ce serait la voie à suivre, la création d'une nouvelle colonne complètement NULL avec le bon nom ne devrait pas prendre de temps du tout ... puis la suppression de l'ancienne colonne, au lieu de traiter des millions d'inserts ...
Zack

0

Si vous ouvrez le moniteur d'activité SQL pendant que la commande est en cours d'exécution, vous serez en mesure de dire si elle le traite réellement ou si elle attend une forme de verrouillage exclusif de la table.

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.