何百万もの行を含むテーブルで、列をNOT NULLからNULLに変更する必要があります。私は簡単に試しました
alter table Table1 ALTER COLUMN Column1 XML NULL
しかし、それは永遠にかかります。だからここに私の質問があります:
- 変更を適用するのになぜこれほど時間がかかるのですか?
- それを行うより良い方法はありますか?
何百万もの行を含むテーブルで、列をNOT NULLからNULLに変更する必要があります。私は簡単に試しました
alter table Table1 ALTER COLUMN Column1 XML NULL
しかし、それは永遠にかかります。だからここに私の質問があります:
回答:
1)何が起こっているのかを正しく理解するには、テーブル+非クラスター化インデックスの完全な構造に関する詳細情報が必要ですが、私の疑いはNULLビットマップに関係しています。
トピックの詳細については、を参照してください。 http://www.sqlskills.com/BLOGS/PAUL/post/Misconceptions-around-null-bitmap-size.aspx
2)はい。ストレージスペースがある場合は、正しいnull可能性を備えた新しいテーブルを作成し、データを複数のバッチで転送して、ログの過度の増大を回避し、以下にリストされている手法を使用してテーブルを切り替えます。私はこれを数回行いましたが、ダウンタイムはほとんどありません。
http://jahaines.blogspot.com/2009/12/sql-server-2005-how-to-move-10-millions.html
次の方が高速でしょうか:
Column1
INSERT INTO <NewTable> SELECT * FROM <OriginalTable>
;ここでの利点は、操作の間、元のテーブルをロックしないことです。テーブルは、名前変更フェーズでのみロックする必要があります。(SQL Serverがオブジェクトレベルの名前変更をサポートしていることを前提としています。)
別のオプションは、問題のテーブルに正しい定義で新しい列を作成することです。古い列のデータで列を更新してから、古い列を削除します。
または、INT列で同様の問題を扱うSEの古い投稿を参照できます。
/programming/4311559/sql-server-performance-for-alter-table-alter-column-change-data-type
コマンドの実行中にSQLアクティビティモニターを開くと、コマンドが実際に処理しているかどうか、または何らかの形でテーブルの排他ロックを待っているかどうかを確認できます。
sp_rename
。