暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

视图

原创 2023-05-08
293

视图概述

视图是一个或多个表的逻辑表示形式。视图在本质上是一个存储的查询。视图的数据来自它所依赖的称为基表的表。基表可以是表或其他视图。在视图上执行的所有操作实际上都影响到基表。在大多数可以使用表的地方,您也可以使用视图。
注意:
物化视图使用了与标准视图不同的数据结构。
视图使您能够为不同类型的用户定制数据表示形式。视图通常用于:
•通过限制对一组预定义的表行或表列的访问,提供一个额外的表安全级别
•隐藏数据复杂性
例如,一个单一视图的定义可以包含一个联接,它是多个表中的相关列或行的集合。不过,视图隐藏了一个事实,即此信息实际上来自于几个表。查询还可能会对表的信息执行大量计算。因此,用户可以查询视图,而不用知道如何执行联接或计算。
•以一个不同于基表的角度来呈现数据
例如,可以重命名视图的列,而不会影响视图所基于的表。
•隔离应用程序和对基表定义的更改
例如,如果视图的查询定义引用了一个四列表的其中三列,若添加第五列到该表,则视图的定义不会受到影响,并且使用该视图的所有应用程序也不会受到影响。
举一个使用视图的例子,考虑表hr.employees,它具有多个列和许多行。要允许用户只能查看其中5列,或只能查看某些特定的行,您可以创建一个视图,如下所示:
image.png

视图特征

与表不同,视图既不分配存储空间,也不包含数据。而是通过定义一个查询,从它所引用的基表中提取或派生出数据。视图基于其他对象,除了只需要在数据字典中存储定义视图的查询,它不需要其他存储。
视图对其所引用的对象存在的依赖关系,由数据库自动处理。例如,如果您删除并重新创建了视图的基表,则数据库会确定新的基表是否仍然适合该视图的定义。

视图中的数据操作

由于视图是从表派生的,所以他们有很多相似之处。例如,与表一样,一个视图可以包含多达1000个列。用户可以查询视图,在某些限制条件下他们也可以在视图上执行DML。在视图上执行的操作会影响到视图的基表中的数据,并遵从基表的完整性约束和触发器。
image.png

在视图中,数据是如何访问的

Oracle数据库将视图定义存储在数据字典中,存的是定义视图查询的文本。当在SQL语句中引用视图时,数据库将执行以下任务:
•1.(尽可能)将所发出的查询,与定义该视图(或其它任何底层视图)的查询进行合并
Oracle数据库会优化合并的查询,就好像您发出的查询并没有引用视图一样。因此,数据库可以使用任何被引用基表列上的索引,无论在视图定义中或在针对该视图的用户查询中是否引用了该列。
有时数据库不能将视图定义与用户查询合并。在这种情况下,数据库可能不会使用所有引用列上的索引。
•2.在一个共享SQL区中,解析合并后的语句
只要还不存在包含相似语句的共享SQL区,oracle数据库就会在一个共享SQL区中解析这个引用了视图的语句。因此,视图提供了减少与共享SQL相关的内存使用的好处。
•3.执行SQL语句
下面的示例演示了当查询视图时的数据访问。假设您创建基于employees表和departments表employees_view视图:
image.png
image.png

可更新联接视图

联接视图被定义为在其FROM子句中有多个表或视图的视图。在例4-7中staff_dept_10_30视图将employees表和departments表相连接,只包括部门10或30的雇员。
image.png
要使视图天生就可更新,必须满足几个条件。例如,一般的原则是联接视图上的插入、更新、或删除操作只可一次修改一个基表。如下的对数据字典视图USER_UPDATABLE_COLUMNS的查询显示在示例4-7中创建的视图是可更新的:
image.png
连接视图中的所有可更新列,必须映射到键保留表中的列。联接查询中的键保留表,其基表中的每一行在查询输出中最多出现一次。在示例4-7中,department_id是departments表的主键,所以employees表中的每一行在结果集中最多出现一次,使得employees表是键保留的。而departments表不是键保留的,因为其每个行可能会在结果集中多次出现。

对象视图

正如一个视图是一个虚拟表,一个对象视图是一个虚拟对象表。在视图中的每一行都是一个对象,对象是某种对象类型的一个实例。对象类型是一种用户定义的数据类型。
您可以检索、更新、插入、和删除关系数据,如同它被存储为一个对象类型。您还可以用对象数据类型的列来定义视图,如对象、REF、和集合(嵌套表和VARRAYs)等。
与关系型视图类似,对象视图可以只显示您希望用户看到的数据。例如,一个对象视图可以只呈现IT程序员的有关信息,但忽略有关薪水等敏感数据。下面的示例创建一个employee_type对象,然后创建基于此对象的视图it_prog_view:
image.png
对象视图在原型程序或向面向对象转换的应用程序中非常有用,因为视图中的数据可以取自关系表,而访问起来好像是一个对象表。您可以运行面向对象的应用程序,而不用将现有表转换为不同的物理结构。

物化视图概述

物化视图是查询结果被提前存储或"物化"的模式对象。在查询的FROM子句中可以是命名表、视图、和物化视图。总体上,这些对象被称作主表(复制术语)或明细表(数据仓库术语)。
物化视图用于汇总、计算、复制、和分发数据。它们适用于如下各种计算环境:
•在数据仓库中,可以使用物化视图来计算和存储由聚合函数(如求和或平均值)所生成的数据。
汇总是一个聚合的视图,它通过预先计算联接和聚合操作,并将结果存储在一个表中,来减少查询时间。物化视图相当于汇总(请参阅"数据仓库体系结构(基本)")。您也可以使用物化视图来计算带或不带聚合的联接。如果兼容性设置为Oracle9i或更高,则物化视图可用于包括筛选器选择的查询。
•在物化视图复制中,该视图包含从某个表的单一时间点的完整或部分拷贝。物化视图在分布式站点上复制数据,并将在多个站点上执行的更新同步。这种形式的复制适用于如数据库并不始终连接到网络的现场销售环境。
•在移动的计算环境中,可以使用物化视图将数据子集从中央服务器下载到移动客户端,从中央服务器定期刷新客户端,并定期将客户端更新传输回中央服务器。
在复制环境中,物化视图与一个称为主数据库的不同数据库中的表共享数据。在主站点上与物化视图关联的表是主表。图4-7演示了一个数据库中的物化视图,它基于另一个数据库中的主表。对主表的更新被复制到物化视图。
image.png

物化视图的特征

物化视图与普通视图和索引具有某些共同特性。物化视图在以下几方面与索引类似:
•它们包含实际数据,并且占用存储空间。
•当其主表中数据更改时,他们可以被刷新。
•当用于查询重写操作,它们可以提高SQL的执行性能。
•它们的存在对SQL应用程序和用户是透明的。
物化视图也类似于非物化视图,因为它也呈现其他的表和视图中的数据。与索引不同的是,用户可以直接使用SELECT语句查询物化视图。取决于所需的刷新类型,物化视图也可以用DML语句进行更新。
image.png
image.png
物化视图可以进行分区。您可以在分区表上定义一个物化视图,并可以在该物化视图上创建一个或多个索引。

物化视图的刷新方法

在主表中的数据更改后,数据库通过刷新物化视图来对其进行维护。刷新方法可以是增量刷新(也称快速刷新),或完全刷新。
当物化视图最初被定义为BUILD IMMEDIATE时,会发生完全刷新,除非物化视图引用了一个预建表。刷新涉及执行物化视图定义的查询。此过程可能很慢,尤其是当数据库必须读取和处理大量的数据时。
快速刷新消除了从零开始重新生成物化视图的需要。因此,它仅处理更改,这样可能刷新速度会非常快。可以按需或按定期的时间间隔刷新物化视图。另外,与其主表在同一数据库中的物化视图,只要当主表的事务提交其所做的更改,就可以刷新物化视图。
对于使用快速刷新方法的物化视图,由物化视图日志或直接加载器日志来记录对主表的更改。物化视图日志是一个用于记录主表数据更改的模式对象,以便可以以增量方式刷新物化视图。每个物化视图日志都与单个主表相关联。物化视图日志与其主表驻留在同一个数据库和模式内。

查询重写

查询重写是一种优化技术,它将一个按主表写的用户请求,转换为在语义上等效的、包含物化视图的请求。当基表包含大量的数据时,计算一个聚合或联接是非常昂贵和费时的。因为物化视图包含预计算的聚合和联接,所以查询重写能使用物化视图迅速响应查询。
优化器的查询变换器透明地重写用户请求,以便使用物化视图,而无需用户干预或在SQL语句中引用物化视图。因为查询重写是透明的,可以添加或删除物化视图,而不会使应用程序中的SQL代码无效。
通常,启用重写查询以使用物化视图,而不是使用明细表,能减少响应时间。图4-8显示了数据库同时生成原始的和经过重写的查询执行计划,然后选择成本最低的计划。
image.png

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论