【问题标题】:What is the difference between Views and Materialized Views in Oracle?Oracle中的视图和物化视图有什么区别?
【发布时间】:2010-09-10 17:57:37
【问题描述】:

Oracle 中的视图和物化视图有什么区别?

【问题讨论】:

    标签: sql oracle view relational-database materialized-views


    【解决方案1】:

    物化视图基于磁盘并根据查询定义定期更新。

    视图只是虚拟的,每次访问时都会运行查询定义。

    【讨论】:

    • 此外,当您需要对不需要及时更新的数据的性能时,物化视图会更好,但您的数据会比标准视图中的数据更旧。通常 BI 报告会从物化视图中获得很多好处。
    • @Marthinus - 这是正确的,除了在 REFRESH ON COMMIT 的物化视图的情况下 - MV 将准确返回已提交的数据。
    • DISK based 是什么意思?这是否意味着表不是磁盘的一部分?它是否存储在文件中并且磁盘访问比文件访问更快......?
    • @KanagaveluSugumar 是的,实际的表也写入磁盘。
    • @dacracot 谢谢!我认为您的意思是说磁盘中的数据库表除外;这个 MVIEW 还通过解析所有连接来维护一个表。这样在运行时单表访问就足够了;并且不需要查询多个表的连接条件,这通常由普通视图完成。谢谢!
    【解决方案2】:

    观看次数

    他们评估视图定义基础表中的数据在查询视图时。它是您的表的逻辑视图,没有任何数据存储在其他任何地方。

    视图的优点是它会始终向您返回最新数据视图的缺点是其性能取决于视图所基于的 select 语句有多好。如果视图使用的 select 语句连接了许多表,或者使用了基于非索引列的连接,则视图的性能可能会很差。

    物化视图

    它们类似于常规视图,因为它们是数据的逻辑视图(基于 select 语句),但是,基础查询结果集已保存到表中。这样做的好处是,当您查询物化视图时,您正在查询一个表,该表也可能被索引。

    此外,由于所有连接都在实体化视图刷新时解决,因此您只需支付一次连接的费用(或刷新实体化视图的频率),而不是每次从实体化视图中进行选择。此外,启用查询重写后,Oracle 可以优化从您的物化视图源中选择的查询,从而改为从您的物化视图中读取。在您将物化视图创建为聚合表形式或频繁执行查询的副本的情况下,这可以大大加快最终用户应用程序的响应时间。 缺点是,您从物化视图返回的数据仅在物化视图上次刷新时是最新的


    物化视图可以设置为手动刷新、按设定的时间表刷新,或者根据数据库检测到基础表中的数据发生变化。通过将具体化视图与具体化视图日志相结合,可以逐步更新具体化视图,具体化视图日志充当基础表上的变更数据捕获源

    物化视图最常用于数据仓库/商业智能应用程序,在这些应用程序中查询具有数以百万计行的大型事实表会导致查询响应时间延长,从而导致应用程序无法使用。


    物化视图还有助于确保时刻保持一致,类似于snapshot isolation

    【讨论】:

    • +1 详细解释,但是查询重写的缺点是什么?如果查询重写将允许 Oracle 进一步优化查询,那么我们应该始终启用查询重写,不是吗?
    • @Rosdi,他说:“您从物化视图返回的数据仅与上次刷新物化视图时一样最新”
    • @Mike thx u,有没有一本书或课程解释了如何自动化这个物化视图刷新器?
    • @ERJAN,我不确定是否有专门针对此的书籍或课程。但我只会使用 daemon 或类似的可以在后台运行的东西。我还怀疑特定的数据库引擎有特定的方式来运行计划的作业。
    • @ERJAN Here 是一些选项
    【解决方案3】:

    视图使用查询从基础表中提取数据。

    物化视图是磁盘上包含查询结果集的表。

    物化视图主要用于在不可行或不希望使用应用了索引的标准视图时提高应用程序性能。物化视图可以通过触发器或使用ON COMMIT REFRESH 选项定期更新。这确实需要一些额外的权限,但这并不复杂。 ON COMMIT REFRESH 至少从 Oracle 10 开始就已经存在。

    【讨论】:

    • 有一个“REFRESH ON COMMIT”选项可以在物化视图上指定
    • 谢谢!我会更新答案。你知道这个功能是什么时候添加到 Oracle 中的吗?
    【解决方案4】:

    物化视图 - 磁盘上包含查询结果集的表

    非实体化视图 - 从基础表中提取数据的查询

    【讨论】:

      【解决方案5】:

      视图本质上是由给定查询动态填充的类似逻辑表的结构。视图查询的结果不会存储在磁盘上的任何位置,并且每次执行查询时都会重新创建视图。物化视图是存储在数据库中并写入磁盘的实际结构。它们根据创建时定义的参数进行更新。

      【讨论】:

      • DISK based 是什么意思?这是否意味着表不是磁盘的一部分?它是否存储在文件中并且磁盘访问比文件访问更快......?
      【解决方案6】:

      视图:视图只是一个命名查询。它不存储任何东西。当视图上有查询时,它会运行视图定义的查询。实际数据来自表格。

      物化视图:物理存储数据并定期更新。在查询 MV 时,它会从 MV 中给出数据。

      【讨论】:

        【解决方案7】:

        添加到迈克麦卡利斯特的相当彻底的答案......

        只有当编译器认为视图查询简单时,物化视图才能通过数据库检测更改设置为自动刷新。如果它被认为太复杂,它将无法设置本质上是内部触发器来跟踪源表中的更改以仅更新 mview 表中更改的行。

        当您创建物化视图时,您会发现 Oracle 同时创建了 mview和同名的表,这会使事情变得混乱。

        【讨论】:

        • 支持物化视图的表不与视图同名。
        • @JeffreyKemp,你确定吗?此处接受的答案stackoverflow.com/a/33552513 另有声明。虽然是的,但在 2010 年您发表评论时,情况可能有所不同......
        • 我上面的评论一定是在旧版本上(可能是 9i)。你是对的,至少在现代版本中,MV 会得到一个同名的表。
        【解决方案8】:

        物化视图是由select查询驱动的数据的逻辑视图,但查询的结果会存储在表或磁盘中,查询的定义也会存储在数据库中。

        物化视图的性能优于普通视图,因为物化视图的数据将存储在表中,并且表可能会被索引,因此连接速度更快,并且连接是在物化视图刷新时完成的,因此无需每次触发 join 语句时都以视图为例。

        其他区别包括在视图的情况下,我们总是获取最新数据,但在物化视图的情况下,我们需要刷新视图以获取最新数据。 在物化视图的情况下,我们需要一个额外的触发器或一些自动方法,以便我们可以保持 MV 刷新,这对于数据库中的视图不是必需的。

        【讨论】:

          猜你喜欢
          • 2012-11-07
          • 2011-11-25
          • 1970-01-01
          • 1970-01-01
          • 2017-03-18
          • 2020-07-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多