68

我很清楚为什么物化视图比仅查询基表更可取。不太清楚的是与仅创建另一个具有与 MV 相同数据的表的优势。MV 的唯一优势真的只是易于创建/维护吗?

MV 不等同于具有匹配模式的表和使用 MVs SELECT 语句的 INSERT INTO 吗?

意思是,您可以按如下方式创建一个 MV

CREATE MATERIALIZED VIEW ... AS
SELECT * FROM FOO;

您可以创建一个等效表:

CREATE TABLE bar (....);
INSERT INTO bar 
SELECT * FROM FOO;

并不是说易于创建/维护是不够的优势,我只是想确保我没有遗漏任何东西。

4

12 回答 12

33

动态查询重写。物化视图不仅定义了关系,还允许您预先计算昂贵的连接和聚合。优化器足够聪明,可以使用 MV 来获取相关数据,即使 MV 没有在查询中明确使用(给定 DB 设置等)。

您的问题被标记为 Oracle,但 MSSQL 也有类似的技巧。

于 2010-11-18T19:33:00.833 回答
13

它们基本上是等价的,但是 MV 有多种自动刷新数据的选项,这不仅提高了维护的便利性,而且在某些情况下还提高了效率,因为它可以逐行跟踪更改。

于 2010-11-18T19:27:08.103 回答
10

物化视图可以刷新——它们是定期拍摄的数据快照。

您的第二条语句只是一次性交易 - 在那一刻数据被插入到 Table 中。对原始数据的进一步更改不会反映在表中。

于 2010-11-18T19:27:47.930 回答
7
  1. 物化视图将与它所依赖的基础关系保持同步。

  2. 如果物化视图是可更新的,当你修改物化视图时,它也会修改它所依赖的基础关系。

于 2012-08-10T22:33:30.517 回答
5

物化视图的一大优势是可以极快地检索聚合数据,因为它是预先计算和存储的,代价是插入/更新/删除。数据库将物化视图与真实数据保持同步,无需重新发明轮子,让数据库为你做。

于 2010-11-18T19:28:58.327 回答
3

我想正确的比较应该是:

REFRESH MATERIALIZED VIEW bar;

相对:

CREATE TABLE bar (....);
INSERT INTO bar 
SELECT * FROM FOO;

因为 MV 您可以制作一次,并在需要进行选择时刷新(如果您知道信息更改的频率,甚至可以节省一些电话)

您还可以提供 MV 并为其编制索引,这是您没有的其他方式。当然,这将有利于 MV 的性能仅适用于大型结果集。

在 postgres 你也可以这样做:

REFRESH MATERIALIZED VIEW CONCURRENTLY bar;

如果一个还没有结束,另一个需要直到那个时刻的信息,则通过两个并行进程刷新它。我想已经进行了一些优化以重用正在运行的查询中的内容。

这是 SELECT INSERT INTO 无法做到的。

于 2019-03-13T09:59:42.023 回答
2

除了已经提到的优点:

  • 动态查询重写(简而言之,数据库优化器知道 MV 是如何创建的,因此它可以重用它来优化其他查询),
  • 可选的,自动的,可能的增量刷新,

我想提一下:

  • 可以写入一些物化视图,这会更新源表(例如,可以写入带有主键的连接,相反,如果物化视图是无法写入的组的结果)
  • 数据库服务器保留创建数据的查询并可以重新运行它。如果您创建一个表,您需要一个外部工具(可能只是一个自定义脚本)来在用户需要/询问刷新时重新运行查询。(我在一家开发工具的公司工作,并且做更多的事情)。
于 2016-06-07T12:02:22.130 回答
1

1) 加快写操作:由于可以在物化视图上创建索引,因此从它们中读取非常快。请注意,如果您在包含大量写入的表上创建索引,则索引维护开销往往会减慢写入过程。为避免这种情况,您可以创建物化视图并在其上创建索引。这些索引可以在后台维护,不会对表写入操作产生不利影响。

2) 加速读操作:复杂的连接;可以通过在物化视图上创建索引来加快运行需要很长时间的枢轴。这在大多数报告方案中变得非常方便。

于 2014-01-30T01:26:52.087 回答
1

除了其他答案(因为我还没有看到),我想说虽然它们都用尽了空间,但物化视图在逻辑上是规范化的,而额外的表在逻辑上是非规范化的。如果这不是临时一次性的,则必须记住在更新基表时更新第二个表。

于 2010-11-22T23:17:21.087 回答
0

table 和 MV 之间的区别在于 table ,您可以执行 DML 操作,其他用户将看到这些操作,而您对 MV 所做的更改在您更新数据库服务器之前其他人将无法使用。

当您使用复杂的查询基于多个表构建 MV 时,MV 的另一个优势是,用户在使用 MV 时性能会大大提高。

于 2010-11-18T19:26:09.227 回答
0

实际上,物化视图是需要定期聚合以显示更新的结果集的表的最佳选择。我们可以在库存模块中使用物化视图而不是数据仓库来计算每日、每周、每月的库存以及期末余额,而不是每次都使用复杂的查询,我们可以制作物化视图以立即获取此类结果。

于 2018-10-25T06:48:57.607 回答
0

当Oracle遇到复杂查询时,执行该查询将花费更多时间。如果用户想减少执行时间,那么物化视图是最好的。首先,我们必须在创建后使用该查询创建物化视图,我们可以简单地使用物化视图而不是基表。

于 2021-07-01T17:15:18.360 回答