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) 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
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
Serait-ce plus rapide de:
Column1
INSERT INTO <NewTable> SELECT * FROM <OriginalTable>
;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.)
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.
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.
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.