带有 IN 的 postgres 查询非常慢
postgres query with IN is very slow
我有一个 table,它在(A 列,B 列)上有一个索引。我是 运行 一个看起来像这样的查询:
SELECT * FROM table WHERE (A, B) IN ((a_1, b_1), (a_2, b_2), ..., (a_5000, b_5000))
这个查询很慢!
计划如下:
Bitmap Heap Scan on table
Recheck Cond: (((A = a_1) AND (B = b_1)) OR ((A = a_2) AND (B = b_2)) OR ...
-> BitmapOr
-> Bitmap Index Scan on idx
Index Cond: ((A = a_1) AND (B = b_1))
-> Bitmap Index Scan on idx
Index Cond: ((A = a_2) AND (B = b_2))
...(5000 other Bitmax Index Scan)
postgres 似乎一次只用一个值进行 5000 次索引扫描,而不是使用 5000 个值进行一次索引扫描,这解释了为什么查询如此缓慢。
实际上做这样的事情要快得多:
SELECT * FROM table WHERE A IN (a_1, ..., a_5000)
获取结果,然后在应用内对 B 列进行筛选 (python)。
我真的更希望 postgres 在合理的 运行 时间内过滤结果。有解决方法吗?
尝试加入 CTE:
with value_list (a,b) as (
values
(a_1, b_1),
(a_2, b_2), ...,
(a_5000, b_5000)
)
select *
from table t
join value_list v on (t.a, t.b) = (v.a, v.b);
(假设值列表中没有重复值)
我有一个 table,它在(A 列,B 列)上有一个索引。我是 运行 一个看起来像这样的查询:
SELECT * FROM table WHERE (A, B) IN ((a_1, b_1), (a_2, b_2), ..., (a_5000, b_5000))
这个查询很慢! 计划如下:
Bitmap Heap Scan on table
Recheck Cond: (((A = a_1) AND (B = b_1)) OR ((A = a_2) AND (B = b_2)) OR ...
-> BitmapOr
-> Bitmap Index Scan on idx
Index Cond: ((A = a_1) AND (B = b_1))
-> Bitmap Index Scan on idx
Index Cond: ((A = a_2) AND (B = b_2))
...(5000 other Bitmax Index Scan)
postgres 似乎一次只用一个值进行 5000 次索引扫描,而不是使用 5000 个值进行一次索引扫描,这解释了为什么查询如此缓慢。
实际上做这样的事情要快得多:
SELECT * FROM table WHERE A IN (a_1, ..., a_5000)
获取结果,然后在应用内对 B 列进行筛选 (python)。
我真的更希望 postgres 在合理的 运行 时间内过滤结果。有解决方法吗?
尝试加入 CTE:
with value_list (a,b) as (
values
(a_1, b_1),
(a_2, b_2), ...,
(a_5000, b_5000)
)
select *
from table t
join value_list v on (t.a, t.b) = (v.a, v.b);
(假设值列表中没有重复值)