该查询使用以下条件:
t1.field = replace(t2.field, <Сложная конструкия вычислений по тексту, insrt, substr и т.д.>)
因此,对于每一行,计算该值。
我计划将这些计算转换为以下形式的确定性函数:
func(p_t2_field) <Сложная конструкия вычислений по тексту, insrt, substr и т.д.> return
为了不计算,而是立即从缓存中获取所需的选项(如果它以前用作函数参数)。
在这种特殊情况下有意义吗?
另一个传递的问题是,是否有可能以某种方式找出缓存中已包含哪些选项?
是的,如果可以保证构造:
将始终为相同的参数值返回相同的结果
p_t2_field。也就是说,计算结果显然没有副作用,例如国家设置、更改会话变量或其上下文等。
在本主题中,此类副作用的示例之一。
一个简单的工作示例,而不是预期的 9 秒。我们得到:
没有这种可能性。这个缓存的生命周期很短,因此不仅后续执行相同的查询,甚至后续的 fetch 也看不到它。
也就是说,减少返回到 fetch 的记录数会否定缓存的有效性(在许多工具中
arraysize):甚至在确定性函数开始使用哈希表来缓存 10g 中的函数结果之前,使用 SSC(标量子查询缓存)就可以做到这一点。也就是说,请求中的函数调用应该是这样的:
它的优点是哈希不会在每次获取时都重置,并且对整个请求都有效。
这样一个可重现的例子:
重要提示:仅出于示例目的,函数声明中省略了
关键字。
deterministic这不仅是对 SQL 解释器的提示,它主要用于证明函数确实是确定性的,并且在随后更改时应该保持不变。一定要包含deterministic在函数声明中。