带有IN的postgres查询非常慢[英] postgres query with IN is very slow

本文是小编为大家收集整理的关于带有IN的postgres查询非常慢的处理方法,想解了带有IN的postgres查询非常慢的问题怎么解决?带有IN的postgres查询非常慢问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我有一个在(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)

获取结果,然后在应用程序 (python) 内的 B 列上进行过滤.

我真的希望结果已经被 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);

(假设您在值列表中没有重复项)

本文地址:https://www.itbaoku.cn/post/1763928.html