- PR -

SQLServer2005 ログ領域不足

投稿者投稿内容
KT工房
常連さん
会議室デビュー日: 2006/06/20
投稿数: 49
投稿日時: 2008-11-12 18:02
いつもお世話になっております。

現在SQLServer2005にてログ領域が不足する問題が発生して困っています。
状況としては大量のデータを削除した時に、ログ領域が制限以上になってしまうようで、途中でエラーとなってしまいます。
復旧モデルは単純にしているので、ログ領域を使わないと思っていたのですが、
どうも使った後に切り捨てる動作になっているようです。
ログ領域の上限を増やせば問題ないような気もしますが、増やさずに済む方法は無いでしょうか?

もし、わかる方がおられましたらご教授お願いします。
ハニワ祭り
大ベテラン
会議室デビュー日: 2005/11/15
投稿数: 115
投稿日時: 2008-11-12 21:43
復旧モデルは単純でもコミットされてデータファイルに書き込まれるまでは、
トランザクションログに残るので、
1回のトランザクションで削除するデータ量を減らすべし。
KT工房
常連さん
会議室デビュー日: 2006/06/20
投稿数: 49
投稿日時: 2008-11-13 11:16
データベースエンジンクエリからトランザクションを張らずに
単純にDELETE文を呼んでいるだけなのですが、
それでもトランザクションが残ってしまうのでしょうか?
逆にトランザクションログを残さずに削除を行う方法はありませんか?
ハニワ祭り
大ベテラン
会議室デビュー日: 2005/11/15
投稿数: 115
投稿日時: 2008-11-15 13:30
ムリ。明示しなくてもに自動トランザクションてやつが、
ステートメント単位の一貫性を保証してくれますね。
それをしないと、SQLが途中でこけたときに、中途半端に更新されてしまうわけで、
DBMSの実装としてはありえないはず。
TOP 10000 とかつけたSQLを、WHILEループでまわしてください。
いとっと
常連さん
会議室デビュー日: 2005/06/10
投稿数: 33
投稿日時: 2008-11-15 13:48
仮に対象テーブルの全てのデータを削除してもよいのであればtruncate table句を
使えばトランザクションログの増加は抑止出来ます。
全部消せないのであれば消したくないデータを一時テーブルへ退避した上で
truncate tableを使って全削除→必要なデータを戻すという対応も可能かと。

http://msdn.microsoft.com/ja-jp/library/ms177570.aspx

引用:

各行の削除内容を記録せずにテーブル内のすべての行を削除します。TRUNCATE TABLE は、WHERE 句を伴わない DELETE ステートメントに似ています。ただし、TRUNCATE TABLE の方が高速で、使用するシステム リソースとトランザクション ログリソースも少なくなります。

ハニワ祭り
大ベテラン
会議室デビュー日: 2005/11/15
投稿数: 115
投稿日時: 2008-11-15 16:05
Insertでログがあふれたりすると…大混乱するかもね。
いとっと
常連さん
会議室デビュー日: 2005/06/10
投稿数: 33
投稿日時: 2008-11-15 16:45
引用:

ハニワ祭りさんの書き込み (2008-11-15 16:05) より:
Insertでログがあふれたりすると…大混乱するかもね。




大混乱ってw
細かいことを言い出したらtopを使った方法だって同じですよね?
最適な制御方法については状況を把握した上で対応するしかないと思いますよ。
KT工房
常連さん
会議室デビュー日: 2006/06/20
投稿数: 49
投稿日時: 2008-11-18 09:26
色々コメントありがとうございます。

単純に一定の件数まで削除したいだけなので、
途中でこけても途中まで削除されているのであれば全然良いのですがね
トランザクションログの容量を増やしてチャレンジしてみましたが、
今度はtempdbがあふれちゃいまして(笑)
おとなしく少しずつ削除する方法に切り替えようかと思います。
しかし、7億件・・・。
設計がマズイと思うんだけど、聞き入れてくれない(泣)

スキルアップ/キャリアアップ(JOB@IT)