【问题标题】:Materialized view fast refresh with HAVING clause?使用 HAVING 子句快速刷新物化视图?
【发布时间】: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 问题中的示例重现了问题并且它们没有子查询。我将删除有关“其他”查询的提及以避免混淆。 (尽管有人会说简单的发布示例没有商业意义......)。
  • 好吧,与此同时,戈登撤回了他对您的帖子的问题/反对意见,所以这是一个有争议的问题。我最近刚刚在我的一台计算机上安装了企业版(我是一个正在为自己学习的爱好者) - 您的问题是今天的动力,请尝试您所描述的内容并确认它。众所周知,有时甚至文档都是错误的,请记住这一点。

标签: sql oracle oracle11g


【解决方案1】:

是的,文档似乎不准确。

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

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

【讨论】:

  • 是的,这可行,但我的目标是根本不将这些行存储在磁盘上。我会更新问题以反映这一点。
猜你喜欢
  • 1970-01-01
  • 2016-07-20
  • 2015-06-13
  • 2013-12-04
  • 2020-03-13
  • 2013-06-28
  • 2015-11-11
  • 2010-12-22
  • 2014-02-19
相关资源
最近更新 更多