索引与视图

索引

索引的概念:

在关系型数据库中,索引是对数据库表中一列或多列的值进行排序后单独的物理存储结构。数据库

在Oracle中,索引是除了表以外的另外一种重要的数据库方案对象。索引的主要用途是提升数据表的查询速度,它能够独立于表进行存储。经过在表中创建索引,能够在索引中找到符合查询条件的索引值,而后再经过保存在索引中的 ROWID 快速找到表中对应的记录。express

  • 索引是一个单独的物理存储结构,能够有本身的存储空间,没必要与相关联的表处在同一个表空间中。
  • 索引由表中一列或多列值的集合和这些值所在的 ROWID(表中数据行的惟一性标识,它不能指示出行的物理位置,但能够用来定位行) 组成。
  • 在Oracle系统中,对索引的应用和维护是自动完成的。
  • 使用索引的好处:安全

    • 建立惟一索引后能够保证每行数据的惟一性。
    • 能够加速检索数据的速度。
    • 多表查询时,能够加速表之间的链接。
    • 明显减小分组和排序的时间。
  • 创建索引后的不足:函数

    • 建立和维护索引须要消耗额外的时间和空间。
    • 对表中数据进行DML操做时,也要动态维护索引,下降了处理数据的速度。
  • 适合建立索引的字段应具有如下特征:性能

    • 取值范围较大的字段。
    • Null值较多的字段。
    • 常常做为查询或链接条件的字段。
    • 常常须要排序的字段。
  • 不适合创建索引的表、字段具有如下特征:学习

    • 较小的表。
    • 常常更新的表。
    • 不常做为查询条件或链接条件的字段。
索引的类型:

Oracle能够建立多种不一样类型的索引,以适应各类表的特色。常见的索引类型包括Balance-tree索引、位图索引、反向键索引、基于函数的索引、全局索引和局部索引等。优化

Balance-tree索引:
  • Balance-tree索引是最多见的索引结构。
  • Oracle采用的默认索引类型。
  • 其组织结构相似于一棵树,其中的主要数据都集中在叶子结点上。
  • 各叶子结点中包括:索引列的值和数据表中对应的 ROWID。
  • 特别适用于检索高基数数据列,即所查询的列的惟一性索引值的个数与其数据行记录数之比接近于1:1的状况(被索引的列值基本没有相同的值)。【我理解为该列数据多样化】
  • Balance-tree索引的优势以下:spa

    • Balance-tree中全部叶子结点基本都处于同一深度,查询时消耗的时间基本相同。
    • Balance-tree的索引结构是自动保持平衡的。
    • Balance-tree为必定范围的查询提供了极好的性能,包括精准匹配和范围查找。
    • Balance-tree的插入、更新和删除效率高。
    • Balance-tree索引的性能不会随着表大小的增加而下降。
  • Balance-tree索引的局限性:当数据检索的范围超过表的10%时就再也不适合使用Balance-tree索引。
位图索引:
  • 位图索引也采用Balance-tree索引,只是索引值所有集中在叶子结点。
  • 位图中的每个位对应一个 ROWID。(例如某一位的值为1,则对应ROWID的行包含该索引键值)这种方式叫作位图的映射功能,即将数据位的位值转化为实际的ROWID。
  • 位图索引适用于检索👉不多有惟一值的列,例如性别。
  • 位图索引的使用状况:若是列中惟一值的个数与表中总的记录行数之比少于1%,则该列可采用位图索引。【我理解为该列数据种类较为单一】
  • 位图索引中再也不记录ROWID和键值,而是将每一个索引值做为一列,用1和0表示该行中是否包含该索引值。
  • 因为位图索引的行顺序与原表的行顺序一致,所以给定表的关键起始和终止ROWID,能够在查询过程当中对应计算出行的原始物理位置。
反向键索引:
  • 反向键索引是一种特殊类型的Balance-tree索引,与常规Balance-tree索引的存储结构相同。
  • 特别适合基于有序数列创建的索引。
  • 反向键索引是为了不常规Balance-tree索引的歪树现象时使用的,它会对用户输入的索引键值的字节进行反向处理,使其变为非递增状态,这样在叶子结点的分布就会比较均匀。
基于函数的索引:
  • 基于函数的索引也是普通的Balance-tree索引,但它是基于表中某些字段的函数创建的,并不创建在某些字段上。
  • 基于函数的索引是为了不用户在使用基于函数的WHERE搜索条件时,Oracle会被迫进行全表搜索下降效率的状况下使用。
  • 基于函数的索引有两个主要做用:日志

    • 只对限定的行建立索引,节约空间,提升检索速度。
    • 优化WHERE子句中使用了函数的SQL语句。
全局索引和局部索引:

为了便于管理和维护表,Oracle容许将表按照range、hash、list进行分区。表分区后,其上的索引也和普通的索引有区别。分区后的表能够创建3种类型的索引:局部分区索引、全局分区索引和全局非分区索引。
局部分区索引:code

  • 将表分区后,为每一个分区单独创建的索引称为局部分区索引。
  • 每一个局部分区索引是针对单个分区的,每一个分区索引只指向一个表分区,它们互相独立。
  • 便于管理,多用于数据仓库环境中。

图片.png
先进行表分区,再为每一个分区单独创建索引。

全局分区索引:

  • 全局分区索引是对整个分区表创建索引,而后再由Oracle对索引进行分区。
  • 全局分区索引的各个分区之间并不是相互独立,索引分区与分区表之间也并不是一对一关系。

图片.png
直接对整个分区表创建索引,再对这个索引进行分区。

全局非分区索引:

  • 全局非分区索引就是对整个分区创建索引,但未对索引进行分区,一个索引对应着表的全部分区。

图片.png
直接对整个分区创建索引,不对这个索引进行分区。

建立索引:
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系统权限。

建立Balance-tree索引:
  • Balance-tree索引是建立索引时的默认类型。
  • 当用户为表建立主键约束时,系统自动为该列建立一个Balance-tree索引。
  • 当使用CREATE INDEX命令建立Balance-tree索引时,若包含UNIQUE关键字,则表示建立一个具备惟一值的Balance-tree索引。
  • 在Oracle中能够建立基于多个字段的索引,称为“复合索引”,其中各个字段的顺序随意,通常将经常使用字段前置。
  • 在查询时,若是WHERE子句中只包含复合索引的第一个字段,那么只有前置的第一个索引会提升查询速度,由于是前置字段。
建立位图索引:
  • 当表中某一个字段的惟一值的个数比较少(基数小)时,在该字段上创建位图索引比较合适。
  • 在建立位图索引时,必须显式指定BITMAP关键字。
  • 因为创建位图索引的字段有许多重复值。所以位图索引不能是惟一索引。
建立反向键索引:
  • 反向键索引的本质也是一个Balance-tree索引,但它不一样于通常的Balance-tree索引。
  • 若是创建索引的字段值顺序增加或降低,那么使用反向键索引能够避免“歪树”现象的产生。
  • 反向键索引适用于严格排序的列,对键值的反向操做由系统自动处理。
  • 建立反向索引时必须指定关键字REVERSE。
建立基于函数的索引:
  • 在DML操做时若是常用某个表达式做为条件,就能够创建基于该函数的索引。
  • 在建立基于函数的索引时,Oracle首先对包含索引列的函数或表达式进行求值,而后对这些值进行排序,最后再存储到索引中。
  • 基于函数的索引能够是普通的Balance-tree索引,也能够是位图索引,这与函数中字段的取值特色有关系。
应用索引:

补充: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中的数据库对象,它能够针对复杂的查询进行存储为数据库对象,以便往后反复使用。

  • 视图是一个逻辑虚拟表。
  • 能够对试图执行各类DML操做。
  • 试图并不在数据库中真正存储有数据,它的数据来自定义视图的查询所引用的表,且这些数据是在使用视图时动态生成的。
  • 视图在数据库中只对应着一个SELECT语句的定义。
视图的优势:
  • 简化数据,精简高效。
  • 加强数据的安全性,用户被限制在数据的任意子集上,进一步增强了数据的安全访问机制。
  • 定制数据,不一样用户可访问的数据集不一样。
  • 合并于分割数据,保持表的原有结构关系,从而使外模式保持不变,应用程序能够经过视图重载数据。
  • 利用视图修改源表,动态即时修改。
建立与管理视图:

视图中的数据来源于数据源表,所以在建立视图时用户应该具备对视图所引用表的查询权限。另外,用户若是在本身的方案下建立视图,须要具备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
幸福至上.png

相关文章
相关标签/搜索