OB可以对正在执行的存储过程进行编译嘛

OB可以对正在执行的存储过程进行编译嘛?

我觉得应该不行 :joy:

Oracle编译的时候如果在用都会卡住

但是OB可以,刚刚试了一下,执行中进行修改保存编译,关闭后打开是编译后的版本,和ORACLE的机制不同,所以奇怪,OB执行用的是之前缓存的版本,同时执行更新编译,不太清楚原理是什么

1 个赞

估计类似MVCC机制一样,整了多个版本

你好咨询了下研发,存储过程这块是跟oracle类似的。ob执行期间要么用缓存,如果缓存不可用会重新编译。不会同时做的

@论坛小助手

根据文档库中的信息,OceanBase 数据库的 PL 代码(包括存储过程)仅支持编译执行,并且编译后的代码会被缓存在 PL 缓存中。具体机制如下(依据的文档名称及段落标题:PL 执行机制):

  1. PL 编译与缓存机制
    当定义一个存储过程时,其 PL 代码会被存储在 OBServer 中。当应用程序首次调用该存储过程时,OBServer 会从数据字典中读取 PL 代码的定义,并将其编译为可执行的二进制代码。编译后的代码会被存储到 PL 缓存中,以便后续调用可以直接使用缓存中的版本,而无需重新编译。

  2. 正在执行的存储过程与更新编译
    如果一个存储过程正在执行,同时对其进行了修改并重新编译,那么当前正在执行的实例仍然会使用之前缓存的版本完成执行。这是因为 OceanBase 数据库在调用存储过程时,会锁定当前使用的编译版本,确保执行的一致性和稳定性。只有在存储过程执行完成后,下一次调用才会使用新编译的版本。

  3. 与 Oracle 的差异
    您提到的现象确实与 Oracle 的机制不同。在 Oracle 中,如果对一个正在执行的存储过程进行重新编译,可能会导致运行中的会话出现问题(例如 ORA-04068 错误)。而在 OceanBase 中,由于采用了 PL 缓存机制,可以保证正在执行的存储过程不受重新编译的影响,从而提升了系统的稳定性和可靠性。

总结来说,OceanBase 数据库允许在存储过程执行期间对其进行修改和重新编译,但当前正在执行的实例会继续使用之前的编译版本,直到执行完成。这种设计避免了因动态修改而导致的运行时问题,同时也符合分布式数据库的设计原则。

更多信息请查看:

  1. PL 执行机制
  2. 分布式执行和并行查询
  3. 在您开始前
  4. OceanBase AP 核心特性
  5. 并发控制概述
  6. OceanBase 与 LangChain 集成
  7. OceanBase 数据库概述
  8. 列存
  9. 执行计划缓存内存管理