为了好玩,我今天一直在玩 Toad 中的内置 Oracle 优化器。它建议的优化之一如下
AND emp.pay_type = NVL('FT', UID)
代替
AND emp.pay_type = 'FT'
我对这里发生的事情感到困惑,因此,我也对为什么这会提高性能感到困惑。由于 FT 是 SQL 查询中的字符串文字,因此永远不会为 NULL,为什么这会有什么不同呢?我猜它与现场现有的索引有关,但我无法在 Oracle 文档中找到任何内容。
最佳答案
这是个奇怪的建议。 NVL 函数的工作原理如下:
NVL(exp1, val1)
如果'exp1'不为空,则返回;否则返回 'val1'。
由于示例中的 'FT' 不能为 NULL,因此使用 NVL 函数没有任何好处,并且性能损失很小(至少对于优化器来说 NVL 是多余的;如果优化器可能会执行惩罚无法证明 NVL 是多余的)。
如果条件为:
AND emp.pay_type = NVL("FT", UID)
那么可能会有好处;这里我们有一个定界标识符(用双引号括起来的列名),列值可能是 NULL; NVL 调用确保仅当“FT”为 NULL 且 UID 为 NULL 时才返回 NULL。 UID 当然是常规标识符。
如果条件为:
AND emp.pay_type = NVL(UID, 'FT')
现在如果 UID 值为 NULL,则使用默认值“FT”作为相应的 pay_type。
关于sql - 常量上的 NULL 值替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3807975/