在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 回答
常规的快速刷新mview和仅插入mview之间的区别是 - 如你所说 - 只能插入可刷新的mview只能在插入statemenet之后快速刷新,而不能在任何其他DML操作之后(例如删除和更新)
我假设限制背后的逻辑是,当您更新现有值时,Oracle无法通过单独的mlog表知道什么是新的max(它必须保持某种排名才能做到这一点) .
关于能力表 - 这很奇怪 . 检查这个page - 这做了相同的测试,但在他们的例子中他们得到了
您是否尝试在更新后执行快速刷新?