[PHP-users 20632]Re: pg_free_result呼び出しタイミングについて

Yasuo Ohgaki yohgaki @ ohgaki.net
2004年 3月 3日 (水) 09:56:17 JST


大垣です。

# ほとんど出尽くしているので少しだけ

Kenji Ono wrote:
> 小野です。
> 
> 
>>近藤です。
>>
>>
>>>ただ、ここでおっしゃっているスクリプトの終了とは、PG_QUERYの後と
>>>なるのでしょうか。
>>
>>いえ、PG_QUERYの後ではなくスクリプトの終了です。
>>ソース内の全ての処理が終わる時に自動的に開放されると言う事です。
> 
> 
> なるほど。
> だとすると、たくさんPG_QUERYを発行する箇所はある程度のタイミング
> でPG_FREE_RESULTしたほうがよいのでしょうね。

沢山と言うのは「回数」では無く「メモリ」の方が問題になります。
具体的にはメモリリミットに達してしまう場合などです。

# ただし、PostgreSQLのresult resoruceはメモリリミットに加算
# されないので注意が必要です。resultをPHPの変数に代入した場合
# にのみメモリリミットに加算されます。
# これはPHPのDBモジュール共通です。

> 
> 
>>ただ、織田さんが、
>>
>>>私はPostgresは余り良く知らないので、MySQLの場合で。
>>
>>と、言われている通り、私もMySQLでの話しなので、PostgreSQLの場合は
>>どうなのか分かりません。多分同じだろ〜と自分では思ってますが・・・。
>>
>># 今、マニュアルを見てみましたが、ここら辺はMySQLと同じですね。
>>
>>サンプルみたいに頻繁に pg_free_result() は使わなくてもよいのではと思います。
>>ちなみに私の場合ですが、MySQLでですが、pg_free_result() と同等の関数は一度も
> 
> 使用していません。
> 
> これは凄い。
> ある程度負荷をかけてPostmasterが暴走しないかぎり、pg_free_result
> は使用しないようにします。

Connectionもresultもですが、PHPでは不必要なリソース(変数全般)の開放
は普通はパフォーマンス上不利です。ですから通常は不精をして開放はし
ません。

先に書きましたがDBに問い合わせした結果はメモリリミットによって制限
されません。どんなに大きな問い合わせ結果でも実行してしまうので注意
が必要です。

例:
pg_query("SELECT * FROM my_table LIMIT ".int_val($_GET['limit']));
$_GET['limit']が999999999でも大丈夫なようにチェックする必要があり
ます。普通は入力のチェック時に上限、下限をチェックします。

負荷を掛けてPostgreSQLが暴走する事はほとんど無いと思います。暴走す
るのでは無く、過負荷状態になってレスポンスが非常に悪くなる、状態は
発生します。この場合pg_free_resultを使っても状態は改善しないはずで
す。システム全体のクエリ方法の改善、DBのクラスタ化などが必要と思い
ます。

--
Yasuo Ohgaki








PHP-users メーリングリストの案内