私は自分のアプリケーションの一部をプロファイリングしてきましたが、まったく同じスクリプトを実行する際に、PgAdmin3 が psql よりも大幅に高速であることがわかりました。Unix ソケット、Ubuntu 12.04、Postgresql 9.1、および pgadmin3 v1.14 を使用しています。次のような簡単なスクリプトがあります。
BEGIN
INSERT INTO key_value(section,key,value) VALUES('section','key1','value');
....
INSERT INTO key_value(section,key,value) VALUES('section','key10000','value');
COMMIT;
ここにテーブルがあります:
CREATE TABLE key_value
(
key text NOT NULL,
value text,
CONSTRAINT key_value_pkey PRIMARY KEY (section , key )
)
WITH (
OIDS=FALSE
);
このスクリプトには 10000 の挿入があります。pgadmin3 で実行すると約 0.5 秒、psql で実行すると 2.5 ~ 3.5 秒かかります。どちらもトランザクションにラップされているため、実際には違いはありません。テーブルを再作成したり、完全なバキュームを実行したりしても、結果は一貫しています。Postgresql サーバーにログを記録すると、psql で実行された場合はすべての挿入ステートメントに対して postgres がログを記録していることが示されますが、pgadmin3 から実行された場合は 1 つのログしか記録されません。
psql の実行は次のように行われます。
psql -n -t -f p.sql -o/dev/null
また、テスト済み
psql -n -t -1 -f p.sql -o/dev/null
私の質問は、なぜ psql が非常に遅いのか、postgresql が一方のクライアントではすべてのステートメントをログに記録するのに、もう一方のクライアントではトランザクション全体のみをログに記録する理由と、psql に簡単な修正があるかどうかです。
編集明確にするために、ステートメントではなく期間を記録しています:
サーバーでは、psqlで実行すると次のようになります
2012-10-02 12:20:32 CEST LOG: duration: 0.283 ms
....
2012-10-02 12:20:35 CEST LOG: duration: 0.285 ms
2012-10-02 12:20:35 CEST LOG: duration: 0.291 ms
2012-10-02 12:20:35 CEST LOG: duration: 0.279 ms
2012-10-02 12:20:35 CEST LOG: duration: 0.284 ms
2012-10-02 12:20:35 CEST LOG: duration: 0.279 ms
2012-10-02 12:20:35 CEST LOG: duration: 0.299 ms
....
2012-10-02 12:20:36 CEST LOG: duration: 5.779 ms
pgadmin3 で実行する場合:
2012-10-02 12:23:21 CEST LOG: duration: 532.695 ms
ユーザーとデータベースは psql と pgadmin3 で同じです