如何在 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 性能调优神话之一。我有一种感觉,你在一个有很多货物崇拜编程的组织。在漫长的 运行 中,您需要建立一种使用可重现测试用例的文化,并开始消除这些神话。
我需要将 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 性能调优神话之一。我有一种感觉,你在一个有很多货物崇拜编程的组织。在漫长的 运行 中,您需要建立一种使用可重现测试用例的文化,并开始消除这些神话。