私は 23 億行と 76 GB のサイズの大きなデータベースを持っています。
私の問題は、列の型をに変換したいのですsmalldatetime
が、この操作中に .ldf ファイルが大きくなりすぎてディスク領域全体 (最大 350 GB) が必要になり、クエリがエラーで終了することです。
.ldf を小さく保つ方法はありますか?
オプションから .ldf を縮小しました。
データベース復旧モデルはシンプルに設定されています。
私は 23 億行と 76 GB のサイズの大きなデータベースを持っています。
私の問題は、列の型をに変換したいのですsmalldatetime
が、この操作中に .ldf ファイルが大きくなりすぎてディスク領域全体 (最大 350 GB) が必要になり、クエリがエラーで終了することです。
.ldf を小さく保つ方法はありますか?
オプションから .ldf を縮小しました。
データベース復旧モデルはシンプルに設定されています。
smalldatetime 型の新しい null 許容列を追加します。次に、古い列の値に基づいて値を設定することにより、その列にゆっくりと (つまり、10 ~ 100k 行のバッチなど) データを入力します。すべての行に新しい列の値が設定されたら、古い列を削除し、新しい列の名前を古い列の名前に変更します。
これにより、ログ ファイルに深刻な影響を与えるほど大きなトランザクションが発生しないことが保証されます。
ここに最終的なコードがあります:私は今それを実行しているので、明日100%良いかどうかはわかりますが、うまくいくようです
WHILE (2 > 1)
BEGIN
BEGIN TRANSACTION
UPDATE TOP ( 10000 ) [ais].[dbo].[imis position report]
SET [time2] = convert(smalldatetime, left(date, 19))
IF @@ROWCOUNT = 0
BEGIN
COMMIT TRANSACTION
BREAK
END
COMMIT TRANSACTION
-- 1 second delay
WAITFOR DELAY '00:00:01'
END -- WHILE
GO