首页 文章

Oracle:仅插入物化视图

提问于
浏览
7

在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;

根据Oracle Data Warehousing Guide,它应该是一个仅插入的物化视图:

如果物化视图具有以下之一,则仅在常规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

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

回顾一下:

  • 仅插入物化视图与普通,快速可刷新的物化视图有什么区别?

  • 为什么Oracle文档对我说谎? :)

使用Oracle 11.2企业版 .

1 回答

  • 2

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

    我假设限制背后的逻辑是,当您更新现有值时,Oracle无法通过单独的mlog表知道什么是新的max(它必须保持某种排名才能做到这一点) .

    关于能力表 - 这很奇怪 . 检查这个page - 这做了相同的测试,但在他们的例子中他们得到了

    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
    

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

相关问题