Thursday, August 31, 2006

Oracle でちょっとしたパフォーマンスチェック

IBM xSeries 336 上の Oracle 10g の SqlPlus で、


select to_char(sysdate , 'YYYYMMDD HH24:MI:SS') from dual;
select 1 from dual;
-- 同じ文を 4640 個
select to_char(sysdate , 'YYYYMMDD HH24:MI:SS') from dual;


としたスクリプトを実行すると、だいたい5秒かかった。次に


select to_char(sysdate , 'YYYYMMDD HH24:MI:SS') from dual;
select 25646 from dual;
-- 同じ文を 4640 個。ただし、乱数になっている。
select to_char(sysdate , 'YYYYMMDD HH24:MI:SS') from dual;


とすると、だいたい20秒かかった。ちなみに乱数は、シェル変数の
$RANDOM を使って、シェルスクリプトで上のファイルを生成した。

SQL 文がまったく同じなら実行計画が再利用されることになるので、最初のスクリプトは5秒しかかからなかった。2番目のスクリプトは、実行計画がその都度、立案されるので時間がかかっている。

つまり、4641 件の SQL の実行計画に 15 秒かかったというわけだから、この SQL の実行計画には 3 ミリ秒ほどかかっていることになる。

実は、この実験は、いまやってる仕事で株の銘柄キーワード検索のパフォーマンスを調べる過程で実行した。MEIGARA_K_TBL に銘柄情報と、それを検索するためのキーワード(正式名称、正式カナ名称、英語名称、略称をタブ区切りにしたカラム)をセットして、


select to_char(sysdate , 'YYYYMMDD HH24:MI:SS') from dual;
SELECT SHOUKEN_CODE || '.' || MARKET_CODE
FROM MEIGARA_K_TBL
WHERE VALID_FLAG = 1 AND INSTR(KEYWORDS, 'イノテック') > 0 ORDER BY SHOUKEN_CODE;
--
-- キーワード部分を変えた文を 4640 個
--
select to_char(sysdate , 'YYYYMMDD HH24:MI:SS') from dual;


としたスクリプトを実行した。この結果はだいたい 40 秒であった。キーワードが各々異なるので実行計画はその都度、立案されていることになる。先ほどの SQL 文の実行計画を立てるのと同じだけの時間がかかっているとすると、4641 回の文字列部分一致検索に 25 秒だけかかっていることになる。

つまり、1回あたり、5 ミリ秒ほどだ。Oracle Text を使えばもっと速くなる余地はありそう。

ちなみに、部分一致検索では、LIKE 検索を使うよりは、ここでのように関数を使った方が速い。

No comments: