web-dev-qa-db-fra.com

Quel est le moyen le plus efficace de modifier une définition de colonne dans une table avec des millions de lignes

Je dois changer une colonne de Not Null en NULL dans une table contenant des millions de lignes. J'ai essayé un simple

alter table Table1 ALTER COLUMN Column1 XML NULL

mais il faut pour toujours. Donc, voici mes questions:

  1. Pourquoi faut-il si longtemps d'appliquer l'alter?
  2. Y a-t-il une meilleure façon de le faire?
9
Jonas Stawski

1) On aurait besoin de plus d'informations sur la structure complète de la table + des index non clusters pour déterminer correctement ce qui se passe mais que ma suspicion est quelque chose à voir avec le null bitmap.

Veuillez vous reporter à plus de détails sur le sujet. http://www.sqlskills.com/blogs/pull/post/misconceptions-Around-Null-Bitmap-Size.aspx

http://www.sqlskills.com/blogs/pull/post/a-sql-server-dba-myth-a-day- (630) -three-null-bitmap-myths.aspx

2) Oui, à condition que vous disposiez d'un espace de stockage, créez une nouvelle table avec une nullabilité correcte et transférez les données dans plusieurs lots pour éviter une croissance excessive de journal et basculez la table à l'aide de la technique énumérée ci-dessous. Je l'ai fait plusieurs fois avec peu de temps d'arrêt.

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

3
Sankar Reddy

Serait-ce plus rapide de:

  1. Créez une nouvelle table avec la définition correcte pour Column1
  2. INSERT INTO <NewTable> SELECT * FROM <OriginalTable>;
  3. Renommer OriginalTable à OriginalTable_old; Renommer Newtable à OriginalTable
  4. Valider et déposer OriginalTable_old

L'avantage est que vous ne tenez pas une serrure 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 renommée. (Il suppose que SQL Server prend en charge un renommage d'un niveau d'objet.)

6
RobPaller

Chaque ligne doit être touchée lors de la modification de la colonne de NON NULL à NULL, c'est pourquoi il faut si longtemps à compléter. Il n'y a pas de moyen de le faire prendre moins de temps.

2
mrdenny

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

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

https://stackoverflow.com/questions/4311559/sql-server-performance-for-alter-table-alter-column-change-data-type

1
yrushka

Si vous ouvrez le moniteur d'activité SQL pendant que la commande est en cours, vous pourrez le dire s'il le traite en réalité ou si elle attend une forme de blocage exclusif de la table.

0
Matthew Steeples