我有以下表格和索引定义:
CREATE TABLE ticket (
wid bigint NOT NULL DEFAULT nextval('tickets_id_seq'::regclass),
eid bigint,
created timestamp with time zone NOT NULL DEFAULT now(),
status integer NOT NULL DEFAULT 0,
argsxml text,
moduleid character varying(255),
source_id bigint,
file_type_id bigint,
file_name character varying(255),
status_reason character varying(255),
...
)
我按照如下方式在created
时间戳上创建了一个索引:
CREATE INDEX ticket_1_idx
ON ticket
USING btree
(created );
这是我的查询:
select * from ticket
where created between '2012-12-19 00:00:00' and '2012-12-20 00:00:00'
直到记录数量增长(约500万条)之前,这个东西还运行良好,现在返回结果需要很长时间。
使用Explain analyze可以得出以下结论:
Index Scan using ticket_1_idx on ticket (cost=0.00..10202.64 rows=52543 width=1297) (actual time=0.109..125.704 rows=53340 loops=1)
Index Cond: ((created >= '2012-12-19 00:00:00+00'::timestamp with time zone) AND (created <= '2012-12-20 00:00:00+00'::timestamp with time zone))
Total runtime: 175.853 ms
到目前为止,我已经尝试设置:
random_page_cost = 1.75
effective_cache_size = 3
还创建了:
create CLUSTER ticket USING ticket_1_idx;
什么都不起作用。我做错了什么?为什么它选择了顺序扫描?索引应该使查询快速。有没有什么可以优化的方法?
effective_cache_size=3
可能有点低了。(但在这种情况下可能不会有影响) - wildplasserselect *
,因为它会增加结果集大小,需要传输到客户端。 - Clodoaldo Neto