首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Oracle中创建包含部分主键的实例化视图时,无法设置ON COMMIT刷新属性

在Oracle中创建包含部分主键的实例化视图时,无法设置ON COMMIT刷新属性
EN

Stack Overflow用户
提问于 2015-10-23 08:40:24
回答 2查看 7K关注 0票数 3

我需要将作为主键一部分的列的唯一值从表中提取到物化视图中。如果使用“刷新完成”,我可以创建物化视图,但在尝试使用“提交时快速刷新”时,我就没有机会创建物化视图。有没有人能指出我是否遗漏了什么或者Oracle不支持这样的操作。

下面列出了示例输出。谢谢。

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

发布于 2015-10-23 12:14:23

您的观点的主要问题是DISTINCT子句。提交时,快速刷新对底层查询非常敏感。要支持快速刷新,实例化视图必须满足许多规则。DISTINCT可以防止这种情况。

可以使用DBMS_MVIEW.EXPLAIN_MVIEW过程检查实体化视图的功能:

代码语言:javascript
复制
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;

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

票数 4
EN

Stack Overflow用户

发布于 2015-10-24 11:15:16

快速刷新视图是挑剔的。此解决方案需要具有特定属性的实体化视图日志,以及具有一些额外功能和不同语法的实体化视图。

似乎不支持单独的DISTINCT。但也有支持GROUP BYaggregate materialized views。如果实例化视图是使用ENABLE QUERY REWRITE创建,则Oracle可以在DISTINCT查询中使用它。还有一个额外的计数,因为“COUNT(*) (*)必须始终存在,以保证所有类型的快速刷新。”

Create table、实体化视图日志和实体化视图。

代码语言:javascript
复制
create table test(col1 number, col2 number, col3 varchar(32)
  ,constraint test_pk primary key (col1, col2));
create materialized view log on test with rowid (col2) including new values;
create materialized view test_mv
  build immediate
  refresh fast on commit
  enable query rewrite as
  select col2, count(*) total from test group by col2;

查询可以使用物化视图。

这些解释计划表明,实体化视图同时适用于GROUP BYDISTINCT查询。

代码语言:javascript
复制
explain plan for select col2 from test group by col2;
select * from table(dbms_xplan.display);

explain plan for select distinct col2 from test;
select * from table(dbms_xplan.display);


Plan hash value: 1627509066

----------------------------------------------------------------------------------------
| Id  | Operation                    | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |         |     1 |    13 |     2   (0)| 00:00:01 |
|   1 |  MAT_VIEW REWRITE ACCESS FULL| TEST_MV |     1 |    13 |     2   (0)| 00:00:01 |
----------------------------------------------------------------------------------------
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33293083

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档