Oracle索引和分区索引

一.索引

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'
原文地址:https://www.cnblogs.com/CX66/p/13992084.html