2010-11-26 12 views
5

私は何百万ものレコードを含むテーブルを持っています。多くのデータを持つSQL変更列データ型

私は(10進数へのお金)別の列のデータ型のものがALTERステートメントを実行する時間の多くを取っている着目

を変更しています。おそらく、データがたくさんあるという事実のためです。

このシナリオのパフォーマンスを向上させる方法はありますか?

答えて

6

行のすべての何百万人が別のオプション1つのトランザクションで同時に変更

に持っているが、新しいテーブルを作成するバッチで挿入し、古いテーブルを削除し、新しいテーブルの名前を変更することです。 しかし、それはこのように長くかかる傾向があります。

3

新しい列の種類の一時表を作成し、元の表のデータを一時表にコピーし、元の表を削除してから、名前を変更します。

CREATE TABLE dbo.tmp_MyTable 
    (ID Integer, Name varchar (100), MyChangedField decimal (8,2)) 

INSERT INTO dbo.tmp_MyTable SELECT * FROM dbo.MyTable 

DROP TABLE dbo.MyTable 

EXECUTE sp_rename N'dbo.tmp_MyTable', N'MyTable', 'OBJECT' 

これは非常に単純な例です。元のテーブルにインデックス、キー、および/またはデフォルト値がある場合は、そのテーブルも同様に処理する必要があります。

SQL Server Management Studioのテーブルデザイナで変更を加え、変更スクリプトを生成して、実行する必要があることをすべて表示するのが簡単です。

+1

私は個々の書き込みのサイズを最小限に抑えるためにデータのバッチシフトを行います。もちろん、まだ1つのトランザクションであれば、メリットはありません。 – gbn

+0

この場合、INSERT文よりもロギングが少ないため、より性能の高いSELECT INTO文を使用する必要があります。 – Serguei

0

新しい小数点の列をテーブルに追加し、CAST()を使用して複数のバッチでmoney列からデータを取り込み、すべてが完了したときにmoney列を削除すると、時間がかかりますか?

関連する問題