有人可以向我解释一下普通日常英语中的观点或物化观点吗?我一直在阅读有关物化视图的内容,但我不明白。
答案 0 :(得分:19)
不确定
普通视图是一个定义虚拟表的查询 - 您实际上没有数据位于表中,您可以通过执行来动态创建它。
物化视图是运行查询并将数据保存在实际表中的视图。
物化视图中的数据会在您告知时刷新。
一些用例:
我们有多个Oracle实例,我们希望在一个实例上拥有主数据,并在其他实例上拥有合理的当前数据副本。我们不想假设它们之间的数据库链接始终处于运行状态。因此,我们使用select a,b,c from mytable@master
之类的查询设置其他实例的实体化视图,并告诉他们每天刷新。
物化视图在查询重写中也很有用。假设您在数据仓库中有一个事实表,每本书都是从图书馆借来的,包含日期和借阅者。而且工作人员经常想知道借书的次数。然后将物化视图构建为select book_id, book_name, count(*) as borrowings from book_trans group by book_id, book_name
,将其设置为您想要的任何更新频率 - 通常是仓库本身的更新频率。现在,如果有人针对book_trans
表运行针对特定书籍的查询,那么Oracle中的查询重写功能将足够智能地查看物化视图,而不是遍历{{1}中的数百万行}。
通常,您出于性能和稳定性原因构建物化视图 - 片状网络或长时间查询。
答案 1 :(得分:7)
视图基本上是“命名的”SQL语句。您可以在查询中引用视图,就像真正的表一样。访问视图时,将执行视图后面的查询。 例如:
create view my_counter_view(num_rows) as
select count(*)
from gazillion_row_table;
select num_rows from my_counter_view;
视图可用于多种用途,例如提供更简单的数据模型,实现安全性约束,SQL查询重用,SQL缺点的解决方法。
实体化视图是一个已执行查询且结果已存储为物理表的视图。您可以在代码中引用实体化视图,就像真正的表一样。实际上, 是一个可以索引,声明约束等的真实表。 访问物化视图时,您正在访问预先计算的结果。您不执行底层查询。有几种策略可以使物化视图保持最新状态。您可以在文档中找到它们。
物化视图很少直接在查询中引用。关键是让优化器使用“查询重写”机制在内部将查询(例如上面的COUNT(*)示例)重写为预计算表上的查询。这非常强大,因为您无需更改原始代码。
物化视图有很多用途,但它们主要用于性能原因。其他用途包括:复制,复杂的约束检查,优化器缺陷的解决方法。
长版: - > Oracle documentation
答案 2 :(得分:2)
视图是对一个或多个表的查询。视图可以像表一样用于选择或与其他表或视图连接。 metrialized视图是一个已经完全评估并且其行已存储在内存或磁盘上的视图。因此,每次从物化视图中进行选择时,都不需要执行生成视图的查询,并且会立即返回结果。
例如,视图可能是SELECT account, SUM(payment) FROM payments GROUP BY account
之类的查询,表格中包含大量付款但帐户数量不多。每次使用此视图时,都必须读取整个表。使用物化视图,结果会立即返回。
物化视图的重要问题是在更改基础数据时更新它们。在此示例中,每次将新行添加到付款表时,物化视图中代表帐户的行都需要更新。这些更新可以同步或定期进行。
答案 3 :(得分:1)
是。物化视图是在其下方具有基表的视图。您可以定义视图,Oracle会自动在其下创建基表。
通过执行视图并将结果数据放在基表中,您可以获得性能。
它们因各种原因而有用。您将使用物化视图的一些示例如下:
1)复杂的视图在引用
时可能需要很长时间才能执行2)复杂SQL中包含的视图可能会导致执行计划不良,从而导致性能问题
3)您可能需要通过慢速DBLINK
引用数据可以设置物化视图以定期刷新。
您可以指定完整或部分刷新。
请参阅Oracle文档以获取完整信息
答案 4 :(得分:0)
物化视图是包含查询结果的数据库对象。它们是远程数据的本地副本,或用于根据表数据的聚合创建汇总表。