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 11.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)
您是否尝试过在更新后执行快速刷新?