小编yc *_*c l的帖子

具有许多值的 Postgres IN 子句不使用部分索引

我正在使用 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_scanWHERE子句中显示100 多个 ID 号。

为什么是这样?
有什么办法可以解决吗?

sql postgresql indexing sql-in

3
推荐指数
1
解决办法
1403
查看次数

标签 统计

indexing ×1

postgresql ×1

sql ×1

sql-in ×1