【问题标题】:Having fast refresh on materialized views having virtual columns快速刷新具有虚拟列的物化视图
【发布时间】:2014-02-19 09:19:12
【问题描述】:

我想要一个快速刷新的物化视图(更新包含的表更新)。 物化视图查询类似于:

SELECT T1.CODE, T2.NAME
FROM T1

UNION ALL

SELECT T2.CODE, T3.NAME
FROM T2, T3
WHERE T2.ID = T3.ID

看来如果使用UNION ALL我应该添加ROWID以实现快速刷新。

在第一部分添加ROWID 是可以的,但是对于第二部分,它不能添加,因为它有一个连接。

似乎有两种方法可以克服这个问题:

  1. T2 上为NAME 添加冗余列,并从查询中删除T3
  2. 添加一个虚拟列,其中包含一个从 T3 中选择名称的函数

    NAME NVARCHAR2(4000) 始终生成为 ("SCHEMA"."GET_NAME_FROM_OTHER_TABLE"("ID"))

根据此链接:http://www.oracle-base.com/articles/11g/virtual-columns-11gr1.php 它说:

访问虚拟列的实体化视图必须完全刷新。

如果它引用了确定性的用户定义函数,则不能用作分区键列。

我能否在使用解决方案 2 的实体化视图上仍有快速刷新选项?

【问题讨论】:

标签: sql oracle materialized-views


【解决方案1】:

这行得通吗?

SELECT T1.CODE, T2.NAME, T1.ROWID as ROWID_T1, NULL as ROWID_T2, NULL as ROWID_T3 
FROM T1

UNION ALL

SELECT T2.CODE, T3.NAME, NULL as ROWID_T1, T2.ROWID as ROWID_T2, T3.ROWID as ROWID_T3 
FROM T2, T3
WHERE T2.ID = T3.ID

也许您必须使用CAST(NULL AS ROWID) AS ROWID_T2 才能在第一次查询中获得正确的数据类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-04
    • 2020-03-13
    • 2016-12-11
    • 2015-06-13
    • 1970-01-01
    • 2017-05-18
    • 2013-05-31
    • 2015-11-11
    相关资源
    最近更新 更多