我正在使用 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);
Run Code Online (Sandbox Code Playgroud)
如果我创建这样的索引:
create index order_merged_id_index on _order(merged_id);
Run Code Online (Sandbox Code Playgroud)
无论 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;
Run Code Online (Sandbox Code Playgroud)
EXPLAINseq_scan在WHERE子句中显示100 多个 ID 号。
为什么是这样?
有什么办法可以解决吗?