Oracle SQL 面试关于物化视图的问题?

Posted

技术标签:

【中文标题】Oracle SQL 面试关于物化视图的问题?【英文标题】:Oracle SQL interview Question on Materialized View? 【发布时间】:2018-12-16 06:18:10 【问题描述】:

我在物化视图上遇到了这个问题。

    如果用户在物化视图刷新正在进行时运行构建在物化视图之上的报表会发生什么(刷新方法按需完成)

我的回答是:完整的按需刷新方法会截断整个数据并重新创建,因此用户在刷新时可能看不到报告中的任何数据。

    如果我的事务表当前正在更新,并且如果我发出了一个运行大约 20 分钟的 select 语句,那么我的 select 语句是检索旧数据还是检索新更新的数据?

我对此的回答: Oracle 会拍摄数据快照。当我点击我的选择语句时,它将从该快照中检索数据。所以它会检索我的旧数据。

能否请您分享您对此的了解。

【问题讨论】:

【参考方案1】:
    数据是否可见取决于刷新的完成方式。如果 atomic_refresh=true 则刷新将基本上是 DELETE + INSERT(即没有 TRUNCATE),因此使用 Oracle 的读取一致性功能,您将获得触发选择查询时的数据。如果 atomic_refresh=false 它遵循 TRUNCATE + INSERT /+APPEND/ 逻辑,因此在刷新完成之前,您不能读取表,因此会出错。

看看下面的链接

https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1857127200346321681

    您是对的,Oracle 会在触发选择时为您获取数据。因此,即使添加并提交了新行,您也会得到查询开始时存在的记录。对于常规表也是如此。如果您运行一个大约需要 10 分钟才能完成的 select count(*) 查询,并且表有 1000 行,并且在此期间,如果有人在这 10 分钟内添加 100 行并提交到表中,则查询将返回输出1000 行。(Oracle 就是这种情况)

【讨论】:

以上是关于Oracle SQL 面试关于物化视图的问题?的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 索引视图与 Oracle 物化视图

Oracle之物化视图

Oracle物化视图

SQL Server索引视图以(物化视图)及索引视图与查询重写

oracle如何刷新物化视图

《oracle每天一练》Oracle之物化视图