【发布时间】:2016-12-11 07:01:04
【问题描述】:
在 Oracle 11g 上,我正在尝试使用包含 HAVING 子句的 FAST REFRESH ON COMMIT 创建一个物化视图。
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
【问题讨论】:
-
@GordonLinoff - 记录的功能不适用于 HAVING 子句带有子查询。这个问题很有意义 - OP 声称他的 MV 定义中没有子查询。他是否这样做是另一个问题——他发布的内容与他的实际 MV 定义不同——但这个问题非常有道理。
-
@mathguy 问题中的示例重现了问题并且它们没有子查询。我将删除有关“其他”查询的提及以避免混淆。 (尽管有人会说简单的发布示例没有商业意义......)。
-
好吧,与此同时,戈登撤回了他对您的帖子的问题/反对意见,所以这是一个有争议的问题。我最近刚刚在我的一台计算机上安装了企业版(我是一个正在为自己学习的爱好者) - 您的问题是今天的动力,请尝试您所描述的内容并确认它。众所周知,有时甚至文档都是错误的,请记住这一点。