我在Postgres 9.1数据库上运行了两个不同的SQL查询:
SELECT device_id, country FROM devices WHERE
(device_id = '97c179bd' AND country = 'US') OR
(device_id = 'bf5f50c6' AND country = 'US') OR
....
(device_id = '0e66c04d' AND country = 'US')
Run Code Online (Sandbox Code Playgroud)
运行12秒(由OR分隔的3620个子句)
和
SELECT device_id, country FROM devices WHERE
(device_id = '97c179bd' AND country = 'US') OR
(device_id = 'bf5f50c6' AND country = 'US') OR
....
(device_id = '0e66c04d' AND country = 'US') OR
(device_id = '0e66c04d' AND country = 'different')
Run Code Online (Sandbox Code Playgroud)
运行0.6秒(由OR分隔的3620个子句)
在第一个中,国家条件在每个条款中都是相同的.在第二个中,我在最后一个条款中将国家改为"不同".
第一个select语句需要12秒才能运行,第二个select语句需要0.6秒才能运行.
在第一个查询中,CPU几乎在所有12秒内没有任何磁盘读取的情况下固定在100%,表明它可能是花费这么长时间的解析器.第二个查询不会发生这种情况.
我运行了EXPLAIN ANALYZE并获得了两个查询分解的完全相同的结果.
这里发生了什么?为什么在每个WHERE子句语句中第二个条件相同会导致查询时间长得多?
编辑: …