[pgsql-jp: 41090] Re: Question about "Total runtime"

Hiroki Kataoka kataoka @ interwiz.jp
2012年 4月 18日 (水) 14:09:25 JST


片岡です。

私もEXPLAINの結果のrowsの多さに疑問を感じてました。
よって、「パースに時間がかかってる」に1票。

皆さんからのアドバイスをもとに、パースに時間がかかっていることが間違いないようであれば、まずは、そんなに複雑なクエリーが本当に必要なのか(なにか根本的に間違えてないか?)等を検討してみてください。

それでも複雑なクエリーにならざるを得ないなら、毎回パースすることを防ぐために問題のSELECT文をSQL関数にまとめてみてください。

CREATE FUNCTION osoi_select (userid integer, name text, address text)
RETURNS SETOF record
AS $$
  SELECT a.time AS time FROM a, b  WHERE a.userid = $1 AND b.time  = a.time
  AND b.name = $2 AND a.address = $3 limit 1;
$$
LANGUAGE sql STABLE;

※上記の最後「STABLE」で良いかは確認してください。http://www.postgresql.jp/document/8.3/html/xfunc-volatility.html

で、実際に問い合わせしている部分をSQL関数の呼び出しに置き換えます。

SELECT c.time FROM osoi_select(10, 'OGAWA', 'Yokohama') AS c;

本当にパース時間が問題であれば、これでEXPLAIN ANALYZEに近い時間で問い合わせできるようになります。

2012年4月17日12:10 Jun Ogawa <jogawa @ gmail.com>:
> 小川と申します。お世話になっております。
>
> EXPLAIN ANALYZEの"Total runtime"の解釈について、質問させてください。
>
> 開発中のDBシステムの性能解析をしています。
>
> ある検索のSQL(後述)で、EXPLAIN ANALYZEをかけたところ、
>
> Total runtime: 3540.537 ms(2954 rows)
>
> と出ました。
>
> 一方、このSQLを呼び出しているJava側で開始前後の時間を図ると17秒かかっています。Java側ではSQL実行文の前後で時刻のログを出させています。
> #手入力でSQLを実行しても、感覚でこれくらいの時間かかっています。
>
> 実際の実行時間とTotal runtimeのこの13.5秒差はどう理解したらいいのでしょうか?
> またこの13.5秒を短縮するためのアドバイスがありましたら、よろしくお願いいたします。
>
> SQL文:
> SELECT A.time FROM A, B  WHERE A.userid = 10 AND B.time  = A.time
> AND B.name = 'OGAWA' AND A.address = 'Yokohama' limit 1 ;
>
> 環境:
> PostgreSQL : 8.3.3
> RedHat: 5.4
>
> 以上です。
>
> ---
> Jun Ogawa
> jogawa @ gmail.com



-- 
Hiroki Kataoka


pgsql-jp メーリングリストの案内