为什么DBMS_MVIEW.REFRESH有隐式提交?

Nic*_*int 6 oracle transactions materialized-views

我最近注意到调用dbms_mview.refresh(...)来刷新Oracle中的物化视图,它有一个隐式提交.

任何想法 - 除了"因为它确实" - 为什么这个动作有一个隐含的提交?

Lei*_*fel 6

根据Tom Kyte的说法,这是因为在设计时决定将刷新视为DDL操作.由于所有DDL操作都隐式提交,因此这个操作也是如此.不幸的是,他没有回答为什么他们选择让它成为DDL的问题.


Dav*_*vid 2

根据您的 Oracle 版本和/或您提供的参数,dbms_mview.refresh 可能会执行 TRUNCATE,然后直接加载。TRUNCATE 是一个 DDL 命令,因此发出隐式提交。直接加载不需要提交。

如果您使用的是更新版本的 Oracle(我认为是 10.2+),您可以将atomic_refresh 参数设置为 TRUE,它将使用标准 DELETE / INSERT 在单个事务中刷新。不过,这种方法可能会慢一些。