[WITH CHECK OPTION [CONSTRAINT constraint] ]
[WITH READ ONLY];
参数 说明
OR REPLACE 如果视图已经存在,该选项将重新创建该视图
FORCE 无论基表是否存在,都将创建视图
view_name 指定创建视图时的名称
alias 指定由视图的查询所选择的表达式或列的别名
select_statement 创建视图时的SELECT语句
WITH CHECK OPTION 在使用视图时,检查涉及的数据是否能通过SELECT子查询的WHERE条件,否则不允许操作并返回错误提示
WITH READ ONLY 创建的视图只能用于查询,而不能用于更改数据。该子句不能与ORDER BY子句同时存在
创建普通视图
使用WITH READ ONLY选项创建只读视图
使用WITH CHECK OPTION选项创建约束视图
3.3 强制创建视图
正常情况下,如果基本表不存在,则创建视图会失败
但如果创建视图的语句没有语法错误,则只要使用FORCE选项即可创建该视图,这种强制创建的视图被称为带有编译错误的视图
此时,这种视图处于失效状态,不能执行该视图,但之后随着基础表的创建,该视图就可以正常运行了
3.4 在连接视图上执行DML操作
对于在视图上进行的所有DML操作,最终都会在基础表的数据上完成
对视图进行更新(包括UPDATE、DELETE、INSERT)操作,则会受到某些限制,即并非在所有的视图上都可以执行全部的DML操作
对于连接视图,有些可以更新,但有些不能更新
可更新连接视图
不包含集中运算符(UNION、UNION ALL、INTERSECT、MINUS等)
不包含DISTINCT关键字
不包含GROUP BY、ORDER BY、CONNECT BY 或START WITH子句
不包含子查询
不包含分组函数
需要更新的列不是由列表达式定义的
表中所有的NOT NULL列均属于该视图
还需要遵守更新标准,也就是只能对“键值保存表”进行更新
键值保存表
如果连接视图中的一个基础表的主键(主键、唯一键)在它的视图中仍然存在,则称这个基础表为键值保存表
3.5 查询视图信息
使用USER_UPDATABLE_COLUMNS数据字典查询视图的可更新列
使用USER_VIEWS数据字典查询视图的定义信息
3.6 删除视图
可以删除当前模式中的各种视图,需要删除其他方案中的视图时,必须拥有DROP ANY VIEW系统权限
语法
DROP VIEW view_name
4. 索引
4.1 索引概述
通过在表中的一个或多个列上创建索引,就能为数据的检索提供快捷的存取路径,减少查询时的硬盘I/O操作,加快数据的检索速度
与其他具有独立存储结构的方案对象类似,索引需要占用实际的存储空间
一旦创建了索引,在表上执行DML操作时,Oracle就会自动地对索引进行维护
如果将表看成一本书,则索引的作用类似于书中的目录
4.2 创建索引
即使在表中创建了索引,Oracle也不是机械地为该表上的所有查询都使用索引,而是根据查询的具体情况决定是否使用索引
在运行查询语句之前,Oracle一般需要对其进行优化。优化的目的是找到运行该查询语句的最佳途径
优化器会将使用全表扫描所需的资源开销与使用索引所需的资源开销进行对比,如果使用全表扫描所需的资源开销更节省,则不会使用索引
使用全表扫描所需的资源与表中数据量的大小密切相关。一般而言,当表中数据量达到一定数量时,优化器才会考虑使用索引
4.3 索引的分类
单列索引与复合索引
一个索引可以由一个或多个列组成,用于创建索引的列被称为“索引列”
单列索引是基于单个列所创建的索引,复合索引是基于多列所创建的索引
唯一索引与非唯一索引
唯一索引是索引列值不能重复的索引,非唯一索引是索引列值可以重复的索引
无论是唯一索引还是非唯一索引,索引列都允许取NULL值
默认情况下,Oracle创建的索引是非唯一索引
标准(B-tree index,B树)索引
在使用CREATE INDEX语句创建索引时,默认创建的就是B树索引
B树索引可以是单列索引或复合索引、唯一索引或非唯一索引
B树索引按B树结构组织并存放索引数据
位图索引
基数是指某个列可能拥有的不重复值的个数。例如,Sex列的基数为2(性别只能是男或女),MaritalStatus列的基数为3(婚姻状况只能是未婚、已婚、离异)
对于一些基数很小的列,B树索引处理方式的效率比较低
对于基数很小、只存在有限的几个固定值的列(如性别、婚姻状态、行政区、职称),为了加快查询效率,应该在这些列上创建位图索引
当某列的基数与表的总行数的比例小于1%时,Oracle建议在列上创建位图索引
在表上创建一个单独的位图索引是无意义的,位图索引的作用来源于与其他位图索引的结合
函数索引
在Oracle中,不仅能够对表中的列创建索引,还可以对包含有列的函数或表达式创建索引,这种索引被称为“函数索引”
根据函数或表达式的结果的基数情况,函数索引既可以采用普通的B树索引,也可采用位图索引
4.4 创建各类索引
唯一索引
在emp表的ename列上创建一个唯一索引idx_emp_ename,创建之后该表中ename列就不允许出现重复值
复合索引
如果SELECT语句中的WHERE子句引用了复合索引中的所有列或大多数列,则使用复合索引可以显著地提高查询速度
创建此类索引时,应该注意定义中使用的列的顺序,通常,最频繁访问的列应该放置在列表的最前面
位图索引
由于emp表的job列、deptno列的取值范围有限,并且经常需要基于这些列进行查询、统计、汇总工作,所以应该基于这些列创建位图索引
函数索引
为了使在查询条件中包含函数(包括SQL的内置函数或用户自定义函数)和表达式的查询语句的执行效率提高,可以适当地创建函数索引
在创建函数索引时,Oracle首先对包含索引列的函数值或表达式值进行求值,然后对求值后的结果进行排序,最后再将结果存储到索引中
4.5 合并、重建索引
随着不断地对表进行更新操作,表的索引中会产生越来越多的存储碎片,这将对索引的工作效率产生负面影响
用户可以通过两种方式来清除碎片:合并索引、重建索引
4.6 监视索引的使用情况
已经创建的索引是否能够有效地工作,取决于在执行SQL语句的过程中Oracle是否会使用到该索引
Oracle提供了一种比较简便的方法来监视索引的使用情况,即在v$object_usage数据字典动态性能视图中记录索引的使用情况
步骤
使索引处于被监视状态,查询v$object_usage,了解索引的被监视情况
执行SQL语句,查看被监视索引的使用情况
关闭索引监视状态
4.7 查看索引信息
使用user_indexes数据字典视图查看一个表中所有的索引信息
INDEX_NAME:表示索引名
INDEX_TYPE:表示索引类型。其中,FUNCTION-BASED NORM