我们可以通过连接已有的视图(普通视图)来创建物化视图吗?。我的要求是在表(a,b)和视图(c)上创建mview。有可能吗?如果是,我们是否看到任何性能问题或刷新问题。这需要在oracledb上完成。
CREATE MATERIALIZED VIEW EMP_MVIEW refresh force ON COMMIT
select
EMP.ID, EMP.NAME, DV.*
EMP_TABLE EMP
LEFT OUTER JOIN DETAILS_VIEW dv ON DV.EMP_ID=EMP.EMP_ID
1条答案
按热度按时间o3imoua41#
首先,不幸的是,对于oracle物化视图不允许使用ansi连接语法,请使用旧的oracle连接语法。我相信这是甲骨文的一个错误
任何我要用我的答案来证明的东西,都只是关于物质化的
FAST REFRESH
选项回到您最初的问题,我们是否可以在具有增量刷新功能的物化视图中使用普通视图:
答案是否定的
话虽如此,如果我们尝试将以错误告终,并且无法创建它,我将在下面演示,
表结构:(仅用于演示示例,不用于实际的规范化表
物化视图日志:
1.首先尝试使用普通视图创建mv:
结果:
相信我,我在所有场景中都尝试过使用主键和rowid创建日志,并将rowid添加到select子句中,但没有任何效果
前进:
2.第二次尝试通过将所有单个基表放在from子句中,使用oracle的标准联接创建mv:
我已经用option primary key创建了物化视图日志,正如我在上面的物化视图日志部分中提到的那样。
答对 了:
Materialized view created
,但是,等等。。。是不是说现在我可以FAST REFRESH
? 让我们检查一下:我们可以使用
DBMS_MVIEW.EXPLAIN_MVIEW
它将向名为MV_CAPABILITIES_TABLE
(可通过@oracle\u home/rdbms/admin/utlxmv.sql获得)。如果我们没有dba的脚本和授权,你需要得到它。无论如何,我会给下面的脚本以及如何分析mv的性能:
如果你用文字看结果
**mv log must have ROWID**
上面的分析结果告诉我们物化视图日志缺少ROWID
选择,因此FAST REFRESH
这是不可能的。注:中的其他列
mv_capabilities_table
也会告诉你确切的表格,我没有包括,你可以检查和测试自己看看。向前看。。
3.第三次尝试使用oracle的标准联接和包含选项rowid的mv日志创建mv:
steps:(不再提供脚本,只提供模拟的步骤
我将删除并用选项重新创建mv日志
ROWID
如上面的物化视图日志部分所述。然后我将删除并重新创建相同的mv定义,我在我的第二次尝试,这将最终创建
接下来,我将尝试重复步骤来分析中压,如how to Analysis capability of mv section中所述
我在分析报告中得到了什么:
ufffff:我其实很累,而且mv又没有了
FAST REFRESH
但原因告诉我们"the SELECT list does not have the rowids of all the detail tables"
它意味着:下一个标准FAST REFRESH
是Rowids of all the tables in the FROM list must appear in the SELECT list of the query
所以,4.第四次也是最后一次尝试使用oracle的标准联接创建mv,并使用包含选项rowid的mv日志以及详细信息表rowid现在包含在select子句中:
步骤:
与3rd try一样,第一次刷新所需的mv日志已经就绪,我将删除并重新创建mv,但这次添加了rowids of detail表。
mv最终剧本:
现在随着mv的创建,让我们再次分析mv的能力,如how to Analysis capability of mv section中所述((祈祷吧)
结果:
最后
REFRESH_FAST
如我们所见,能力是可能的POSSIBLE -> Y
抱歉回答太长,但我想我应该把我在mv里学到的东西,在过去,这可能是有用的分享。我发现一些关于oracle物化视图的链接总是有用的:
甲骨文官方网站
甲骨文官方网站
甲骨文库
我最喜欢的阿尔贝托·戴尔
关于mv的一个很好的答案
干杯!!