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
答案 0 :(得分:1)
<强> DETERMINISTIC 强>
告诉优化器,只要使用相同的参数值调用该函数,该函数就返回相同的值(如果不是这样,那么指定DETERMINISTIC会导致不可预测的结果)。如果先前使用相同的参数值调用了该函数,则优化器可以使用先前的结果,而不是再次调用该函数。
优化器可以使用之前的结果,但也没有;这只是断言,如果它需要多次调用相同的参数值 - 通常在一个查询中 - 它可以选择只进行一次调用,因为你承诺它总会得到相同的结果。这并不一定意味着函数结果可以在查询之间缓存,尽管它们可能被其他机制缓存(我认为)。
当Oracle确实缓存内容时,它会管理缓存大小以保持在可用内存中,并优化可用于各种功能的内存。基本上你不需要担心使函数确定性的副作用,假设你正确使用它。
还有更多documentation here,包括这与基于函数的索引等有何关联。