我有一个表,其中有一个索引(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);
(这假定您在值列表中没有重复项)