【发布时间】:2012-10-22 15:07:13
【问题描述】:
您好,我托管在 Heroku 上,在他们的 Ika 计划(7.5gb ram)上运行 postgresql 9.1.6。我有一张叫汽车的桌子。我需要执行以下操作:
SELECT COUNT(*) FROM "cars" WHERE "cars"."reference_id" = 'toyota_hilux'
现在这需要大量时间(64 秒!!!)
Aggregate (cost=2849.52..2849.52 rows=1 width=0) (actual time=63388.390..63388.391 rows=1 loops=1)
-> Bitmap Heap Scan on cars (cost=24.76..2848.78 rows=1464 width=0) (actual time=1169.581..63387.361 rows=739 loops=1)
Recheck Cond: ((reference_id)::text = 'toyota_hilux'::text)
-> Bitmap Index Scan on index_cars_on_reference_id (cost=0.00..24.69 rows=1464 width=0) (actual time=547.530..547.530 rows=832 loops=1)
Index Cond: ((reference_id)::text = 'toyota_hilux'::text)
Total runtime: 64112.412 ms
一点背景:
该表包含大约 320 万行,而我试图依靠的列具有以下设置:
reference_id character varying(50);
和索引:
CREATE INDEX index_cars_on_reference_id
ON cars
USING btree
(reference_id COLLATE pg_catalog."default" );
我做错了什么?我预计这种表现不是我应该期待的——或者我应该期待吗?
【问题讨论】:
-
afaik ,您应该期望如此,因为任何 where 子句都会强制进行全表扫描,而与标准/索引无关
-
hmmm 但是我怎样才能利用已经存在的reference_id 上的索引呢?顺便说一句,为什么在解释中使用它呢?
-
this 可能会有所帮助..
-
您似乎正在经历分散数据页上的许多磁盘寻道(位图堆扫描)的高延迟。您可以尝试立即第二次重新执行查询,以查看数据在缓存中时的差异。 EXPLAIN ANALYZE 的 BUFFERS 选项在这里也很有用。
-
@MikeChristensen:wiki 页面仅用于计算表中的 all 行,没有任何(where)条件。 用条件计算是完全不同的事情。