物化视图 vs. 表格:有哪些优势?

80

我很清楚为什么物化视图优于仅查询基表,但与创建具有相同数据的另一个表相比,MV的优势并不那么明显。MV的唯一优势是易于创建/维护吗?

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

也就是说,您可以按以下方式创建MV:

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

你可以创建一个等价的表格:

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

并不是说创建/维护的简易性不足以成为一个优势,我只是想确保自己没有漏掉任何东西。


3
"CREATE VIEW" 并不会创建一个物化视图(Materialized View)。 - Jeffrey Kemp
准确地说,这并不创建一个物化视图,但在SQL Server和PostgreSQL中,它也不会排除物化视图。 - seth
我会在问题标题中将“Tables”更改为“Rollup Tables”。就像这里:https://www.citusdata.com/blog/2018/10/31/materialized-views-vs-rollup-tables/。 - yucer
12个回答

36

动态查询重写。物化视图不仅定义关系,还允许您预计算昂贵的连接和聚合操作。优化器足够智能,即使查询没有明确使用MV(根据数据库设置等),也会使用MV获取相关数据。

您的问题被标记为Oracle,但MSSQL也可以实现类似的技巧。


14

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


12

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

你的第二个语句只是一次性操作 - 数据在那一刻插入到表中。原始数据的进一步更改不会反映在表中。


7
  1. 物化视图将与其依赖的基本关系保持同步。

  2. 如果可更新物化视图,在您修改该物化视图时,它也将修改其所依赖的基本关系。


3
它们真的同步了吗?还是我们需要刷新它们以获取最新更改? - Amin Shojaei
至少在Postgres中,它不会自动同步。 - Shiva

6

Materialized View 的最大优势在于极快的聚合数据检索,因为它是预先计算和存储的,但代价是插入/更新/删除操作会变慢。数据库将保持 Materialized View 与真实数据同步,不需要重新发明轮子,让数据库来为您完成。


5

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

2) 加速读取操作: 在物化视图上创建索引可以加速复杂的联接和长时间运行的透视操作,这在大多数报告场景中非常方便。


5

我的理解是,正确的比较应该是:

REFRESH MATERIALIZED VIEW bar;

对比:

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

因为MV(Materialized View),您可以一次创建它,需要时刷新并进行选择(甚至可以节省一些调用,如果您知道信息更改的频率)。
此外,您可以向MV提供索引,这是其他方式所没有的。当然,这将有利于大结果集的MV性能。
在PostgreSQL中,您也可以这样做:
REFRESH MATERIALIZED VIEW CONCURRENTLY bar;

如果一个进程还没有结束,而另一个进程需要该时刻的信息,则可以通过两个并行进程刷新它。我猜测会对正在运行的查询进行一些优化以重复利用资源。

使用SELECT INSERT INTO是无法做到这一点的。


2
除了已经提到的优点之外:
  • 动态查询重写(简而言之,数据库优化器知道如何创建MV,因此可以重用它来优化其他查询),
  • 可选的、自动的、可能是增量刷新,
我还想提一下:
  • 一些物化视图可以被写入,从而更新源表(例如,可将与主键连接的内容写入,相反,如果物化视图是 group by 的结果,则无法写入)
  • DB 服务器保留创建数据的查询,并可以重新运行它。如果您创建一个表,则需要一个外部工具(可能只是一个定制脚本)来在需要/用户要求刷新时重新运行查询。(我为一家开发执行此操作及更多操作的工具的公司工作)。

1
除了其他答案(因为我没有看到),我想说的是,尽管它们都占用空间,但物化视图在逻辑上是规范化的,而额外的表在逻辑上是非规范化的。如果这不是一次性的临时事务,那么每当更新基本表时,您都必须记得更新第二个表。

0

表格和MV的区别在于,使用表格可以进行DML操作,其他用户可以看到这些更改,而对MV所做的更改在更新数据库服务器之前不会对其他用户可用。

当您基于多个表使用复杂查询构建MV时,MV具有另一个优点,即用户在使用MV时性能显著提高。


第一点听起来并不像一个优点。而且它似乎是从这里抄袭的,没有任何参考资料 http://itknowledgeexchange.techtarget.com/itanswers/difference-between-materialized-views-and-tables/ - codeObserver
@codeObserver 我在一个数据仓库工作。如果我能保持用户视图静态,直到非常快速地替换内容(即我可以重建仓库而不会干扰用户,然后翻转开关,他们就可以看到新数据),那就好了。 - Keith Davies

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接