【发布时间】:2015-02-19 12:23:16
【问题描述】:
DETERMINISTIC HIT(如 Oracle 所说)用于缓存函数的结果(如果它可以是确定性的),但这种好处的开销是多少?
我会尝试更好地解释这一点:
CREATE OR REPLACE FUNCTION betwnstr (
string_in IN VARCHAR2
, start_in IN INTEGER
, end_in IN INTEGER
)
RETURN VARCHAR2 DETERMINISTIC
IS
BEGIN
RETURN (SUBSTR (string_in, start_in, end_in - start_in + 1));
END;
/
这个简单的函数从给定字符串的 BEGIN 和 END 索引中提取字符。
现在我将开始在不同的表中使用此函数作为 SELECT 结果(其他函数、过程、包等),Oracle 将开始缓存来自同一输入的所有结果。
当然,在函数声明上添加一个简单的世界是一个很好的结果,但是大量使用它的副作用是什么?例如,如果使用不同的输入调用此函数百万次?
例如,我可以有许多其他功能作为 DETERMINISTICT:
- 一个 DETERMINISTIC 函数,用于计算两个给定日期的差值(以天为单位)
ecc
【问题讨论】:
-
我认为为确定性函数完成的“缓存”只发生在单个 SQL 执行中。如果它是确定性的,则不会为相同的输入调用两次。但该“缓存”不会用于下一个使用该函数的查询。
-
主要好处是当您在
SELECT语句的WHERE子句中使用此功能时。 Oracle 优化器通常无法预测调用 PL/SQL 函数的成本。因此,当您使用 PL/SQL 函数来过滤 PL/SQL 函数调用的开销时,可能会很重要。此外,函数索引只能用于确定性函数。