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 企业版。

4

1 回答 1

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

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

于 2013-06-10T12:01:34.813 回答