- PR -

Oracle 一括DELETEの速度

1
投稿者投稿内容
未記入
ベテラン
会議室デビュー日: 2004/09/27
投稿数: 71
投稿日時: 2007-02-27 12:04
こんにちは。

約10万件のデータに対して、WHERE句(index有効)を指定して一括DELETEを行います。
異なる20個の表でも同処理を行い、COMMITします。
トータル処理時間が4分です。
一括DELETEってこんなに時間がかかるものなのでしょうか?
また、20個の一括DELETEに対して1COMMITよりも、10個の一括DELETEで1COMMITを2セットという感じで分割したほうが速くなるんでしょうか?


indexが原因だと思い、indexを削除して一括DELETEをしたら、15分もかかりました。
DELETEの時は、indexがないほうが速いと聞いたのですが、これはなぜでしょうか?

[ メッセージ編集済み 編集者: 未記入 編集日時 2007-02-27 12:13 ]
もしもし
ぬし
会議室デビュー日: 2004/10/15
投稿数: 280
投稿日時: 2007-02-27 12:12
引用:

未記入さんの書き込み (2007-02-27 12:04) より:

約10万件のデータに対して、WHERE句(index有効)を指定して一括DELETEを行います。
異なる20個の表でも同処理を行い、COMMITします。
トータル処理時間が4分です。
一括DELETEってこんなに時間がかかるものなのでしょうか?



そりゃ、削除対象のデータを探してロールバック用に何かしらの
メタデータを作成して...ってやってりゃ時間もかかるでしょうし。
つうか 4 分かかるからって何とも言いようがないでしょう。

引用:

indexが原因だと思い、indexを削除して一括DELETEをしたら、15分もかかりました。
DELETEの時は、indexがないほうが速いと聞いたのですが、これはなぜでしょうか?



10 万件から 4 万件を探すのに、索引がなければ全部のデータを
スキャンしないと。

_________________
もしもし@RMAN 友の会
未記入
ベテラン
会議室デビュー日: 2004/09/27
投稿数: 71
投稿日時: 2007-02-27 12:20
バッチ処理のときは、処理前のデータをバックアップして、処理時にはREDOログに記録しないようにしたほうがいいということでしょうか?
あんとれ
ぬし
会議室デビュー日: 2004/01/14
投稿数: 556
投稿日時: 2007-02-27 14:25
引用:

未記入さんの書き込み (2007-02-27 12:04) より:

一括DELETEってこんなに時間がかかるものなのでしょうか?



はい。Oracle は構造上 DELETE が弱いと思います。
PostgreSQL であれば一瞬で終わる DELETE 文が数分かかることは珍しくありません。

引用:

また、20個の一括DELETEに対して1COMMITよりも、10個の一括DELETEで1COMMITを2セットという感じで分割したほうが速くなるんでしょうか?



UNDO 表領域のサイズにもよると思いますが、余裕があるのであれば、COMMIT 回数を減らすことはパフォーマンスの向上に対してある程度は効果があると思います。

引用:

DELETEの時は、indexがないほうが速いと聞いたのですが、これはなぜでしょうか?



削除するときに指定する述語 (WHERE 句) によっては INDEX があった方が速いことだってあり得ます。
七味唐辛子
ぬし
会議室デビュー日: 2001/12/25
投稿数: 660
投稿日時: 2007-02-27 14:50
直接の回答では ありませんが


削除を早くしたいというのであれば
テーブルをパーティション化して
指定パーティションをDROPすれば一瞬で終わります。
未記入
ベテラン
会議室デビュー日: 2004/09/27
投稿数: 71
投稿日時: 2007-02-27 15:13
引用:
UNDO 表領域のサイズにもよると思いますが、余裕があるのであれば、COMMIT 回数を減らすことはパフォーマンスの向上に対してある程度は効果があると思います。


引用:
テーブルをパーティション化して
指定パーティションをDROPすれば一瞬で終わります。



ありがとうございます。
バージョン8iのため「UNDO表領域」「パーティション」は使えないのです。残念です。
そうすると、バッチ処理時には、REDOログの書き込み処理を減らす(テーブルをNOLOGGINGにする)のがいいのでしょうかね?ちょっと試してみます。
もしもし
ぬし
会議室デビュー日: 2004/10/15
投稿数: 280
投稿日時: 2007-02-27 15:29
引用:

未記入さんの書き込み (2007-02-27 15:13) より:

バージョン8iのため「UNDO表領域」「パーティション」は使えないのです。残念です。
そうすると、バッチ処理時には、REDOログの書き込み処理を減らす(テーブルをNOLOGGINGにする)のがいいのでしょうかね?ちょっと試してみます。



パーティションは 8.0(8i 以前)からあります。
ってか、Oracle を使っているってどっかにありましたっけ?

そもそも遅いってのが何に比較して遅いとかそういう判断材料って
あるんでしょうかね。
あと、Oracle なら SQL トレースとか v$session_wait とかで
SQL の実行計画とか待機イベントとか確認できますけど、その
あたり何か情報は取っているんでしょうか。
UNDO 情報 REDO 情報以前にバッファ足りないとかいう可能性も
あるだろうし。
だれかトランザクション実行してたり

_________________
もしもし@RMAN 友の会
1

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