- - PR -
Oracle 一括DELETEの速度
1
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 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 ] | ||||||||||||
|
投稿日時: 2007-02-27 12:12
そりゃ、削除対象のデータを探してロールバック用に何かしらの メタデータを作成して...ってやってりゃ時間もかかるでしょうし。 つうか 4 分かかるからって何とも言いようがないでしょう。
10 万件から 4 万件を探すのに、索引がなければ全部のデータを スキャンしないと。 _________________ もしもし@RMAN 友の会 | ||||||||||||
|
投稿日時: 2007-02-27 12:20
バッチ処理のときは、処理前のデータをバックアップして、処理時にはREDOログに記録しないようにしたほうがいいということでしょうか?
| ||||||||||||
|
投稿日時: 2007-02-27 14:25
はい。Oracle は構造上 DELETE が弱いと思います。 PostgreSQL であれば一瞬で終わる DELETE 文が数分かかることは珍しくありません。
UNDO 表領域のサイズにもよると思いますが、余裕があるのであれば、COMMIT 回数を減らすことはパフォーマンスの向上に対してある程度は効果があると思います。
削除するときに指定する述語 (WHERE 句) によっては INDEX があった方が速いことだってあり得ます。 | ||||||||||||
|
投稿日時: 2007-02-27 14:50
直接の回答では ありませんが
削除を早くしたいというのであれば テーブルをパーティション化して 指定パーティションをDROPすれば一瞬で終わります。 | ||||||||||||
|
投稿日時: 2007-02-27 15:13
ありがとうございます。 バージョン8iのため「UNDO表領域」「パーティション」は使えないのです。残念です。 そうすると、バッチ処理時には、REDOログの書き込み処理を減らす(テーブルをNOLOGGINGにする)のがいいのでしょうかね?ちょっと試してみます。 | ||||||||||||
|
投稿日時: 2007-02-27 15:29
パーティションは 8.0(8i 以前)からあります。 ってか、Oracle を使っているってどっかにありましたっけ? そもそも遅いってのが何に比較して遅いとかそういう判断材料って あるんでしょうかね。 あと、Oracle なら SQL トレースとか v$session_wait とかで SQL の実行計画とか待機イベントとか確認できますけど、その あたり何か情報は取っているんでしょうか。 UNDO 情報 REDO 情報以前にバッファ足りないとかいう可能性も あるだろうし。 だれかトランザクション実行してたり _________________ もしもし@RMAN 友の会 |
1