在重新编译oracle包时,哪些缓存会更新?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在重新编译oracle包时,哪些缓存会更新?相关的知识,希望对你有一定的参考价值。
我正在使用Oracle PL-SQL包。有一个流程在执行时似乎有问题,我试图弄明白。我做了一些数据修正,但问题仍然存在。所以我添加了痕迹并再次执行了流程,并且在那里工作得很好!
由于重新编译包,似乎问题得到解决。那可能吗?如果是这样,会发生什么?
有几种可能性。
更有可能的是,您的包将一些数据存储在局部变量(如PL / SQL集合)中。这将忽略基础源表中的数据更改,除非您有适当的过程来触发重新填充。编译程序包会消除会话状态,因此您在运行程序时会看到新数据。
对此的变化是将数据存储在事务级别设置的全局临时表中。同样,重新创建包将发出一个提交,这将导致GTT丢弃数据。
另一种可能性是您的过程在READ ONLY事务中运行。所以它只在会话开始时才看到数据的状态。同样,重新编译包会破坏它。
如果这些解释都不适用于您的情况,则需要提供有关存储过程正在执行的操作的更多详细信息。
包是子程序的集合。当第一次调用子程序时,整个包将加载到共享池的库高速缓存中。解析它,然后执行代码。对于任何后续调用,重用已解析的代码以避免硬解析。在第一次调用代码时,我们得到了库缓存未命中。后续调用会获得库缓存命中。
如果包依赖的任何对象通过DDL进行结构更改,则库高速缓存中的解析代码将失效,并在下次调用时重新加载。我曾经在Oracle 9i的嵌套过程中面对这个问题。在12c没有面对这个。
如果您有兴趣了解Oracle内存结构,那么OracleDocumentation是最好的起点。
以上是关于在重新编译oracle包时,哪些缓存会更新?的主要内容,如果未能解决你的问题,请参考以下文章
在 Apollo-client 中,writeQuery 会更新缓存,但 UI 组件不会重新渲染