索引是与表相关的可选结构,用于提高sql语句执行性能,减少磁盘IO;
索引在逻辑上和物理上都独立于表的数据;
使用create index语句创建索引;
oracle自动维护索引;
索引分为:B树索引、位图索引
B树索引分为:唯一索引、组合索引、反向键索引、基于函数的索引
B树索引是一个二叉树,通过根节点块、分支节点块确定叶子节点块,最后叶子节点块包含索引列和指向表中每个匹配行的rowid值。
创建标准索引:
create index emp_ind_1 on emp(last_name);
查看表中的索引:
select * from user_indexes ui where ui.TABLE_NAME='EMP';
查看索引信信息:
select * from user_ind_columns uic where uic.INDEX_NAME='EMP_IND_1';
分析索引:
当一个table经常进行DML操作时,它的索引会存在许多block空间的浪费,这是因为index block中的记录只有在全部表示为不可用时, block 才能被加入到freelist中去被重新利用,若存在索引碎片,表查询变慢。
通过 analyze index <index名> validate structure
分析索引的数据块是否有坏块
然后查看index_stats表中的pct_used列的值,如果pct_used的值过低,说明在索引中存在碎片,需要重建索引
测试:
create table student (sname varchar2(8)); begin for i in 1..13000000 loop insert into student values (ltrim(to_char(i,'00000009'))); if mod(i,100)=0 then commit; end if; end loop; end;
analyze index STU_IND validate structure ; select s.NAME,s.PCT_USED from INDEX_STATS s where s.NAME='STU_IND';
pct_used一般为90%, 默认会保留10%的空闲。
delete student where ROWNUM<3000000;
重建索引:
alter index <索引名> rebuild
唯一索引:
唯一索引确保在定义索引的列中没有重复值;
oracle自动在表的主键上创建唯一索引;
create table stu1 (sid number,sname varchar2(20),sage number,male varchar2(2));
create unique index s1_index on stu1(SID);
唯一索引可重复插入空值,不违反唯一约束
insert into stu1 values (null,'mk',20,'1');