SQL查询--索引

索引概念和做用

索引是创建在表上的可选对象,目的是为了提升查询速度。
若是要在表中查询指定的记录,在没有索引的状况下,必须遍历整个表,而有了索引以后,只须要在索引中找到符合查询条件的索引字段值,就能够经过保存在索引中的ROWID快速找到表中对应的记录。
例如,若是将表看作一本书,索引的做用相似于书中的目录。在没有目录的状况下,要在书中查找指定的内容必须阅读全文,而有了目录以后,只须要经过目录就能够快速找到包含所需内容的页码(至关于ROWID)
 
索引的关键在于经过一组排序后的索引键来取代默认的全表扫描检索方式,从而提升检索效率。
索引在逻辑上和物理上都与相关的表的数据无关,当建立或删除一个索引时,不会影响基本的表、数据库应用或其余索引,当插入、更改和删除相关的表记录时,Oracle会自动管理所引,若是删除索引,全部的应用仍然能够继续工做。所以在表上一列或多列建立索引不会对表的使用产生任何影响,可是,能够提升检索速度。
 
索引一旦创建后,当在表上进行DML操做时,Oracle会自动维护索引,并决定什么时候使用索引。
索引的使用对用户是透明的,用户不须要再执行SQL语句时指定使用哪一个索引以及如何使用索引。索引只与系统性能相关。

索引原理

 

索引的类型

能够按照列的多少、索引值是否惟1、索引数据的组织形式对索引进行分类,以知足各类表和查询条件的要求:
一、单列索引和复合索引
一个索引能够由一个或多个列组成,基于单个列所建立的索引称为单列索引,基于两列或多列所建立的索引称为多列索引。
 
二、B树索引
B树索引是Oracle中最经常使用的一种索引。当用 create index 语句建立索引时,默认建立的索引就是B树索引。
B树索引是按照B树结构或使用B树算法组织并存储索引数据的,B树索引就是一棵二叉树,它由根、分支节点和叶子节点三部分构成。其中,根包含指向分支节点的信息,分支节点包含指向下级分支节点和指向叶子节点的信息,叶子节点包含索引列和指向表中每一个匹配行的ROWID值。叶子节点是一个双向链表,所以能够对其进行任何方面的范围扫描。

 

 

 
三、位图索引
在B树索引中,保存的是通过排序的索引即其对应的ROWID值,可是对于一些基数很小的列来讲,这样作并不能显著提升查询的速度。所谓基数,是指某个列可能拥有的不重复值得个数。好比性别列的基数为2(只有男和女)
所以,对于像性别、婚姻情况、政治面貌等只有几个固定值的字段而言,若是要创建索引,应该创建位图索引,而不是默认的B树索引。

 

 

 

四、函数索引
Oracle还能够对包含有列的函数或表达式建立索引,这就是函数索引。
当须要常常访问一些函数或表达式时,能够将其存储在索引中,当下次访问时,因为该值已经计算出来了,所以,能够大大提升那些在 where 字句中包含该函数或表达式的查询操做的速度。

 

 

管理索引的原则

建立索引

建立索引使用create index语句

 

 

 能够在一个表上建立多个索引,但这些索引的列的组合必须不一样,以下:算法

create index idx1 on sales(id,topic); create index idx2 on sales(topic,id);
其中,idx1和idx2索引都使用了id和topic列,但因为顺序不一样,所以是合法的。
 
建立B树索引
B树索引是Oracle默认的索引类型,例如在 sales 表的 topic 列上按标题查询,能够在 topic 列上创建B树索引
create index idx_name on sales(topic); 单列索引
CREATE INDEX idx_name ON sales(job,sal); 复合索引
 
 
建立位图索引
以sales表的islook列(基数为2,只有2个值,Y或N)建立位图索引
create bitmap index idx_name on sales(islook);
(其实建立了索引并不必定就会使用,Oracle在自动搜集了表和索引的统计信息后,会决定是否使用索引,若是表数据太少,就能够直接全表扫描,没必要使用索引)
 
建立函数索引
CREATE INDEX idx_name ON sales(UPPER(topic));
 
重命名索引
alter index idx_name1 rename to idx_name2;

 

删除索引
drop index idx_name;

 

重建索引
alter index idx_name rebuild;
合并索引
alter index idx_name coalesce;

 

 
查询索引
用user_indexes和user_ind_columns系统表查看已经存在的索引
user_indexes: 系统视图存放是索引的名称以及该索引是不是惟一索引等信息。
user_ind_column: 系统视图存放的是索引名称,对应的表和列等。
基本查询:
select * from user_indexes; select * from user_ind_columns; 关联查询: select i.index_name, i.index_type, i.table_owner, i.table_name, i.uniqueness, i.tablespace_name, c.column_name, c.column_position, c.column_length from user_indexes i, user_ind_columns c where i.index_name = c.index_name; 也能够用all_indexes表查询 select index_name,index_type, tablespace_name, uniqueness from all_indexes where table_name ='tablename';
相关文章
相关标签/搜索