1

データベースがデータを返し、phpスクリプトがデータのフェッチを開始する瞬間まで、phpスクリプトがクエリを実行するため、正確に何が起こっているのかを知りたいです。

理論的には、巨大なテーブルを備えたPostgreデータベースがあり、20列以上のレコードが1,000万/2,000万件あり、データベースのすべての行をたとえばファイルに配置するように要求するphpスクリプトがあります。

私の知識は次のとおりです。

  • phpスクリプトは、SQLクエリを使用してpg_queryコマンドを実行します
  • postgresphpドライバー/拡張クエリを介してデータベースに渡されます
  • データベースが作業を行い、結果をドライバーに返します
  • php postgresドライバーは、結果をサーバーのRAMメモリに保存し、結果を参照するphpスクリプトにリソースIDを返します。
  • pg_fetch_rowはRAMメモリからレコードを読み取ります

私は上記の作業を行っているphpコードの可能な限り最高の最適化を達成しようとしています。

質問は次のとおりです。

  • 私の知識は正しいですか?何かが足りない場合、または私がいくつかのステップについて正しくない場合は、私を修正してください。
  • データベースの結果に割り当てられているRAMメモリの量を知るにはどうすればよいですか?サーバーに十分なメモリがない場合、これは重要になる可能性があります。
  • 単一の行をフェッチしてファイルに保存し、行がある限りこれらの2つの手順を繰り返すことができるので、phpスクリプトに必要なメモリを最小限に抑えることができますが、リソースによって使用されるメモリにどのように影響しますか?

前もって感謝します。

4

2 に答える 2

2

PostgreSQLは(デフォルトで)一度にすべての行を返します。これには、サーバー側のリソースを解放するという利点がありますが、クライアントで大きな結果セットが発生する可能性があります。

別の方法は、一度に1行を返すことができるカーソルを使用することです。一部のドライバーはこれを直接サポートします(おそらくPDO ?)、またはDECLAREFETCHを使用できます

もう1つ注意すべき点は、テーブルまたはクエリをファイルに直接ダンプできるPostgreSQLのCOPYコマンドです(多くの処理/フォーマットが必要ない場合)。datbaseライブラリが直接アクセスを提供しているかどうかを確認してください。

于 2012-07-05T18:09:05.883 に答える
1

クエリ実行後と実行前のPHPスクリプトによって割り当てられたメモリの量の違いにより、DBの結果によって割り当てられたメモリの量がわかります。

$before = memory_get_usage();
$res = pg_query( $sql );
$after  = memory_get_usage();
$amount = $after - $before //This should be size of $res variable;
于 2012-07-05T17:16:48.547 に答える