Oracle DETERMINISTIC HINT开销

时间:2015-02-19 12:23:16

标签: sql oracle plsql

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等许多其他功能:

  • 用于计算两个给定日期的差异(在DAYS中)的确定函数

ECC

1 个答案:

答案 0 :(得分:1)

documentation says

  

<强> DETERMINISTIC

     

告诉优化器,只要使用相同的参数值调用该函数,该函数就返回相同的值(如果不是这样,那么指定DETERMINISTIC会导致不可预测的结果)。如果先前使用相同的参数值调用了该函数,则优化器可以使用先前的结果,而不是再次调用该函数。

优化器可以使用之前的结果,但也没有;这只是断言,如果它需要多次调用相同的参数值 - 通常在一个查询中 - 它可以选择只进行一次调用,因为你承诺它总会得到相同的结果。这并不一定意味着函数结果可以在查询之间缓存,尽管它们可能被其他机制缓存(我认为)。

当Oracle确实缓存内容时,它会管理缓存大小以保持在可用内存中,并优化可用于各种功能的内存。基本上你不需要担心使函数确定性的副作用,假设你正确使用它。

还有更多documentation here,包括这与基于函数的索引等有何关联。