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将开始缓存来自相同输入的所有结果 .
当然,这是一个很棒的结果,只是在函数声明上添加一个简单的世界, but what is the side effect of an intensive use of this? For example, if this function is called million of times with different input ?
我可以使用DETERMINISTICT等许多其他功能:
- AN DETERMINISTIC函数用于计算两个给定日期之间的差异(在DAYS中)
ECC
1 回答
documentation says:
优化器 can 使用前面的结果,但是没有承诺它总会得到相同的结果 . 这并不一定意味着函数结果可以在查询之间缓存,尽管它们可能被其他机制缓存(我认为) .
当Oracle确实缓存内容时,它会管理缓存大小以保持在可用内存中,并优化可用于各种功能的内存 . 假设你正确使用它,基本上你不需要担心使函数确定性的副作用 .
还有更多documentation here,包括它与基于函数的索引等的关系 .