Oracle索引技术之如何建立最佳索引
怎样建立最佳索引?
1、明确地创建索引
create index index_name on table_name(field_name)
tablespace tablespace_name
pctfree 5
initrans 2
maxtrans 255
storage
(
minextents 1
maxextents 16382
pctincrease 0
);
2、创建基于函数的索引
常用与UPPER、LOWER、TO_CHAR(date)等函数分类上,例:
create index idx_func on emp(UPPER(ename)) tablespace tablespace_name;
3、创建位图索引
对基数较小,且基数相对稳定的列建立索引时,首先应该考虑位图索引,例:
create bitmap index idx_bitm on class (classno) tablespace tablespace_name;
4、明确地创建唯一索引
可以用create unique index语句来创建唯一索引,例:
create unique index dept_unique_idx on dept(dept_no) tablespace idx_1;
5、创建与约束相关的索引
可以用using index字句,为与unique和primary key约束相关的索引,例:
alter table table_name
add constraint PK_primary_keyname primary key(field_name)
using index tablespace tablespace_name;
如何创建局部区索引?
1)基础表必须是分区表
2)分区数量与基础表相同
3)每个索引分区的子分区数量与相应的基础表分区相同
4)基础表的自分区中的行的索引项,被存储在该索引的相应的自分区中,例如
create index TG_CDR04_SERV_ID_IDX on TG_CDR04(SERV_ID)
Pctfree 5
Tablespace TBS_AK01_IDX
Storage(
MaxExtents 32768
PctIncrease 0
FreeLists 1
FreeList Groups 1
)
local
/
如何创建范围分区的全局索引?
基础表可以是全局表和分区表
create index idx_start_date on tg_cdr01(start_date)
global partition by range(start_date)
(partition p01_idx vlaues less than ('0106')
partition p01_idx vlaues less than ('0111')
...
partition p01_idx vlaues less than ('0401'))
/
如何重建现存的索引?
重建现存的索引的当前时刻不会影响查询
重建索引可以删除额外的数据块
提高索引查询效率
alter index idx_name rebuild nologging;
对于分区索引
alter index idx_name rebuild partition partition_name nologging;
删除索引的原因?
1)不再需要的索引
2)索引没有针对其相关的表所发布的查询提供所期望的性能改善
3)应用没有用该索引来查询数据
4)该索引无效,必须在重建之前删除该索引
5)该索引已经变的太碎了,必须在重建之前删除该索引
语句:
drop index idx_name;
drop index idx_name partition partition_name;
建立索引的代价?
基础表维护时,系统要同时维护索引,不合理的索引将严重影响系统资源,
主要表现在CPU和I/O上。
插入、更新、删除数据产生大量db file sequential read锁等待。