Oracle12C--索引(十八)

来源:互联网 发布:剑灵数据异常 编辑:程序博客网 时间:2024/05/22 17:37

知识点的梳理:

  1. 可以使用自动跟踪功能,来判断当前查询语句是否使用的全表扫描。如果使用索引来查询,也可以通过这种方式来分辨当前是索引查询,还是全表扫描;
  2. 索引是提升数据库查询性能的一种手段,但是频繁更新数据表时,索引反而会造成性能的降低;


这是啥?

索引是专门用来提升数据库查询操作性能的;在Oracle中,为了维护这种查询性能,需要对某一个类数据进行指定结构的排列;

B树索引

该索引是Oracle默认建立的索引;
该索引在检索“高基数数列”(该列上的重复内容较少或没有)的时候可以提高性能;
示例:如果当前表中存在10W行数据,而2W行记录之后已经不存在符合查询要求的数据,如果此时继续向下采用逐行扫描的方式明显是浪费资源,这个时候就可以采用树形排序方式;
假设该表中的工资数据为:1300,2850,1100,1600,2450,2975,5000,3000,1250,950,800,则按以下原则进行树结构的绘制:

取第一个数据作为根节点;

比根节点小的数据放在左子树,比根节点大的数据放在右子树;

在进行数据排序的时候,除了使用sal字段的内容之外,每一个操作节点中还保存了一个ROWID的信息,而利用此ROWID的信息就可以找到对应的完整记录;


B树索引结构分析

叶子节点(Leaf Node):包含直接指向表中的数据行(即:索引项);该节点保存的就是索引项,而索引项由3个部分组成:

索引项头:存储了行数和所得信息;

索引列长度和值:两者需要同时出现,定义了列的长度,在长度之后保存的就是列的内容;

ROWID:指向表中数据行的ROWID,通过此ROWID找到完整记录;

分支节点(Branch Node):包含指向索引里其他的分支节点或叶子节点;

根节点(Root Node):一个B树索引只有一个根节点,是位于最顶端的分支节点;


创建B*Tree索引方法:

方法1:当某一个列上设置了主键约束或唯一约束,则会自动创建约束;

方法2:利用命令直接创建索引;


语法:

create index [用户名.]索引名 on[用户名.]表名称 (列名称 [ASC|DESC],....);

create index emp_sal_ind on emp(sal);--在emp表的sal字段上创建了一个索引,这会自动地在内存中将相关的数据形成一颗索引树,以提升查询性能;


通过user_indexes数据字典,查看哪张表存在索引:

SELECT index_name , index_type , table_owner , table_name , uniqueness , status FROM user_indexes ;


通过emp_sal_ind数据字典,查看表中的哪列存在索引:

SELECT * FROM user_ind_columns WHERE index_name='EMP_SAL_IND' ;


如何利用B树索引提升查询性能?

最方便的方法是准备两张表,A表进行数据的更新,B表在每天数据库空闲时间,将A表更新后的数据保存在B表,同时B表上设置索引,用户检索利用B表,更新使用A表,就可以提升性能;

但是这样做会牺牲速度;

位图索引

当某一个列的数据都属于低基数列的时候,就可以利用位图索引来提升性能;
例如,表示雇员的数据表上会存在部门编号的数据列,而在部门编号列上只有3种取值,分别是10,20,30,此时就可以使用位图索引;如果雇员的数据表包含30万条数据,那么按照位图索引,可以将这些数据,按照部门编号分成3组进行查询,在效率上是一定快过直接进行全表扫描的;


语法:create bitmap index [用户名.]索引名称 on[用户名.]表名称 (列名称 [asc|desc],...);

示例:CREATE BITMAP INDEX emp_deptno_ind ON emp(deptno) ;

通过“user_indexes”数据字典查看索引
SELECT index_name , index_type , table_owner , table_name , uniqueness , status FROM user_indexes ;



删除索引

索引自身需要进行数据结构的维护,会占用较大的磁盘空间,随着表的增长,索引所占的空间也会增大;索引被删除后,其所占空间也会被一同释放;
删除语法:drop index索引名称;
示例:DROPINDEX emp_sal_ind ;



0 0
原创粉丝点击