2012-01-26 25 views
0

我有一个表:PostgreSQL的简单的选择是缓慢

CREATE TABLE my_table 
(
    id integer NOT NULL DEFAULT nextval('seq_my_table_id'::regclass), 
    fk_id1 integer NOT NULL, 
    fk_id2 smallint NOT NULL, 
    name character varying(255) NOT NULL, 
    description text, 
    currency_name character varying(3) NOT NULL, 
    created timestamp with time zone NOT NULL DEFAULT now(), 
    updated timestamp with time zone NOT NULL DEFAULT now(), 
    CONSTRAINT "PK_my_table_id" PRIMARY KEY (id), 
    CONSTRAINT "FK_my_table_fk_id1" FOREIGN KEY (fk_id1) 
     REFERENCES my_table2 (id) MATCH SIMPLE 
     ON UPDATE NO ACTION ON DELETE NO ACTION DEFERRABLE INITIALLY DEFERRED, 
    CONSTRAINT "FK_my_table_fk_id2" FOREIGN KEY (fk_id2) 
     REFERENCES my_table3 (id) MATCH SIMPLE 
     ON UPDATE NO ACTION ON DELETE NO ACTION DEFERRABLE INITIALLY DEFERRED 
) 
WITH (
    OIDS=FALSE, 
    autovacuum_enabled=true, 
    autovacuum_vacuum_threshold=50, 
    autovacuum_vacuum_scale_factor=0.2, 
    autovacuum_analyze_threshold=50, 
    autovacuum_analyze_scale_factor=0.1, 
    autovacuum_vacuum_cost_delay=20, 
    autovacuum_vacuum_cost_limit=200, 
    autovacuum_freeze_min_age=50000000, 
    autovacuum_freeze_max_age=200000000, 
    autovacuum_freeze_table_age=150000000 
); 
ALTER TABLE my_table 
    OWNER TO postgres; 

CREATE INDEX my_table_fk_id1 
    ON my_table 
    USING btree 
    (fk_id1); 

CREATE INDEX my_table_fk_id2 
    ON my_table 
    USING btree 
    (fk_id2); 

表中的记录计数

select count(id) from my_table; --24061 
select count(id) from my_table2; --24061 
select count(id) from my_table3; --123 

执行时间

select * from my_table -- ~17sec 

vacuum/analyze - 不影响
description - 长度〜4000字符在每行

postgres.conf - 非标准设置

版本:9.1

选择除描述各个领域减少执行时间到〜1.5秒

如何icrease选择速度描述?

UPD

--explain analyze select * from my_table 
"Seq Scan on my_table (cost=0.00..3425.79 rows=24079 width=1015) (actual time=0.019..17.238 rows=24079 loops=1)" 
"Total runtime: 18.649 ms" 
+0

你正在使用哪个应用程序来显示'select *'语句的结果?报告哪个运行时报告了解释select * from my_table' –

+0

'select *'只是例子,但是'select fk_id1,fk_id2,name,currency_name,description' - 使用(相同的17秒),也见问题更新 – cetver

+4

运行时* *在服务器上**仅有18 **毫秒**(18.649ms)。这意味着如果您的前端需要17 *秒*,则通过网络(或在客户端应用程序内)发送行的时间会丢失 –

回答

1

的问题是如何使这个快。问题不在服务器上,因为它需要18ms。简单的解决方案是选择较少的列,以减少通过网络进行传输。我的猜测是,你有一些长期的描述。将该列从您的选择中删除并重试。