sql - 常量上的 NULL 值替换

标签 sql oracle toad

为了好玩,我今天一直在玩 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/

相关文章:

oracle - 如何在 "pipelined table function"、 view 和显式光标之间进行选择

hadoop - 在 Toad 数据点中设置属性失败

python - CX_Oracle CTE 执行

mysql - SQL - 检查唯一列对的条件

php - SELECT 查询计数未输出

mysql - 从oracle表中获取最后5分钟的数据

oracle - 流利的NHibernate-配置Oracle数据提供程序ODP

通过 TOAD 导入 MySql 在插入期间提示输入变量

c# - OVER 子句中的 SQL ORDER BY 与 CLR 聚合不兼容?

mysql - 差距检测 - 识别跳过/错过的日期