一.索引
1.索引的概念
索引是一种可选的与表相关的数据库对象。
数据库中引入索引的目的是为了提高对表中数据的查询速度。
ORACLE并不是机械地为所有查询都使用索引,而是根据用户的具体使用情况,决定是否使用索引搜索数据。
2.索引类型
1 B树索引:又称平衡树索引,按照平衡树算法来组织的索引的,适合索引值取值范围广泛、重复率低的应用。
2 位图索引:按位图结构组织的索引,适合索引取值范围小、重复率高的应用。
3 函数索引:基于包含索引列的函数或表达式创建的索引。
4 唯一性索引与非唯一性索引:唯一索引是索引值不重复的索引,非唯一索引是索引值可以重复的索引。
5 单列索引与复合索引:索引可以创建一个列上,也可以创建多个列上。
3.索引使用的原则
数据导入后再创建索引。
在适当的表和列上创建适当的索引:
----经常查询的记录数目少于表中所有记录的5%时应当创建索引;
----经常进行表连接查询,在连接列上应建立索引;
----对于取值范围很大的列应创建B树索引;
-----对于取值范围很小的列应创建位图索引;
----不能在大数据类型的列上创建索引;
----ORACLE会自动在主键和唯一约束的列上创建唯一索引。
-----合理设置复合索引中列的顺序,应将频繁使用的列放在最前边。
限制表中索引的数目,索引越多,查询越快,表的更新速度越慢。
选择好存储索引的表空间,默认情况下,索引与表存储在同一表空间中。
4.创建索引
1、创建索引
语法格式:
CREATE [UNIQUE][BITMAP] INDEX index_name ON table_name(column_name[ASC|DESC],… | [expression]) [TABLESPACE tablespace_name] ;
语法说明:
UNIQUE:表示建立唯一索引
BITMAP:表示建立位图索引
ASC|DESC:用于指定索引值的排列顺序
示例1:创建B树索引。(默认创建的是非唯一索引)
为产品表products的类别编号categoryid列创建1个B树索引。
CREATE INDEX prod_cateid ON products(categoryid) TABLESPACE users;
默认情况下,当用户为表定义主键时,系统自动为该列创建一个唯一的B树索引;
不能在已包含索引的列创建索引;
示例2:创建唯一索引。为产品表 products的产品名称productname列创建1个唯一索引。
CREATE UNIQUE INDEX uq_proName ON products (productname);
默认情况下,CREATE INDEX创建的是非唯一索引;
通常不需要为列创建唯一索引,当添加主键和唯一约束时系统会自动添加唯一索引。
示例3:创建位图索引。 为订单表orders的ShipCountry列创建1个位图索引btm_country。
CREATE BITMAP INDEX btm_country ON orders (shipcountry);
位图索引不能是唯一索引。
位图索引不能进行键压缩。
单独的位图索引是无意义的,位图索引的作用来源于与其他位图索引的结合。
示例4:创建函数索引。为订单表orders的订购日期orderDate列创建函数索引ind_fun_oDate,使用extract函数取得日期中的年份。
(格式:extract(year from orderDate)
CREATE INDEX ind_fun_odate ON orders (extract(year from orderDate))
函数索引既可以是B树索引,也可以是位图索引。
5.与索引相关的数据字典
1)显示索引的基本描述信息和统计信息
User_indexes,all_indexes,dba_indexes
2)显示索引列的信息
user_ind_columns,all_ind_columns,
dba_ind_columns
二.分区索引
1、索引分区介绍
在Oracle数据库中,索引与表是相互独立的,索引是否分区与表是否分区没有直接关系。不分区的表可以创建分区索引或不分区索引,分区的表也可以创建分索引或不分区的索引,
在Oracle数据库中,分区索引分为本地分区索引和全局分区索引两种。
(1)本地分区索引
是指为分区表中的各个分区单独创建索引分区,各个索引分区之间是相互独立的,索引的分区与表的分区是一一对应的。如图所示:为分区表创建了本地分区索引后, Oracle会自动对表的分区和索引的分区进行同步维护。
(2)全局分区索引
是指先对整个表建立索引,然后再对索引进行分区。索引的分区之间不是相互独立的,索引分区与表分区之间也不是一一对应的,如图所示:
也可以为分区表创建非分区的全局索引,如图所示:
全局分区索引不能是位图索引,但可以是唯一索引
2.创建分区索引
1) 创建本地分区索引
分区表创建后,可以对分区表创建本地分区索引。在指明分区方法时使用 LOCAL关键标识本地分区索引。
【例5】在 student_range分区表的sname列上创建本地分区索引。
SQL>CREATE INDEX student_range_local ON student_range (sname) LOCAL;
2)创建全局分区索引
与表分区方法类似,索引分区方法也包括范围分区、列表分区、散列分区和复合分区在指明分区方法时使用GLOBAL关键字标识全局分区索引。
【例6】为分区表 student_list的sage列建立基于范围的全局分区索引。
SQL>CREATE INDEX student_range_global ON student_range(sage) GLOBAL PARTITION BY RANGE(sage) (PARTITION p1 VALUES LESS THAN (80)TABLESPACE ORCLTBS1, PARTITION p2 VALUES LESS THAN(MAXVALUE) TABLESPACE ORCLTBS22);
3))创建全局非分区索引
为分区表创建全局非分区索引与为标准表创建索引一样。
【例7】为分区表 student_list_index创建全局非分区索引。
SQL>CREATE INDEX student_list_index ON student list(sname) TABLESPACE indx;
3.删除索引
如果索引不再使用,或者由于移动了表数据而导致索引失效,或者由于索引中包含损坏数据块、过多的存储碎片等,可以考虑删除索引。
如果索引是通过CREATE INDEX语句创建的,可以使用DROP INDEX语句删除索引
【例8】删除emp表中的emp_new_Iname_indx索引
SQL>DROP INDEX emp_new_Iname_ind
如果索引是定义约束时自动建立的,则在禁用约束或删除约束时会自动删除对应的索引.
4.查询索引
可以查询数据字典视图 DBA_INDEXES、 ALL_INDEXES、 USER_INDEXES、DBA_IND_COLUMNS、ALL_IND_COLUMNS USER_IND_COLUMNS获取索引信息
【例9】查询employees表中所有索引的名称与类型。
SQL>SELECT index_name, index_type FROM dba_indexes WHERE table name='EMPLOYEES';