【发布时间】:2018-06-07 00:29:45
【问题描述】:
我使用的是 Postgres 9.2.24。
我有一个名为 _order 的表,大约有 100,000,000 行。该表有一个名为merged_id int8 的列。 _order 行中约有 2,000,000 行具有 merged_id 值,其余为 null。
我在搜索 _order 时发现了两种不同的 Postgres 行为,使用查询
select * from _order where merged_id in ( 10001 ,10002 ,10003 ....., 11000);
如果我创建这样的索引:
create index order_merged_id_index on _order(merged_id);
无论 in 子句中有多少个 id(测试从 1 到 50 到 100 到 200 到 1000)EXPLAIN 显示搜索将使用 index_scan。
但如果我改为创建这个部分索引:
create index order_merged_id_index on _order(merged_id) where merged_id is not null;
EXPLAIN 在WHERE 子句中显示seq_scan 表示超过100 个ID 号。
这是为什么?
有什么办法可以解决吗?
【问题讨论】:
标签: sql postgresql indexing sql-in