set*_*eth 46 sql oracle materialized-views
我很清楚为什么物化视图比查询基表更可取.不仅仅是创建另一个具有与MV相同数据的表的优势还不是很清楚.MV的唯一优势是否只是易于创建/维护?
是不是MV等效于具有匹配模式的表和使用MVs SELECT语句的INSERT INTO?
意思是,您可以按如下方式创建MV
CREATE MATERIALIZED VIEW ... AS
SELECT * FROM FOO;
Run Code Online (Sandbox Code Playgroud)
您可以创建一个等效表:
CREATE TABLE bar (....);
INSERT INTO bar
SELECT * FROM FOO;
Run Code Online (Sandbox Code Playgroud)
并不是说创造/维护的便利性不足,我只是想确保我没有遗漏任何东西.
物化视图将与其所依赖的基本关系保持同步.
如果物化视图是可更新的,则在修改实例化视图时,它还将修改它所依赖的基本关系.
1) 加速写入操作:由于可以在物化视图上创建索引,因此读取速度非常快。请注意,如果您在包含大量写入的表上创建索引,则索引维护开销往往会减慢写入过程。为了避免这种情况,您可以创建一个物化视图并在其上创建索引。这些索引可以在后台维护,不会对表的写操作产生不利影响。
2) 加速读取操作:复杂的连接;通过在物化视图上创建索引可以加快需要很长时间才能运行的数据透视。这在大多数报告场景中变得非常方便。
我想正确的比较是:
REFRESH MATERIALIZED VIEW bar;
Run Code Online (Sandbox Code Playgroud)
相对:
CREATE TABLE bar (....);
INSERT INTO bar
SELECT * FROM FOO;
Run Code Online (Sandbox Code Playgroud)
因为 MV 您可以制作一次,并在需要进行选择时刷新(如果您知道信息更改的频率,甚至可以节省一些调用)
您还可以提供 MV 并对其进行索引,这是其他方式所没有的。当然,这只会有利于 MV 的性能,仅适用于大结果集。
在 postgres 中你也可以这样做:
REFRESH MATERIALIZED VIEW CONCURRENTLY bar;
Run Code Online (Sandbox Code Playgroud)
通过并行进程刷新信息,而不阻塞需要当前信息的查询。我猜想进行了一些优化以重用正在运行的查询中的内容。
这是 SELECT INSERT INTO 无法做到的。
表和 MV 之间的区别在于,使用表时,您可以执行其他用户可以看到的 DML 操作,而您对 MV 所做的更改将无法提供给其他用户,除非您更新数据库服务器。
MV 还有另一个优点,当您使用复杂查询基于多个表构建 MV 时,用户在使用 MV 时性能会大幅提高。
| 归档时间: |
|
| 查看次数: |
61335 次 |
| 最近记录: |