管理视图
视图的特征
与表不同,视图不分配存储空间,视图也不包含数据。相反,视图是由从视图引用的基表中提取或派生数据的查询定义的。因为视图是基于其他对象的,所以除了存储用于在数据字典中定义视图的查询之外,它不需要存储。
视图依赖于其引用的对象,这些对象由数据库自动处理。例如,如果您删除并重新创建视图的基表,则数据库将确定新的基表是否可以为视图定义所接受。
视图中的数据操作
因为视图是从表派生的,所以它们有很多相似之处。用户可以查询视图,并且有一些限制,他们可以对视图执行 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 区域中的合并语句
仅当现有共享 SQL 区域不包含类似语句时,Oracle 数据库才会解析引用新共享 SQL 区域中的视图的语句。因此,视图提供了减少与共享 SQL 相关的内存使用的好处。
- 执行 SQL 语句
以下示例说明了查询视图时的数据访问。假设您employees_view
基于employees
和departments
表创建:
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;
物化视图概述
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了