确定性命中(如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会导致不可预测的结果)。如果先前使用相同的参数值调用了该函数,则优化器可以使用先前的结果,而不用再次调用该函数。
优化器可以使用先前的结果,但是没有。这只是断言,如果需要针对相同的参数值多次调用它(通常在单个查询中),则可以选择仅进行一次调用,因为已向您保证它将始终获得相同的结果。这不一定意味着函数结果可以缓存在查询之间的某个地方,尽管它们可能被其他机制缓存(我认为)。
当Oracle进行缓存时,它会管理缓存大小以保留在可用内存中,并优化各种功能可用的内存。基本上,假设您正确使用了函数,则无需担心确定性函数的副作用。
这里有更多文档,包括与基于函数的索引等的关系。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句