视图概述

来源:互联网 发布:阿里通网络客服电话 编辑:程序博客网 时间:2024/05/17 22:31

视图是一个或多个表的逻辑表示形式。视图在本质上是一个存储的查询。视图的数据来自它所依赖的称为基表的表。基表可以是表或其他视图在视图上执行的所有操作实际上都影响到基表。在大多数可以使用表的地方,您也可以使用视图。

注意:

物化视图使用了与标准视图不同的数据结构。

视图使您能够为不同类型的用户定制数据表示形式。视图通常用于:

 通过限制对一组预定义的表行或表列的访问,提供一个额外的表安全级别

 隐藏数据复杂性

 以一个不同于基表的角度来呈现数据

 隔离应用程序和对基表定义的更改

例如,如果视图的查询定义引用了一个四列表的其中三列,若添加第五列到该表,则视图的定义不会受到影响,并且使用该视图的所有应用程序也不会受到影响。

与所有子查询一样,定义视图的查询中不能包含FOR UPDATE 子句。

视图特征

与表不同,视图既不分配存储空间,也不包含数据。而是通过定义一个查询,从它所引用的基表中提取或派生出数据。视图基于其他对象,除了只需要在数据字典中存储定义视图的查询,它不需要其他存储。

视图对其所引用的对象存在的依赖关系,由数据库自动处理。例如,如果您删除并重新创建了视图的基表,则数据库会确定新的基表是否仍然适合该视图的定义。

视图中的数据操作

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

下面的示例创建 hr.employees 表上的一个视图:

CREATE VIEW staff_dept_10 ASSELECT employee_id, last_name, job_id,manager_id, department_idFROM employeesWHERE department_id = 10WITH CHECK OPTION CONSTRAINT staff_dept_10_cnst;

该查询定义只引用了部门 10中的行。使用CHECK OPTION创建的视图具有一个约束,如果对该视图发出的 INSERT 和 UPDATE 语句所生成的新行不符合该视图的选择条件,则该语句将不会成功。因此,行 10 部门的雇员可以插入,但是部门30 的行不可以。

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

Oracle 数据库将视图定义存储在数据字典中,存的是定义视图查询的文本。当在 SQL 语句中引用视图时,数据库将执行以下任务:

 1. (尽可能)将所发出的查询,与定义该视图(或其它任何底层视图)的查询进行合并

Oracle 数据库会优化合并的查询,就好像您发出的查询并没有引用视图一样。因此,数据库可以使用任何被引用基表列上的索引,无论在视图定义中或在针对该视图的用户查询中是否引用了该列。

有时数据库不能将视图定义与用户查询合并。在这种情况下,数据库可能不会使用所有引用列上的索引。

 2. 在一个共享 SQL 区中,解析合并后的语句

只要还不存在包含相似语句的共享 SQL 区,oracle 数据库就会在一个共享 SQL 区中解析这个引用了视图的语句。因此,视图提供了减少与共享 SQL 相关的内存使用的好处。

 3. 执行 SQL 语句

下面的示例演示了当查询视图时的数据访问。假设您创建基于employees表和departments表 employees_view视图:

CREATE VIEW employees_view ASSELECT employee_id, last_name, salary, location_idFROM employees e, departments d WHERE e.department_id = d.department_id and  d.department_id = 10;--用户对employees_view执行如下的查询:SELECT last_nameFROM employees_viewWHERE employee_id = 9876;--Oracle 数据库将视图和用户查询合并,构建如下面的查询,然后执行---此查询以检索数据:SELECT last_nameFROM employees, departmentsWHERE employees.department_id = departments.department_idAND departments.department_id = 10AND employees.employee_id = 9876;

可更新联接视图

联接视图被定义为在其FROM 子句中有多个表或视图的视图。在例 4-7 中staff_dept_10_30 视图将employees表和departments表相连接,只包括部门 10 或 30 的雇员。

示例 4-7 连接视图

CREATE VIEW staff_dept_10_30 ASSELECT employee_id, last_name, job_id, e.department_idFROM employees e, departments dWHERE e.department_id IN (10, 30)AND e.department_id = d.department_id;

可更新联接视图,也叫做可修改联接视图,涉及两个或多个基表或视图,并允许 DML 操作可更新视图在SELECT 语句的顶层 FROM 子句中包含多个表,并且没有WITH READ ONLY子句限制。

要使视图天生就可更新,必须满足几个条件。例如,一般的原则是联接视图上的插入、 更新、或删除操作只可一次修改一个基表。如下的对数据字典视图USER_UPDATABLE_COLUMNS的查询显示在示例 4-7 中创建的视图是可更新的:

SQL> SELECT TABLE_NAME, COLUMN_NAME, UPDATABLE2 FROM USER_UPDATABLE_COLUMNS3 WHERE TABLE_NAME = 'STAFF_DEPT_10_30';

连接视图中的所有可更新列,必须映射到键保留表中的列。联接查询中的键保留表,其基表中的每一行在查询输出中最多出现一次。在示例 4-7 中,department_id是departments表的主键,所以employees表中的每一行在结果集中最多出现一次,使得employees表是键保留的。而departments表不是键保留的,因为其每个行可能会在结果集中多次出现。

对象视图

正如一个视图是一个虚拟表,一个对象视图是一个虚拟对象表在视图中的每一行都是一个对象,对象是某种对象类型的一个实例。对象类型是一种用户定义的数据类型

您可以检索、 更新、 插入、和删除关系数据,如同它被存储为一个对象类型。您还可以用对象数据类型的列来定义视图,如对象、 REF、和集合 (嵌套表和 VARRAYs)等。

与关系型视图类似,对象视图可以只显示您希望用户看到的数据。例如,一个对象视图可以只呈现IT程序员的有关信息,但忽略有关薪水等敏感数据。下面的示例创建一个 employee_type 对象,然后创建基于此对象的视图 it_prog_view:

CREATE TYPE employee_type AS OBJECT(employee_id NUMBER (6),last_name VARCHAR2 (25),job_id VARCHAR2 (10));/CREATE VIEW it_prog_view OF employee_typeWITH OBJECT IDENTIFIER (employee_id) ASSELECT e.employee_id, e.last_name, e.job_idFROM employees eWHERE job_id = 'IT_PROG';

对象视图在原型程序或向面向对象转换的应用程序中非常有用,因为视图中的数据可以取自关系表,而访问起来好像是一个对象表。您可以运行面向对象的应用程序,而不用将现有表转换为不同的物理结构。

物化视图概述

物化视图是查询结果被提前存储或”物化”的模式对象。在查询的 FROM 子句中可以是命名表、 视图、和物化视图。总体上,这些对象被称作主表 (复制术语) 或明细表 (数据仓库术语)。

物化视图用于汇总、 计算、 复制、和分发数据。它们适用于如下各种计算环境:

 在数据仓库中,可以使用物化视图来计算和存储由聚合函数(如求和或平均值)所生成的数据。

汇总是一个聚合的视图,它通过预先计算联接和聚合操作,并将结果存储在一个表中,来减少查询时间。物化视图相当于汇总 (请参阅”数据仓库体系结构 (基本)”)。您也可以使用物化视图来计算带或不带聚合的联接。如果兼容性设置为 Oracle9i 或更高,则物化视图可用于包括筛选器选择的查询。

 在物化视图复制中,该视图包含从某个表的单一时间点的完整或部分拷贝。物化视图在分布式站点上复制数据,并将在多个站点上执行的更新同步。这种形式的复制适用于如数据库并不始终连接到网络的现场销售环境。

在移动的计算环境中,可以使用物化视图将数据子集从中央服务器下载到移动客户端,从中央服务器定期刷新客户端,并定期将客户端更新传输回中央服务器。

在复制环境中,物化视图与一个称为主数据库的不同数据库中的表共享数据。在主站点上与物化视图关联的表是主表。图 4-7 演示了一个数据库中的物化视图,它基于另一个数据库中的主表。对主表的更新被复制到物化视图。

这里写图片描述

物化视图的特征

物化视图与普通视图和索引具有某些共同特性。物化视图在以下几方面与索引类似:

 它们包含实际数据,并且占用存储空间。

 当其主表中数据更改时,他们可以被刷新。

当用于查询重写操作,它们可以提高 SQL 的执行性能

 它们的存在对 SQL 应用程序和用户是透明的。

物化视图也类似于非物化视图,因为它也呈现其他的表和视图中的数据。与索引不同的是,用户可以直接使用 SELECT 语句查询物化视图。取决于所需的刷新类型,物化视图也可以用 DML 语句进行更新。

下面的示例创建并填充基于sh 示例模式中的三个主表的聚合物化视图:

CREATE MATERIALIZED VIEW sales_mv ASSELECT t.calendar_year, p.prod_id, SUM(s.amount_sold) AS sum_salesFROM times t, products p, sales sWHERE t.time_id = s.time_idAND p.prod_id = s.prod_idGROUP BY t.calendar_year, p.prod_id;

下面的示例删除物化视图sales_mv的主表sales,然后查询sales_mv。该查询能选出数据,是因为其行数据与主表中的数据是分开存储的。

SQL> DROP TABLE sales;Table dropped.SQL> SELECT * FROM sales_mv WHERE ROWNUM < 4;

物化视图可以进行分区。您可以在分区表上定义一个物化视图,并可以在该物化视图上创建一个或多个索引。

物化视图的刷新方法

在主表中的数据更改后,数据库通过刷新物化视图来对其进行维护。刷新方法可以是增量刷新(也称快速刷新),或完全刷新

当物化视图最初被定义为BUILD IMMEDIATE时,会发生完全刷新,除非物化视图引用了一个预建表。刷新涉及执行物化视图定义的查询。此过程可能很慢,尤其是当数据库必须读取和处理大量的数据时。

快速刷新消除了从零开始重新生成物化视图的需要。因此,它仅处理更改,这样可能刷新速度会非常快。可以按需或按定期的时间间隔刷新物化视图。另外,与其主表在同一数据库中的物化视图,只要当主表的事务提交其所做的更改,就可以刷新物化视图

对于使用快速刷新方法的物化视图,由物化视图日志或直接加载器日志来记录对主表的更改物化视图日志是一个用于记录主表数据更改的模式对象,以便可以以增量方式刷新物化视图每个物化视图日志都与单个主表相关联。物化视图日志与其主表驻留在同一个数据库和模式内。

查询重写

查询重写是一种优化技术,它将一个按主表写的用户请求,转换为在语义上等效的、包含物化视图的请求。当基表包含大量的数据时,计算一个聚合或联接是非常昂贵和费时的。因为物化视图包含预计算的聚合和联接,所以查询重写能使用物化视图迅速响应查询。

优化器的查询变换器透明地重写用户请求,以便使用物化视图,而无需用户干预或在SQL 语句中引用物化视图。因为查询重写是透明的,可以添加或删除物化视图,而不会使应用程序中的SQL代码无效。

通常,启用重写查询以使用物化视图,而不是使用明细表,能减少响应时间。图 4-8 显示了数据库同时生成原始的和经过重写的查询执行计划,然后选择成本最低的计划。

这里写图片描述

0 0
原创粉丝点击