在关系型数据库中,索引是对数据库表中一列或多列的值进行排序后单独的物理存储结构。数据库
在Oracle中,索引是除了表以外的另外一种重要的数据库方案对象。索引的主要用途是提升数据表的查询速度,它能够独立于表进行存储。经过在表中创建索引,能够在索引中找到符合查询条件的索引值,而后再经过保存在索引中的 ROWID 快速找到表中对应的记录。express
使用索引的好处:安全
- 建立惟一索引后能够保证每行数据的惟一性。
- 能够加速检索数据的速度。
- 多表查询时,能够加速表之间的链接。
- 明显减小分组和排序的时间。
创建索引后的不足:函数
- 建立和维护索引须要消耗额外的时间和空间。
- 对表中数据进行DML操做时,也要动态维护索引,下降了处理数据的速度。
适合建立索引的字段应具有如下特征:性能
- 取值范围较大的字段。
- Null值较多的字段。
- 常常做为查询或链接条件的字段。
- 常常须要排序的字段。
不适合创建索引的表、字段具有如下特征:学习
- 较小的表。
- 常常更新的表。
- 不常做为查询条件或链接条件的字段。
Oracle能够建立多种不一样类型的索引,以适应各类表的特色。常见的索引类型包括Balance-tree索引、位图索引、反向键索引、基于函数的索引、全局索引和局部索引等。优化
Balance-tree索引的优势以下:spa
- Balance-tree中全部叶子结点基本都处于同一深度,查询时消耗的时间基本相同。
- Balance-tree的索引结构是自动保持平衡的。
- Balance-tree为必定范围的查询提供了极好的性能,包括精准匹配和范围查找。
- Balance-tree的插入、更新和删除效率高。
- Balance-tree索引的性能不会随着表大小的增加而下降。
基于函数的索引有两个主要做用:日志
- 只对限定的行建立索引,节约空间,提升检索速度。
- 优化WHERE子句中使用了函数的SQL语句。
为了便于管理和维护表,Oracle容许将表按照range、hash、list进行分区。表分区后,其上的索引也和普通的索引有区别。分区后的表能够创建3种类型的索引:局部分区索引、全局分区索引和全局非分区索引。
局部分区索引:code
先进行表分区,再为每一个分区单独创建索引。
全局分区索引:
直接对整个分区表创建索引,再对这个索引进行分区。
全局非分区索引:
直接对整个分区创建索引,不对这个索引进行分区。
CREATE [UNIQUE | BITMAP] INDEX [schema.]<index_name> ON [schema.]<table_name> (<column_name> | <expression> ASC| DESC, <column_name>|<expression> ASC| DESC,…) [TABLESPACE <tablespace_name>] [STORAGE(<storage_settings>)] [LOGGING | NOLOGGING] [NOSORT | REVERSE] [PARTITION | GLOBAL PARTITION<partition_setting>]
UNIQUE | BITMAP
:UNIQUE表示建立的索引是惟一索引,要求建立索引的表达式或字段值必须惟一,不可重复,建立主键约束或惟一约束时系统自动建立对应的惟一索引;BITMAP表示建立的索引是位图索引。当省略前面这两个关键字时,默认建立的索引是能够重复的Balance-tree索引。[schema.] <table_name>
:该子句指出了建立索引的表,其中schema指明表所属的方案名,table_name指表名。<column_name> | <expression> ASC | DESC
:该子句指出了建立索引的列,其中column_name表示基于表中的字段建立索引,expression表示基于某个表达式建立索引。ASC表示建立的索引为升序排列,DESC表示建立的索引为降序排列。建立索引时能够指定多个字段或多个表达式,之间用逗号隔开便可。TABLESPACE
:表示建立索引时能够为索引指定单独的表空间,能够不与相关联的表位于同一个表空间中。(当索引与所对应的表处于不一样的表空间时,能够得到更好的性能)STORAGE
:该子句设置存储索引的表空间的存储特性。LOGGING | NOLOGGING
:表示在建立索引时是否建立相应的日志记录。NOSORT | REVERSE
:NOSORT表示建立的索引与表中的顺序相同,再也不对索引进行排序。使用NOSORT子句的目的是节省建立索引的时间和空间。REVERSE表示以相反的顺序存储索引值,即建立的索引是反向键索引。PARTITION | GLOBAL PARTITION
:PARTITION表示创建分区索引;GLOBAL PARTITION 表示创建全局分区索引;当省略该子句时表示创建非分区索引。建立索引时须要适当的权限才能够完成。若是用户在本身的方案中建立索引,则应该具备CREATE INDEX系统权限,若是在其余用户的方案中建立索引,则必须具备CREATE ANY INDEX系统权限。
补充:Oracle对查询语句的执行过程包括解析代码、优化代码、生成代码和执行代码。
- 解析代码:是指Oracle对用户提交的查询语句进行语法检查和语义分析等操做,查询语句将变成可运行的。
- 优化代码:是指找到执行用户查询的最佳路径。这一步中Oracle可能会使用两种优化器,一种是基于规则的优化器(Rule Based Optimizer,RBO),另外一种是基于开销的优化器(Cost Based Optimizer,CBO)。
- 在优化器选择了最佳路径后,Oracle会将其格式化为实际的执行方案,而后由系统的执行引擎去执行,也就是完成了生成代码和执行代码的过程。
Oracle中索引的应用是由优化器决定的,优化器根据优化的结果自动选择合适的索引来使用。
Oracle在执行命令时,在决定是否应用索引时主要和如下两个因素有关系:
- 数据表的大小。当优化器进行全表扫描时,它会一次读取一批数据块,而不是一次读取一个数据块。假设一个由50个数据块组成的表,若是优化器一次读取10个数据块,则该表须要读取5次完成全表扫描,因为索引须要3次读取,因此这种状况下优化器会使用索引来完成。可是,当表只有20~30个数据块时,全表扫描只须要2~3次读取就能够完成,这时索引就会下降获取数据的速度,所以优化器会使用全表扫描,而不使用索引。
- 用户获取记录的多少。若是用户查询须要读取记录的个数占全表的5%~20%或者更多,那么就会执行全表搜索,而不考虑使用索引。这是由于一个索引项只会指向一个单独的数据块,这样一次只能读取一个数据块,若是使用指向许多数据块的索引,那么就须要执行大量的单独数据块读取操做。
Oracle中可使用autotrace参数来跟踪执行查询操做时索引的使用状况。SET AUTOTRACE TRACEONLY;
视图是Oracle中的数据库对象,它能够针对复杂的查询进行存储为数据库对象,以便往后反复使用。
视图中的数据来源于数据源表,所以在建立视图时用户应该具备对视图所引用表的查询权限。另外,用户若是在本身的方案下建立视图,须要具备CREATE VIEW权限;若是在其余方案下建立视图,须要具备CREATE ANY VIEW权限。
CREATE [OR REPLACE] [FORCE | NOFORCE] VIEW [schema.] view_name [(column[ ,...n])] AS SELECT_statement [WITH CHECK OPTION | WITH READ ONLY]
FORCE | NOFORCE
:FORCE表示无论视图引用的表是否存在,都要强制建立该视图;NOFORCE表示只有基表存在时,才建立视图。省略该选项时默认为NOFORCE。column [ ,...n]
:表示视图中的一组列名,这是为后面的查询语句中选择的列新定义的名字,替表明中原有的列名。SELECT_statement
:表示建立视图的SELECT语句。利用SELECT语句能够从一个或多个表或者视图中获取视图中的行和列,也可使用UNION关键字联合多个SELECT语句。(视图可嵌套)WITH CHECK OPTION | WITH READ ONLY
:WITH CHECK OPTION表示对视图进行插入或修改时,新数据必须知足查询语句中WHERE字句后面的条件;WITH READ ONLY表示视图是只读的。当省略这两个选项时,新建立的视图是一个可修改的、对其操做不进行条件检查的通常视图。
建立视图后,Oracle会验证视图的有效性。若是在之后的操做中修改了数据源表的结构,那么可能会使视图变为无效。这时可使用ALTER VIEW命令从新编译视图使之有效:
ALTER VIEW view_name COMPILE;
DROP VIEW view_name;
可更新的视图是指用户能够对视图执行INSERT、UPDATE、DELETE操做的视图,利用该类视图用户能够完成对数据源表的修改。
可更新的视图或视图的可更新列应具备如下特色:
- 建立时不能选择WITH READ ONLY选项。
- 视图中的非计算或非聚合运算(即数据源表中的原始字段)才能够被更新。
- 视图的定义中SELECT语句不能包含DISTINCT(去重)关键字。
- 视图的定义中SELECT语句不能包含集合操做,如UNION、INTERSECT(交集)等。
- 视图的定义中SELECT语句不能包含GROUP BY子句和HAVING子句。
- 用户必须对视图的数据源表具备显示的操做权限。
- 只有在视图中可见的行和列才能被修改或删除。
用户能够经过查询数据字典中的视图USER_UPDATETABLE_COLUMNS了解视图中的可更新列。
文章根据《Oracle数据库应用于开发》机械工业出版社 石彦芳、李丹著 一书中总结及补充,仅做本人学习用。
文章中若出现错误,请在评论中指出或联系我👇
QQ:354008947
Email:354008947@qq.com