在我的数据库中,我有一张包含了大约3500条记录的表,作为更复杂查询的一部分,我尝试使用“CASE”条件对其进行自身连接,就像下面展示的那样。
SELECT *
FROM some_table AS t1
JOIN some_table AS t2 ON t1.type = t2.type
AND CASE
WHEN t1.type = 'ab' THEN t1.first = t2.first
WHEN t1.type = 'cd' THEN t1.second = t2.second
-- Column type contains only one of 2 possible varchar values
END;
问题在于这个查询需要3.2至4.5秒的时间来执行,而下一个请求只需要40至50毫秒。
SELECT *
FROM some_table AS t1
JOIN some_table AS t2 ON t1.type = t2.type
AND (t1.first = t2.first OR t1.second = t2.second)
根据第一种情况中的执行计划,数据库处理了大约580万条记录,而表中只有大约3500条记录。该表上有以下索引:(id)、(type)、(type,first)和(type,second)。
我们正在使用的版本是: PostgreSQL 9.4.5 x86_64-unknown-linux-gnu版,由gcc (GCC) 4.4.7 20120 313 (Red Hat 4.4.7-16)编译,64位。
为什么PostgreSQL在这种情况下表现得如此奇怪?您有什么想法吗?