[PHP-users 3663] pg_fetch_rowと配列の効率的な使い方

KAWAI,Takanori php-users@php.gr.jp
Mon, 19 Nov 2001 16:19:13 +0900


はじめまして、川合孝典と申します。

PHPはまだはじめたばかりなので、よくわかっていない
のですが、PostgreSQLを使ってPerlとベンチマークで速度比較を
しています。

もちろんCGIとmod_phpと比較しても意味が無いので、
構造的にほぼ同様であろうと考えられるmod_perl+Apache::DBIに
して(教科書的な設定しかしていないつもり)、PHP側も持続的
接続pconnectを利用してみました。(下記スクリプト)
詳しい比較の内容は下記URLを参照ください

http://www.hippo2000.net/cgi-bin/KbWiki/KbWiki.pl?
cmd=disp&page=PHP%20vs%20DBI%A5%EB%A1%BC%A5%D7%CA%D4

(2行に渡っているのでつなげていただくか、
http://www.hippo2000.net/cgi-bin/KbWiki/KbWiki.pl
から「PHP vs DBIループ編」  をご覧ください)

その結果、取得する件数や項目が少ないとPHPのほうが速かった
のですが件数が増えていくと次第にPerlのほうが速度的に上回り
ました。時間の掛かり方から考えて、配列を返してくるpg_fetch_rowと
配列そのもの効率の差が出てきているのではないかと考えています。
またここではPerl側は配列リファレンスを使っていますが、
PHPはいわば連想配列ですから一概に同じものとはいえないのでは
と思っています。

そこで、もう少し効率のよい方法というものはあるのでしょうか?
#DBとかclass DBIとかのほうがいいとか

またPHPの使い方、設定、比較の方法などでおかしいと思われる
点がありましたら、ご指摘いただければと思います。

以上よろしくお願いいたします。

[使用したスクリプト]
<HTML>
 <HEAD>
 <TITLE>TEST</TITLE>
 </HEAD>
 <BODY>
 <?php
   $conn=pg_pConnect("host=lins dbname=test user=scott password=tiger");
   $result = pg_Exec($conn,
 "SELECT * FROM TBL_TEST2 WHERE no >= 5000 ORDER BY no LIMIT $limit OFFSET
100");
   if ($result) {
     $sRes = '';
     do {
       @$row = pg_Fetch_Row ($result, $i);
       if ($row) {
         for($k=0;$k<20;$k++) { $sRes .= $row[$k];}
         $sRes .= '<BR>';
         $i++;
       }
     } while ($row);
   }
   echo $sRes;
 ?>
 </BODY>
 </HTML>
 <?php
   pg_Close($conn);
 ?>

===================================================
川合 孝典 (Hippo2000)
   DBI日本語メーリングリスト管理人、Kansai.pm所属
   kwitknr@cpan.org GCD00051@nifty.ne.jp
   http://member.nifty.ne.jp/hippo2000
   http://www.hippo2000.net/
===================================================