Oracle DETERMINISTIC HINT 开销
Oracle DETERMINISTIC HINT Overhead
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 例如:
- 一个确定性函数,用于计算两个给定日期的差异(以天为单位)
ecc
DETERMINISTIC
Tells the optimizer that the function returns the same value whenever it is invoked with the same parameter values (if this is not true, then specifying DETERMINISTIC causes unpredictable results). If the function was invoked previously with the same parameter values, the optimizer can use the previous result instead of invoking the function again.
优化器可以使用之前的结果,但没有;这只是断言,如果它需要为相同的参数值多次调用它——通常是在一个查询中——它可以选择只调用一次,因为你向它保证它总是会得到相同的结果。这并不一定意味着函数结果可以缓存在查询之间的某个地方,尽管它们可能会被其他机制缓存(我认为)。
当 Oracle 缓存内容时,它会管理缓存大小以保持在可用内存范围内,并优化可用于各种功能的内存。基本上你不需要担心使函数具有确定性的副作用,假设你正确使用它。
还有更多documentation here,包括这与基于函数的索引等的关系
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 例如:
- 一个确定性函数,用于计算两个给定日期的差异(以天为单位)
ecc
DETERMINISTIC
Tells the optimizer that the function returns the same value whenever it is invoked with the same parameter values (if this is not true, then specifying DETERMINISTIC causes unpredictable results). If the function was invoked previously with the same parameter values, the optimizer can use the previous result instead of invoking the function again.
优化器可以使用之前的结果,但没有;这只是断言,如果它需要为相同的参数值多次调用它——通常是在一个查询中——它可以选择只调用一次,因为你向它保证它总是会得到相同的结果。这并不一定意味着函数结果可以缓存在查询之间的某个地方,尽管它们可能会被其他机制缓存(我认为)。
当 Oracle 缓存内容时,它会管理缓存大小以保持在可用内存范围内,并优化可用于各种功能的内存。基本上你不需要担心使函数具有确定性的副作用,假设你正确使用它。
还有更多documentation here,包括这与基于函数的索引等的关系