如何在 sql 查询中替换 NVL 函数

How to replace NVL function in a sql query

我需要将 NVL 函数替换为 select

例如

NVL (MAX(EX.ID_EXAMPLE),0)

如何将其替换到我的查询中

非常感谢

您可以尝试将以下索引添加到您的 table:

CREATE TABLE idx ON EXAMPLE (CD_ID, CD_ID_EXAMPLE);

我什至不知道添加 CD_ID_EXAMPLE 是否有帮助,因为您正在计算整个 table。因此,仅以下内容可能是您在这里可以做的最好的事情:

CREATE TABLE idx ON EXAMPLE (CD_ID);

这至少可以帮助 Oracle 快速删除与 WHERE 子句不匹配的记录。

NVL (MAX(EX.ID_EXAMPLE),0)

可以替换为CASE..WHEN如下:

CASE WHEN 
MAX(EX.ID_EXAMPLE) IS NOT NULL THEN 
MAX(EX.ID_EXAMPLE)
ELSE 0 
END

更好的方法是使用计算 MAX 的子查询,并在外部查询中使用 CASE..WHEN 中的别名,这样 MAX 就不会被计算两次。

SELECT CASE WHEN
MAX_ID_EXAMPLE IS NULL THEN MAX_ID_EXAMPLE 
ELSE 0 
END
...
FROM (SELECT MAX(EX.ID_EXAMPLE) AS MAX_ID_EXAMPLE 
...
FROM ...)

干杯!!

前提是错误的,像这样在 SQL 语句中更改 NVL 不会提高性能:

SELECT COUNT (1) EXIST, NVL (MAX(EX.CD_ID_EXAMPLE),0) CD_ID_EXAMPLE
  FROM EXAMPLE EX
 WHERE EX.CD_ID_ = :cd_id;

与检索数据相比,通过NVL处理数据的时间小得无可比拟。 Oracle 性能调优是关于如何检索和连接数据的。 CPU 处理小函数的时间几乎无关紧要。特别是在这个例子中,NVL 字面上只会 运行 整个语句一次。

(如果 NVL 被用作条件,那么事情可能会有所不同。有时 NVL 或任何函数都会影响基数估计,从而影响执行计划. 但不在您的查询中。)

另一个危险信号是 COUNT(1),这是最古老的 Oracle 性能调优神话之一。我有一种感觉,你在一个有很多货物崇拜编程的组织。在漫长的 运行 中,您需要建立一种使用可重现测试用例的文化,并开始消除这些神话。