我一直在对我的应用程序进行性能分析,发现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
);
这段脚本包含了10,000个插入动作。在pgadmin3中执行所需时间约为0.5秒,在psql中执行则需要2.5到3.5秒的时间。两者都在一个事务中,因此理论上不应有区别。但是在重新创建表、进行完整清理等操作后,结果始终如一。在PostgreSQL服务器中记录的日志显示,当从psql中执行时,每个插入语句都会生成一个日志,而从pgadmin3中执行时只有一个日志。要在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中,用户和数据库是相同的。
COPY
,或者至少使用多值插入。至于不同的日志记录 - 也许你使用了ALTER USER ... SET log_statement = 'all'
并且你正在使用不同的用户与psql和PgAdmin?或者你的psqlrc
中有一个set
? - Craig Ringer