[pgsql-jp: 36014] EXPLAIN ANALYZE SELECT文の検索結果時間とPHPで実行した際の検索時間の違いについて

ces h nkjmhrk @ hotmail.com
2005年 9月 16日 (金) 16:52:08 JST


初めて投稿させて頂きます。cesと申します。
気になる事があるので質問させて下さい。
PHPの事も多少入ってしまいますが、よろしくお願いします

PHPからSQLを発行して、
検索結果を取得してその内容を表示するといった
ものを作ったのですが、検索がものすごく時間がかかってしまい困っています。
具体的に言いますと、
約5000件のデータ(1件データに項目は20項目程)を取得するのに
約2分かかってしまいます。

時間の計測の仕方は、PHPでSQLを実行してデーを返してくれる関数を

$timestart1 = microtime();

$res = pg_exec( $conn, $sql ) )

$timeend = microtime();
$diff = number_format(((substr($timeend,0,9)) + (substr($timeend,-10)) - 
(substr($timestart1,0,9)) - (substr($timestart1,-10))),4);

として、計った所この部分で109秒程かかってるみたいでした。
(この1行だけに処理時間のの8〜9割は使われてる感じです・・・)

ここのサーバーはWeb用サーバーとDB用サーバーが別々にあるのですが、
DBサーバーにtelnetで接続して
PHPから発行したSQLとまったく同じものを
頭にEXPLAIN ANALYZEを付けて
直接打込んでみた所、Total runtime: 2408.63 msecと表示されました
これはSQLでの検索は約2秒という認識でいいのでしょうか?
もしそうだとしたら残りの107秒はどこに費やされてるのでしょうか?

色々ネットや掲示板で質問等して探して見た所では、
サーバーのデータの転送量に制限か何かがあって
検索結果のデータをPHPに返すのに時間がかかってるのかも?
という風に私は思ってるのですが・・・
それが原因だという証拠が見つからなくて困ってます。

このサーバーにはファイヤーウォールが入ってるみたいでして、
FTPやtelnetで繋ぐ際にはあるWebページに飛びそこでIDとパスワードを
入れてからじゃないと繋がらない仕組みになっています。

環境は
PostgreSQL 7.2.2
PHPは4.3
になります

何かわかる方がいましたらよろしくお願いします

以下は実際に発行したSQLとEXPLAIN ANALYZEの結果になります

■SQL文
EXPLAIN ANALYZE SELECT usr_idd, shn_idd, usr_nam_sei || ' ' || usr_nam_mei 
as nam, usr_frg_sei || ' ' || usr_frg_mei as frg, usr_mil, usr_ybb
_001 || ' ' || usr_ybb_002 as ybb, tdf_nam, usr_jus_001 || usr_jus_002 || 
usr_jus_003 as jus, usr_tel_001, usr_tel_002, usr_tel_003 as tel, usr_bir, 
u
sr_job, usr_job_etc, ans_nam, usr_mnt, usr_sts, usr_szi, usr_yor, usr_ryu, 
usr_typ, ker_nam, usr_ker_etc, usr_shp, usr_kto, TO_CHAR( usr_tlk_hzk, 'YYY
Y/MM/DD HH24:MI:SS' ) as usr_hzk FROM t_usr, m_tdf, m_ker, m_answer WHERE 
usr_tdf = '12' AND usr_mil_okk = ans_idd AND ker_idd = usr_ker AND tdf_idd 
=
 usr_tdf ;

■EXPLAIN ANALYZEの結果
Merge Join  (cost=4839.02..4906.28 rows=4476 width=328) (actual 
time=1797.94..2367.11 rows=4132 loops=1)
  ->  Sort  (cost=4836.20..4836.20 rows=4476 width=306) (actual 
time=1795.74..1819.13 rows=4132 loops=1)
        ->  Merge Join  (cost=4497.57..4564.75 rows=4476 width=306) (actual 
time=1239.10..1733.06 rows=4132 loops=1)
              ->  Sort  (cost=4496.24..4496.24 rows=4476 width=272) (actual 
time=1238.15..1260.72 rows=4132 loops=1)
                    ->  Merge Join  (cost=4157.64..4224.79 rows=4476 
width=272) (actual time=760.82..1140.65 rows=4132 loops=1)
                          ->  Sort  (cost=4156.58..4156.58 rows=4476 
width=259) (actual time=760.22..780.92 rows=4132 loops=1)
                                ->  Seq Scan on t_usr  (cost=0.00..3885.14 
rows=4476 width=259) (actual time=0.16..688.59 rows=4132 loops=1)
                          ->  Sort  (cost=1.05..1.05 rows=3 width=13) 
(actual time=0.40..20.11 rows=2062 loops=1)
                                ->  Seq Scan on m_answer  (cost=0.00..1.03 
rows=3 width=13) (actual time=0.05..0.09 rows=3 loops=1)
              ->  Sort  (cost=1.34..1.34 rows=12 width=34) (actual 
time=0.63..20.70 rows=3489 loops=1)
                    ->  Seq Scan on m_ker  (cost=0.00..1.12 rows=12 
width=34) (actual time=0.05..0.20 rows=12 loops=1)
  ->  Sort  (cost=2.82..2.82 rows=48 width=22) (actual time=1.57..23.59 
rows=4145 loops=1)
        ->  Seq Scan on m_tdf  (cost=0.00..1.48 rows=48 width=22) (actual 
time=0.04..0.70 rows=48 loops=1)
Total runtime: 2408.63 msec

_________________________________________________________________
ウィルス駆除も無料の 「MSN Hotmail」  http://www.hotmail.com/ 




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