何百万もの行があるテーブルの列定義を変更する最も効率的な方法は何ですか


9

何百万もの行を含むテーブルで、列をNOT NULLからNULLに変更する必要があります。私は簡単に試しました

alter table Table1 ALTER COLUMN Column1 XML NULL

しかし、それは永遠にかかります。だからここに私の質問があります:

  1. 変更を適用するのになぜこれほど時間がかかるのですか?
  2. それを行うより良い方法はありますか?

回答:


3

1)何が起こっているのかを正しく理解するには、テーブル+非クラスター化インデックスの完全な構造に関する詳細情報が必要ですが、私の疑いはNULLビットマップに関係しています。

トピックの詳細については、を参照してください。 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)はい。ストレージスペースがある場合は、正しいnull可能性を備えた新しいテーブルを作成し、データを複数のバッチで転送して、ログの過度の増大を回避し、以下にリストされている手法を使用してテーブルを切り替えます。私はこれを数回行いましたが、ダウンタイムはほとんどありません。

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


6

次の方が高速でしょうか:

  1. の正しい定義で新しいテーブルを作成します Column1
  2. INSERT INTO <NewTable> SELECT * FROM <OriginalTable>;
  3. OriginalTableの名前をOriginalTable_oldに変更します。NewTableの名前をOriginalTableに変更
  4. OriginalTable_oldの検証と削除

ここでの利点は、操作の間、元のテーブルをロックしないことです。テーブルは、名前変更フェーズでのみロックする必要があります。(SQL Serverがオブジェクトレベルの名前変更をサポートしていることを前提としています。)


はい。SQLServerは、システムストアドプロシージャを使用したオブジェクトレベルの名前変更をサポートしていますsp_rename
gonsalu 2011年

このようにして、350万行の列を1分以内に変更できました。
Mohsen Afshin 2017年

2

列をNOT NULLからNULLに変更するときは、すべての行を操作する必要があるため、完了までに時間がかかります。時間を短縮する方法はありません。


1

別のオプションは、問題のテーブルに正しい定義で新しい列を作成することです。古い列のデータで列を更新してから、古い列を削除します。

または、INT列で同様の問題を扱うSEの古い投稿を参照できます。

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


私の場合、私の列は単にNULLでいっぱいなので、これが方法であろうと考えています。正しい名前で完全にNULLの新しい列を作成すると、まったく時間がかかりません...古い列を削除します。何百万もの挿入を処理する代わりに...
Zack

0

コマンドの実行中にSQLアクティビティモニターを開くと、コマンドが実際に処理しているかどうか、または何らかの形でテーブルの排他ロックを待っているかどうかを確認できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.