QA@IT

DB(oracle)削除処理について

10427 PV

お世話になります。

夜間に起動する、削除バッチについて質問があります。

asp.net,oracle1,batch(C#)で運用されている、システムがあります。

データを蓄積するあるテーブル(仮にAテーブル)があり、画面を参照すると、情報がAテーブルに
インサートされていきます。

そのまま、削除せずに蓄積だけしていると、Aテーブルは、肥大化してしまうので、定期的に削除バッチで
削除を行い、肥大化を防ぐ仕組みをとっています。

バッチのSQLは、単純にDELETE分を発行し、条件を加えてAテーブルの不要なデータを削除しています。

WEBは、常に動いており、参照されるたびに、蓄積されており、バッチの削除が行われている間に
インサートも想定されます。。
たくさんのレコードあり、削除中(夜中?)に、参照が行われインサートすると、コミットが
行われるまで、処理待ちになりますか?

また、大量のデータの処理中でも、WEB側の参照部分に影響が出ないような、SQLとする場合は
どのようにすればよいのでしょうか?
現状、削除フラグなどは特にみておらずといった感じになります。

ご教授お願いします。

回答

ログのようなものですかね?WebからそのAテーブルを参照しない(Insertしかしない)のであれば影響は出ないと思います(量にもよりますが)。

少なすぎるMaxTransやインデックスが特殊な設定になっていない限りは、DELETEは行ロックだったように思いますのでその削除対象の行を参照しない限りはインサートは処理待ちにはならないと思います。
というかDeleteしてCommitせずに別のセッションから Insertすれば確かめられるのでは?

データ量によってはUndoやアーカイブログにも注意してください。

編集 履歴 (0)
  • flied_onionさん
    レスありがとうございます。

    行ロックですか・・
    仮に10レコードあった場合に、DELETEを発行して、すべて削除した場合、瞬間的ですが、10レコードまでロック範囲が広がっていくイメージでしょうか?
    また、テーブルロックでないので、INSERTには、問題ないという理解でよろしいでしょうか?
    同様にSELECTした場合はどうなりますでしょうか?
    -
  • Oracleのデフォルトのトランザクション分離レベルにおいては一意制約違反がなければINSERTは問題ありません。 SELECTについても削除の途中で問い合わせをしてもデータベース的には問題ありません(=エラーとはなりません)。ただしファントムリードもノンリピータブルリードも発生します(二つの言葉の意味がわからない場合は調べてください)。 -

flied_onionさん

レスありがとうございます。 行ロックですか・・ 仮に10レコードあった場合に、DELETEを発行して、すべて削除した場合、瞬間的ですが、10レコードまでロック範囲が広がっていくイメージでしょうか? また、テーブルロックでないので、INSERTには、問題ないという理解でよろしいでしょうか?

同様にSELECTした場合はどうなりますでしょうか?
(参照とはSELECTのことを言っていますでしょうか?)

編集 履歴 (0)
  • 私の回答の方のコメントにて返信済みですので、こちらは割愛させていただきます。 -
ウォッチ

この質問への回答やコメントをメールでお知らせします。