MSSQL Server 2005には、最大100列、約3,000万行のテーブルがあります。
2つの列を変更する必要があります-それらのタイプをVARCHAR(1024)からVARCHAR(max)に変更します。これらの列にはインデックスがありません。
ログがいっぱいになり、操作が失敗するのではないかと心配です。そのような操作が失敗しないようにするために必要な、データとログの両方の必要な空きディスク容量をどのように見積もることができますか?
MSSQL Server 2005には、最大100列、約3,000万行のテーブルがあります。
2つの列を変更する必要があります-それらのタイプをVARCHAR(1024)からVARCHAR(max)に変更します。これらの列にはインデックスがありません。
ログがいっぱいになり、操作が失敗するのではないかと心配です。そのような操作が失敗しないようにするために必要な、データとログの両方の必要な空きディスク容量をどのように見積もることができますか?
代わりに、次のことを検討することをお勧めします。
これははるかにコストのかからない操作であり、INSERT / SELECTを使用して最小限のログで実行できる可能性があります(これがSQL Server 2008以降の場合)。
VARCHAR制限を増やすとログがいっぱいになるのはなぜですか?
確かに、列サイズを大きくすると(MAXを含む)、すべての行が更新されるため(シーンの背後で古い列が削除され、新しい列が追加されてデータがコピーされるため)、大きなテーブルの巨大なログが生成されます。
VARCHAR(MAX) NULL
。null許容列として、メタデータとしてのみ追加されます(データ更新なし)sp_rename
新しい列の名前を古い列名に変更するために使用します。このようにして、ステップ2)でバッチを制御することにより、ログを制御できます。また、テーブル全体を新しいテーブルにコピーしないことで、アクセス許可、制約、および関係の中断を最小限に抑えます(SSMSの場合とは異なります...)。
このシーケンスは、両方の列に対して同時に実行できます。
少しずつテストしてみてください。つまり、数千行の同じ構造をローカルで作成して、前後の違いを確認することができます。変化は直線的だと思います。本当の問題は、一度に実行できるので、やり直しログがそれに収まるかどうかについてです。オンラインで行う必要がありますか、それともしばらくの間生産を停止できますか?停止できる場合は、OracleのようにMSSQLでREDOログを停止する方法があるかもしれません。それはそれをはるかに速くすることができます。オンラインで行う必要がある場合は、新しい列を作成し、値を10000行ずつのサイクルでコピーし、コミットして続行することができます。元の列を削除して新しい列の名前を変更することを完了した後は、変更するよりも高速です。