[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 メーリングリストの案内