我有一张大桌子。位图堆扫描步骤需要5秒钟以上。
有什么我可以做的吗?我在表中添加了列,对它使用的索引重新索引会有所帮助吗?
我对数据进行合并和求和,所以我不会将50万条记录返回给客户端。 我使用postgres 9.1。 这里的解释:
Bitmap Heap Scan on foo_table (cost=24747.45..1339408.81 rows=473986 width=116) (actual time=422.210..5918.037 rows=495747 loops=1) Recheck Cond: ((foo_id = 72) AND (date >= '2013-04-04 00:00:00'::timestamp without time zone) AND (date <= '2013-05-05 00:00:00'::timestamp without time zone)) Filter: ((foo)::text = 'foooooo'::text) -> Bitmap Index Scan on foo_table_idx (cost=0.00..24628.96 rows=573023 width=0) (actual time=341.269..341.269 rows=723918 loops=1)
询问:
explain analyze SELECT CAST(date as date) AS date, foo_id, .... from foo_table where foo_id = 72 and date >= '2013-04-04' and date <= '2013-05-05' and foo = 'foooooo' Index def: Index "public.foo_table_idx" Column | Type -------------+----------------------------- foo_id | bigint date | timestamp without time zone btree, for table "public.external_channel_report"
表格: foo是text具有4个不同值的字段。 foo_id目前bigint具有10K个不同的值。
foo
text
foo_id
bigint
在(foo_id, foo, date)(按此顺序)上创建一个复合索引。
(foo_id, foo, date)
请注意,如果您选择500k条记录(并将它们全部返回给客户端),这可能会花费很长时间。
您确定您需要客户端上的所有500k记录(而不是某种汇总或LIMIT)吗?
LIMIT