我有一个表格,在列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个值,PostgreSQL似乎是一次只处理一个值的5000次索引扫描,这就解释了为什么查询如此缓慢。
实际上,做类似以下的操作会更快:
SELECT * FROM table WHERE A IN (a_1, ..., a_5000)
在应用程序中获取结果,然后按列B进行过滤(使用Python)。
我更希望Postgres已经以合理的运行时间过滤了结果。有没有解决方法?
(a,b) in (...)
不会考虑索引。在我的笔记本电脑上,有一个包含 700,000 行的表,Postgres 上的 IN 查询只需要 1.5 秒就能返回 1000 行。而 Oracle 需要 50 秒。因此,即使计划不完美,实际上也并不那么糟糕。 - user330315