Jim*_*son 21
当然.
普通视图是定义虚拟表的查询 - 您实际上没有数据位于表中,您可以通过执行来动态创建它.
物化视图是运行查询并将数据保存在实际表中的视图.
物化视图中的数据会在您告知时刷新.
一对用例:
我们有多个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中的查询重写功能将足够智能地查看物化视图,而不是遍历数百万行book_trans
.
通常,您出于性能和稳定性原因构建物化视图 - 片状网络或长时间查询.
一个观点基本上是一个"命名"的SQL语句.您可以在查询中引用视图,就像真正的表一样.访问视图时,将执行视图后面的查询.例如:
create view my_counter_view(num_rows) as
select count(*)
from gazillion_row_table;
select num_rows from my_counter_view;
Run Code Online (Sandbox Code Playgroud)
视图可用于多种用途,例如提供更简单的数据模型,实现安全性约束,SQL查询重用,SQL缺点的解决方法.
物化视图是执行查询并将结果存储为物理表的视图.您可以在代码中引用实体化视图,就像真正的表一样.实际上,它是一个真正的表,您可以索引,声明约束等.访问物化视图时,您正在访问预先计算的结果.您没有执行底层查询.有几种策略可以使物化视图保持最新.您将在文档中找到它们.
物化视图很少直接在查询中引用.关键是让优化器使用"查询重写"机制在内部将查询(如上面的COUNT(*)示例)重写为预计算表上的查询.这非常强大,因为您无需更改原始代码.
物化视图有许多用途,但它们主要用于性能原因.其他用途包括:复制,复杂的约束检查,优化器缺陷的解决方法.
长版: - > Oracle文档