我已经注意到使用COALESCE(在我的情况下)来避免可能的NULL值在准备好的语句中会导致DB查询时间执行的性能下降。有人能解释我的根本原因是什么,我该如何克服这个问题?下面的查询样品:DB2 COALESCE - 对查询时间执行的显着影响
QUERY 1(执行时间3秒):
SELECT TABLE_A.Y, TABLE_B.X
FROM ...
WHERE Z = ? AND TABLE_A.ABC = ? AND
TABLE_A.QWERTY = ? AND TABLE_A.Q = TABLE_B.Q;
QUERY 2(执行时间210秒):
SELECT TABLE_A.Y, TABLE_B.X
FROM ...
WHERE Z = ? AND (
(COALESCE(?,'')='') OR
(TABLE_A.ABC = ? AND TABLE_A.QWERTY = ? AND TABLE_A.Q = TABLE_B.Q)
);
唯一的区别是使用( COALESCE(?, '')= '')。
您的查询缺少'FROM'条款。但是您的问题的答案是“是”:更改'WHERE'子句可以并确实影响查询优化的方式。 –
我会冒险猜测,主要原因是添加'OR'而不是'COALESCE()'。查询优化器无法知道'COALESCE(?,'')='')'的选择性。在比较查询计划后,你的“为什么”的答案会很明显。 – mustaccio
为两个查询添加解释输出,以便我们可以进行有根据的猜测。看来OR是麻烦的原因。 –