oracle - 在 Oracle 中创建包含部分主键的物化 View 时无法设置 ON COMMIT 刷新属性

标签 oracle primary-key materialized-views

我需要将作为主键一部分的列的唯一值从表中提取到物化 View 中。如果使用“刷新完成”,我可以创建物化 View ,但在尝试使用“提交时快速刷新”时没有运气。任何人都可以指出我是否遗漏了什么或 Oracle 不支持此类操作。

示例输出如下所示。谢谢。

SQL> create table TEST( col1 number, col2 number, col3 varchar(32), CONSTRAINT test_pk Primary Key (col1, col2));

Table created.

SQL> create materialized view test_mv build immediate refresh fast on commit as select distinct col2 from test;
create materialized view test_mv build immediate refresh fast on commit as select distinct col2 from test
                                                                                                     *
ERROR at line 1:
ORA-12054: cannot set the ON COMMIT refresh attribute for the materialized view


SQL> create materialized view test_mv build immediate refresh complete as select distinct col2 from test;

Materialized view created.

SQL> drop materialized view test_mv;

Materialized view dropped.

SQL> create materialized view log on test;

Materialized view log created.

SQL> create materialized view test_mv build immediate refresh fast on commit as select distinct col2 from test;
create materialized view test_mv build immediate refresh fast on commit as select distinct col2 from test
                                                                                                     *
ERROR at line 1:
ORA-12054: cannot set the ON COMMIT refresh attribute for the materialized view

最佳答案

您的观点的主要问题是 DISTINCT 子句。提交时快速刷新对底层查询非常敏感。物化 View 必须满足许多规则才能支持快速刷新。 DISTINCT 阻止它。

您可以使用 DBMS_MVIEW.EXPLAIN_MVIEW 过程检查物化 View 的功能:

DECLARE
    result SYS.EXPLAINMVARRAYTYPE := SYS.EXPLAINMVARRAYTYPE();
BEGIN
    DBMS_MVIEW.EXPLAIN_MVIEW('TEST_MV', result);

    FOR i IN result.FIRST..result.LAST LOOP
        DBMS_OUTPUT.PUT_LINE(result(i).CAPABILITY_NAME || ': ' || CASE WHEN result(i).POSSIBLE = 'T' THEN 'Yes' ELSE 'No' || CASE WHEN result(i).RELATED_TEXT IS NOT NULL THEN ' because of ' || result(i).RELATED_TEXT END || '; ' || result(i).MSGTXT END);
    END LOOP;
END;

您可以在文档中找到更多信息 http://docs.oracle.com/cd/B28359_01/server.111/b28313/basicmv.htm#i1007007

关于oracle - 在 Oracle 中创建包含部分主键的物化 View 时无法设置 ON COMMIT 刷新属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33293083/

相关文章:

django - 多个模型 - 一个公共(public)主键 (Django)

sql - 为什么Oracle中不推荐直接引用物化 View ?

c# - Entity Framework - 为什么 EF 在 1 对 1 关系中使用 LEFT OUTER JOIN?

database-design - 为主键使用特定于项目的前缀和自动编号?

java - Spring-Hibernate 应用程序中的无效列名异常

Postgresql通用触发器函数?

postgresql - 你如何运行 ActiveRecord `find_each` 到 postgres 中的物化 View

oracle - 是否可以部分刷新 Oracle 中的物化 View ?

sql - oracle sql和pl/sql中varchar2的区别

oracle - 加载到 oracle 的替代方案