« Dirty Readは許容されない | トップページ | PostgreSQLでは"EXISTS"は有効 »

2014.09.06

Explainによるコストを取得するPL/pgSQL

前に作った、phppgAdmin的なツールの機能強化として「重たいクエリーは実行させる前にはじいちゃえ」という機能を入れることとした。
動的に組み立てられたSQLを、実際に実行する前にExplainで実行して、推計コストが一定量以上の場合はコーションなりエラーなりを出すという仕掛け。
で、実装については使い勝手を考慮してPL/pgSQLで作ってみることとした。

で、これがそのサンプル。まだコーディングとしては見直したいけども、とりあえず動作はする(^^;
CREATE OR REPLACE FUNCTION chk_cost(target_query text) RETURNS real AS
$BODY$
DECLARE
  ret real;
  t_ret text;
  ret_let integer;
  start_let integer;
  end_let integer;
  curs refcursor;
  explain_result text;
BEGIN
  OPEN curs FOR
  EXECUTE 'EXPLAIN ' || target_query;

  FETCH curs INTO explain_result;
  start_let := position('..' in explain_result) + 2;
  end_let := position(' row' in explain_result);

  ret_let := end_let - start_let;

  t_ret := substring(explain_result FROM start_let FOR ret_let);
  ret := to_number(t_ret, 'FM999999999.99');

  CLOSE curs;

  RETURN ret;
  EXDCEPTION
    WHEN OTHERS THEN
      RETURN -1; END
$BODY$
LANGUAGE plpgsql

変数target_queryに入れるSQLについては引用符がある場合には格納時にエスケープしないとうまくいかないけども、これでなんとか。

SELECT * FROM chk_cost('select * from chk_cost('select col1,count(col2) from test group by col1 order by col1')');

使い方はこんな感じ。これで得られたコストが一定量以上なら警告、ということができるので、いろいろと応用範囲はあるんじゃないかと思う。

|

« Dirty Readは許容されない | トップページ | PostgreSQLでは"EXISTS"は有効 »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/2022/60266515

この記事へのトラックバック一覧です: Explainによるコストを取得するPL/pgSQL:

« Dirty Readは許容されない | トップページ | PostgreSQLでは"EXISTS"は有効 »