Oracle:仅插入物化视图

Dan*_*nga 7 oracle refresh materialized-views aggregate-functions

在Oracle中,什么是仅插入物化视图?

我有以下物化视图,它使用MAX聚合函数:

CREATE MATERIALIZED VIEW VM_FAST_MAX
REFRESH FAST ON COMMIT
AS
SELECT   d.ID_INPUT, MAX(d.ID_LOAD) AS ID_LOAD, COUNT(*) AS CNT
FROM     MASTER_TABLE d
GROUP BY d.ID_INPUT;
Run Code Online (Sandbox Code Playgroud)

根据Oracle数据仓库指南,它应该是一个仅插入的物化视图:

如果物化视图具有以下之一,则仅在常规DML插入和直接加载时支持快速刷新.

  • 具有MIN或MAX聚合的物化视图
  • 具有SUM(expr)但没有COUNT(expr)的物化视图
  • 没有COUNT(*)的物化视图

这种物化视图称为仅插入物化视图.

我希望这样一个物化视图只有在主表上插入时才能快速刷新.相反,DBMS_MVIEW.EXPLAIN_MVIEW告诉我这个物化视图总是快速刷新:

EXEC DBMS_MVIEW.EXPLAIN_MVIEW('VM_FAST_MAX');
SELECT CAPABILITY_NAME, POSSIBLE
FROM MV_CAPABILITIES_TABLE
WHERE MVNAME = 'VM_FAST_MAX';

CAPABILITY_NAME                P
------------------------------ -
REFRESH_FAST_AFTER_INSERT      Y
REFRESH_FAST_AFTER_ANY_DML     Y
Run Code Online (Sandbox Code Playgroud)

即使在主表上更新后,快速刷新提交仍然有效.

回顾一下:

  • 仅插入物化视图与简单,快速可刷新的物化视图之间有什么区别?
  • 为什么Oracle文档对我说谎?:)

使用Oracle 11.2企业版.

hak*_*aki 2

常规快速可刷新 mview 和仅插入 mview 之间的区别是 - 正如您所说 - 仅插入可刷新 mview 只能在插入语句之后快速刷新,而不能在任何其他 DML 操作(例如删除和更新)之后快速刷新

我认为限制背后的逻辑是,当您更新现有值时,Oracle 无法仅通过 mlog 表知道新的最大值是多少(它必须保持某种排名才能做到这一点)。

关于能力表——这很奇怪。检查此页面- 这做了相同的测试,但在他们的示例中他们得到了

Capable of:
  REFRESH_FAST
  REFRESH_FAST_AFTER_INSERT
Not Capable of:
  REFRESH_FAST_AFTER_ONETAB_DML
    AMT_SUM
    SUM(expr) without COUNT(expr)
  REFRESH_FAST_AFTER_ONETAB_DML
    COUNT(*) is not present in the select list
  REFRESH_FAST_AFTER_ANY_DML
    see the reason why REFRESH_FAST_AFTER_ONETAB_DML is disabled
Run Code Online (Sandbox Code Playgroud)

您是否尝试过在更新后执行快速刷新?