我有一个如下表。我有一个复合主键。我还为辅助键添加了索引。当我运行简单查询时,性能有点慢。例如
CREATE TABLE item_ka_preview_relation (
item_id varchar(40) NOT NULL,
item_type varchar(40) NOT NULL,
ka_id varchar(40) NOT NULL,
sequence_number int4 NULL,
creation_date timestamp NOT NULL,
last_modified_date timestamp NOT NULL,
pp_association_by_rule bool NULL DEFAULT false,
CONSTRAINT item_ka_relation_preview_pkey PRIMARY KEY (item_id,ka_id),
CONSTRAINT item_ka_relation_preview_item_type_fkey FOREIGN KEY (item_type) REFERENCES item_type(id)
);
CREATE INDEX idx_itemkarelation_preview_itemtype ON item_ka_preview_relation (item_type DESC) ;
CREATE INDEX idx_itemkarelation_preview_kaid ON item_ka_preview_relation (ka_id DESC) ;
该表有100万行。下面的查询获取了约8万行。
explain analyze
select * from item_ka_preview_relation ik where ik.ka_id in ('3800042','69104128','2300023','3800019','5400264','3800039')
分析就是这样
Bitmap Heap Scan on item_ka_preview_relation ik (cost=5867.27..20251.85 rows=255062 width=54) (actual time=23.029..115.286 rows=250064 loops=1)
Recheck Cond: ((ka_id)::text = ANY ('{3800042,69104128,2300023,3800019,5400264,3800039}'::text[]))
Heap Blocks: exact=8490
-> Bitmap Index Scan on idx_itemkarelation_preview_kaid (cost=0.00..5803.50 rows=255062 width=0) (actual time=21.741..21.742 rows=250064 loops=1)
Index Cond: ((ka_id)::text = ANY ('{3800042,69104128,2300023,3800019,5400264,3800039}'::text[]))
Planning time: 0.328 ms
Execution time: 160.677 ms
尽管我已经索引了ka_id列,但查询仍使用位图堆扫描并且响应速度很慢
任何改善这一点的想法。我正在使用Postgres 9.6.1
位图索引扫描实际上使查询更快。选择它的原因是结果行很多。
您可以通过将enable_seqscan
和enable_bitmapscan
设置为off
并检查是否可以缩短执行时间来进行测试。
如果这样做,也许您应该将effective_cache_size
调高和/或将random_page_cost
调低,使其与您的实际硬件相匹配。