2010-03-17 8 views
3

Avoir une table avec 60 colonnes et 200 lignes. La modification d'une colonne BIT de NULL à NOT NULL, a maintenant un temps d'exécution en cours de plus de 3 heures. Pourquoi cela prend-il si longtemps?Temps d'exécution de ALTER COLUMN

C'est la requête que je suis l'exécution:

ALTER TABLE tbl 
ALTER COLUMN col BIT NOT NULL 

est-il un moyen plus rapide de le faire, en plus de créer une nouvelle colonne, la mise à jour avec les valeurs de l'ancienne colonne, puis laisser tomber la vieille colonne et renommer le nouveau?

C'est sur MS SQL Server 2005.

Répondre

3

est le bloqué par des verrous ALTER partagé de métadonnées détenus par d'autres déclarations? Toute ALTER nécessite un verrou exclusif de métadonnées, et en tant que tel sera bloqué par toute autre instruction qui utilise la table.

Vérifiez Activity Monitor ou consultez sys.dm_exec_requests pour voir qui bloque votre ALTER INDEX.

+0

Merci beaucoup. Je ne le savais pas, et je pensais que SQL Server jetterait une erreur dans ce cas? –

+0

Si vous réglez le paramètre LOCK TIMEOUT (Délai de verrouillage), une erreur de verrouillage du délai d'attente s'affichera. –

+1

http://msdn.microsoft.com/en-us/library/ms189470.aspx –

2

Est-il toujours en cours d'exécution après 3 heures (pendant que vous postez la question), ou se termine après 3 heures?

Si elle est toujours en cours d'exécution exécuter DBCC OPENTRAN: vous avez probablement une transaction ouverte quelque part qui a laissé un verrou de schéma sur la table

Ou SELECT * FROM sys.sysprocesses WHERE blocked <> 0 vous donne ce qui a été bloqué

+0

DBCC OPENTRAN libérera-t-il le verrou? –

+0

@Tommy Jakobsen: non. La fermeture de la fenêtre de connexion/app/requête va – gbn

+0

Eh bien pourquoi devrais-je lancer DBCC OPENTRAN alors? –