我正在使用 Postgres 9.2.24。
我有一个名为_order
大约 100,000,000 行的表。该表有一个名为 的列merged_id int8
。大约 2,000,000_order
行有一个merged_id
值,其余的为空。
我发现两种不同的 Postgres 行为,我在其中_order
使用查询进行搜索
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
在子句中显示seq_scan
100 多个 id 编号。WHERE
为什么是这样?
有什么办法可以解决吗?