使用IN进行postgres查询非常慢

时间:2016-08-31 10:12:20

标签: sql postgresql postgresql-performance

我有一个表上有一个索引(列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)

而不是使用5000个值进行一次索引扫描,postgres似乎一次只使用一个值进行5000次索引扫描,这解释了为什么查询速度太慢。

实际上做某事的速度要快得多:

SELECT * FROM table WHERE A IN (a_1, ..., a_5000)

获取结果,然后在app(python)内的B列上进行过滤。

我真的更希望结果已经过postgres过滤了合理的运行时间。有解决方法吗?

1 个答案:

答案 0 :(得分:2)

尝试加入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);

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