読者です 読者をやめる 読者になる 読者になる

小さい頃はエラ呼吸

いつのまにやら肺で呼吸をしています。


【Oracle】select count (*)してからDeleteすると速くなるのか?

はじめに

Delete処理の前に、一度削除対象テーブルに対してselect count (*)を実行すると、その後のdelete処理が高速化されるそうです。

DELETE処理の前に対象テーブルにselect count (*)を実行すると
なぜか、DELETE処理が速くなります。
Oracle Technology Network (OTN) Japan - 掲示板 : DELETE処理の処理速度UPについて ... はてなブックマーク - Oracle Technology Network (OTN) Japan - 掲示板 : DELETE処理の処理速度UPについて ...

本当にdelete処理が速くなるのか、検証してみました。

【オラクル認定資格試験対策書】ORACLE MASTER Bronze[Bronze DBA11g](試験番号:1Z0-018)完全詳解+精選問題集 (オラクルマスタースタディガイド)
エディフィストラーニング株式会社 飯室 美紀 岡野 友紀 西 昭彦 鈴木 佐和
ソフトバンククリエイティブ
売り上げランキング: 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;
/
測定結果

f:id:replication:20150201215448p:plain

試行回数 事前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のレポートを見てもほどんど差が出ませんでした。
f:id:replication:20150201220742p:plain