Dav*_*žic 6 sql oracle oracle11g
在Oracle 11g上,我试图创建一个FAST REFRESH ON COMMIT
包含HAVING
子句的物化视图.
该数据库数据仓库指南说:
快速刷新的一般限制
物化视图的定义查询限制如下:
- 它不能包含带子查询的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
Run Code Online (Sandbox Code Playgroud)
实际命令:
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
Run Code Online (Sandbox Code Playgroud)
注意:已创建物化视图日志(否则即使第一个示例也不起作用).
为什么不起作用?有没有人知道带有HAVING子句的MV示例?所以至少我可以从那里开始(我用谷歌搜索但没有找到).
注意2:我想要的原因HAVING
是将视图中的行数从数千甚至数百万减少到几个.节省存储(并可能获得性能).
PS:使用的精确Oracle数据库版本:11.2.0.3.0
小智 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
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
616 次 |
最近记录: |