管理视图

视图的特征

与表不同,视图不分配存储空间,视图也不包含数据。相反,视图是由从视图引用的基表中提取或派生数据的查询定义的。因为视图是基于其他对象的,所以除了存储用于在数据字典中定义视图的查询之外,它不需要存储。

视图依赖于其引用的对象,这些对象由数据库自动处理。例如,如果您删除并重新创建视图的基表,则数据库将确定新的基表是否可以为视图定义所接受。

视图中的数据操作

因为视图是从表派生的,所以它们有很多相似之处。用户可以查询视图,并且有一些限制,他们可以对视图执行 DML。对视图执行的操作会影响视图的某些基表中的数据,并受制于基表的完整性约束和触发器。

 

以下示例创建hr.employees表的视图:

CREATE VIEW staff_dept_10 AS
SELECT employee_id, last_name, job_id, 
       manager_id, department_id
FROM   employees
WHERE  department_id = 10
WITH CHECK OPTION CONSTRAINT staff_dept_10_cnst;

CHECK OPTION创建带有约束的视图,以便针对视图发出的INSERT和UPDATE语句不会影响视图无法选择的行。因此,可以插入部门10中员工的行,但不能插入部门30的行。

如何在视图中访问数据

Oracle 数据库将视图定义作为定义视图的查询文本存储在数据字典中

当您在 SQL 语句中引用视图时,Oracle 数据库执行以下任务:

  • 将针对视图的查询(尽可能)与定义视图和任何基础视图的查询合并

Oracle 数据库优化合并查询,就像您在不引用视图的情况下发出查询一样。因此,Oracle 数据库可以在任何引用的基表列上使用索引,无论这些列是在视图定义中引用还是在针对视图的用户查询中引用

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

 

当现有共享 SQL 区域不包含类似语句时,Oracle 数据库才会解析引用新共享 SQL 区域中的视图的语句。因此,视图提供了减少与共享 SQL 相关的内存使用的好处。

  • 执行 SQL 语句

以下示例说明了查询视图时的数据访问。假设您employees_view基于employeesdepartments表创建:

CREATE VIEW employees_view AS 
  SELECT employee_id, last_name, salary, location_id
  FROM   employees JOIN departments USING (department_id)
  WHERE  department_id = 10; 

用户执行以下查询employees_view

SELECT last_name 
FROM   employees_view
WHERE  employee_id = 200;

Oracle 数据库合并视图和用户查询以构造以下查询,然后执行该查询以检索数据:

SELECT last_name
FROM   employees, departments
WHERE  employees.department_id = departments.department_id 
AND    departments.department_id = 10 
AND    employees.employee_id = 200;

物化视图概述

 

posted @ 2022-09-20 21:04  wongchaofan  阅读(55)  评论(0编辑  收藏  举报