首页 文章

物化视图使用HAVING子句快速刷新?

提问于
浏览
6

在Oracle 11g上,我正在尝试使用 FAST REFRESH ON COMMIT 创建包含 HAVING 子句的物化视图 .

Database Data Warehousing Guide说:

快速刷新的一般限制物化视图的定义查询限制如下:它不能包含带子查询的HAVING子句 .

但是如果我将 HAVING count(*)>1 (注意:没有子查询)添加到其他工作的物化视图中,我会收到此错误:

ORA-12054:无法为物化视图设置ON COMMIT刷新属性

dbms_mview.explain_mview() 说:

REFRESH_FAST                   N
REFRESH_FAST_AFTER_INSERT      N   2011 a HAVING clause is present

实际命令:

SQL>  create materialized view mv1 refresh fast on commit as
  2      select UserId, count(*) from USERS group by UserId;

Materialized view created.

SQL> DROP MATERIALIZED VIEW mv1;

Materialized view dropped.

SQL> create materialized view mv1 refresh fast on commit as
  2      select UserId, count(*) from USERS group by UserId
  3          having count(*)>1; -- the only difference
    having count(*)>1
                    *
ERROR at line 5:
ORA-12054: cannot set the ON COMMIT refresh attribute for the materialized view

注意:已创建物化视图日志(否则即使第一个示例也不起作用) .

为什么不起作用?有没有人知道带有HAVING子句的MV示例?所以至少我可以从那里开始(我用谷歌搜索但没有找到) .

注2:我想要 HAVING 的原因是将视图中的行数从数千甚至数百万减少到几个 . 节省存储(并可能获得性能) .

PS:使用的精确Oracle数据库版本:11.2.0.3.0

1 回答

  • 2

    是的,文档似乎不准确 .

    作为一种解决方法,您可以尝试实现嵌套的物化视图 .

    CREATE MATERIALIZED VIEW mv1 
    REFRESH FAST ON COMMIT 
    AS
    SELECT col1,
           COUNT(col1) count_col1
    FROM test_table
    GROUP BY col1
    
    ALTER MATERIALIZED VIEW mv1 ADD CONSTRAINT pk_mv1 PRIMARY KEY (col1)
    
    CREATE MATERIALIZED VIEW LOG ON mv1 WITH PRIMARY KEY;
    
    CREATE MATERIALIZED VIEW MV2 
    REFRESH FAST ON COMMIT AS
    SELECT col1,
           count_col1
    FROM   mv1
    WHERE  count_col1 > 1
    

相关问题