物化视图与表格:有啥优势?

Posted

技术标签:

【中文标题】物化视图与表格:有啥优势?【英文标题】:Materialized View vs. Tables: What are the advantages?物化视图与表格:有什么优势? 【发布时间】:2011-05-12 05:52:39 【问题描述】:

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

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

意思是,你可以如下创建一个MV

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

你可以创建一个等效的表:

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

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

【问题讨论】:

CREATE VIEW 创建物化视图。 嗯,准确地说,这不会创建实体化视图,但在 SQL Server 和 PostgreSQL 中,它也不排除实体化视图。 我会在问题标题中用“汇总表”更改“表”。喜欢这里:citusdata.com/blog/2018/10/31/… 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

【参考方案4】:

    物化视图将与基本关系保持同步 它取决于它。

    如果物化视图是可更新的,当您修改 物化视图,它还将修改它所基于的基础关系 取决于。

【讨论】:

它们真的同步了吗?或者我们应该刷新它们以获取最新更改?【参考方案5】:

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

【讨论】:

【参考方案6】:

我猜正确的比较应该是:

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 无法做到的。

【讨论】:

【参考方案7】:

除了已经提到的优点:

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

我想提一下:

可以写入一些物化视图,从而更新源表(例如,可以写入带有主键的连接,相反,如果物化视图是无法写入的组的结果) 数据库服务器保留创建数据的查询并可以重新运行它。如果您创建一个表,您需要一个外部工具(可能只是一个自定义脚本)来在用户需要/询问刷新时重新运行查询。 (我在一家开发工具的公司工作,可以做到这一点等等)。

【讨论】:

【参考方案8】:

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

【讨论】:

【参考方案9】:

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

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

【讨论】:

【参考方案10】:

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

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

【讨论】:

第一点听起来不像是优势。此外,它似乎是从这里复制的,没有任何参考 itknowledgeexchange.techtarget.com/itanswers/… @codeObserver 我在数据仓库工作。如果我可以在快速替换内容之前保持用户视图不变(即我可以在不打扰用户的情况下重建仓库,然后拨动开关让他们看到新数据)我会的。【参考方案11】:

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

【讨论】:

【参考方案12】:

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

【讨论】:

以上是关于物化视图与表格:有啥优势?的主要内容,如果未能解决你的问题,请参考以下文章

第一行的物化视图

PG 物化视图

Postgres:更新与物化视图连接的表?错误:视图无法在物化视图中锁定行

视图与物化视图

物化视图

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