はじめに
Delete処理の前に、一度削除対象テーブルに対してselect count (*)を実行すると、その後のdelete処理が高速化されるそうです。
DELETE処理の前に対象テーブルにselect count (*)を実行すると
なぜか、DELETE処理が速くなります。
Oracle Technology Network (OTN) Japan - 掲示板 : DELETE処理の処理速度UPについて ...
本当にdelete処理が速くなるのか、検証してみました。
【オラクル認定資格試験対策書】ORACLE MASTER Bronze[Bronze DBA11g](試験番号:1Z0-018)完全詳解+精選問題集 (オラクルマスタースタディガイド)
posted with amazlet at 15.02.01
エディフィストラーニング株式会社 飯室 美紀 岡野 友紀 西 昭彦 鈴木 佐和
ソフトバンククリエイティブ
売り上げランキング: 10,692
ソフトバンククリエイティブ
売り上げランキング: 10,692
条件
- Oracle 11g Enterprise Edition 11.2.0.1.0 / Windows Server 2008 R2
- 削除テーブルには100万件のレコード
- 全レコードをpl/sqlで1000件ずつdeleteして、コミット。
- 全レコード削除にかかる処理時間を計測
- 3回試行、試行前に共有プールとバッファキャッシュをクリア
レコードを削除するPL/SQL
事前にselectする・しないは、select count(*) INTO vTableRecord from table01;の部分をコメントアウトする・しないを切り替えて計測しました。
set serveroutput on; declare vNum NUMBER; vDelCount NUMBER; vTableRecord NUMBER; begin vNum := 0; vDelCount :=0; --select count(*) INTO vTableRecord from table01; loop --レコードを削除 delete from table01 where 'A' = 'A' and rownum <= 1000; vDelCount := SQL%ROWCOUNT; commit; IF vDelCount = 0 THEN exit; END IF; vNum := vNum + vDelCount; end loop; dbms_output.put_line (vNum || '件削除しました'); end; /
測定結果
試行回数 | 事前selectあり | selectなし |
1st | 67.328 | 68.516 |
2st | 67.328 | 69.656 |
3st | 63.891 | 69.641 |
avg | 66.18 | 69.27 |
若干、事前にselectするほうが優位
誤差の範囲内かもしれませんが、100万件で3秒程度、事前にselectするほうが優位という結果です。
statspackのレポートを見てもほどんど差が出ませんでした。