【发布时间】:2017-01-07 21:00:12
【问题描述】:
我有一个在(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 过滤并具有合理的运行时间。有解决办法吗?
【问题讨论】:
标签: sql postgresql postgresql-performance