索引是与表相关的一个可选结构,在逻辑上和物理上都独立于表的数据,索引能优化查询,不能优化DML操作,Oracle自动维护索引,频繁的DML操作反而会引起大量的索引维护。
创新互联-专业网站定制、快速模板网站建设、高性价比固阳网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式固阳网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖固阳地区。费用合理售后完善,十余年实体公司更值得信赖。
通常,为检索表数据,数据库以交替方式先读取索引块,然后读取相应的表块。
1 大表,返回的行数<5%
2 经常使用where子句查询的列
3 离散度高的列
4 更新键值代价低
5 逻辑AND、OR效率高
6 查看索引在建在那表、列:
select * from user_indexes;
select * from user_ind_columns;
oracle 索引结构:
oracle索引分为两大类结构:
类似于字典查询,最后到leaf block ,存的是数据rowid和数据项
1.叶块之间使用双向链连接,为了可以范围查询。
2.删除表行时,索引叶块也会更新,但只是逻辑更改,并不做物理的删除叶块。
3.索引叶块不保存表行键值null的信息。
在oracle中是根据rowid来定位记录的,因此,我们需要引入start rowid和end rowid,通过start rowid ,end rowid 和二进制位的偏移,我们就可以非常快速的计算出二进制位所代表的表记录rowid。位图索引的最终逻辑结构如下图:
我们称每一单元的
建立索引的方式:
1.唯一索引:键值不重复
create unique index doctor_index on t_doctor(empno)
drop index doctor_index
2.一般索引:键值可重复
create index doctor_index on t_doctor(empno)
drop index doctor_index
3.复合索引:绑定了多个列
create index doctor_index on t_doctor(empno,job)
drop index doctor_index
4.反向索引:为避免平衡树索引热块,如t_doctor表中empno开头都是“7”,这样构建索引树的时候,很可能会把所有数据分配到一个块里,使用反向索引,避免此类问题,使索引树分布均匀
create index doctor_index on t_doctor(empno) reverse
drop index doctor_index
5.函数索引:查询时必须用到这个函数,才会使用到
create index func_index on t_doctor(lower(empno))
--select * from t_doctor where lower(empno) = 'lina'
drop index func_index
6.压缩索引:不常用
create index doctor_index on t_doctor(empno) compress
drop index doctor_index
7.升序降序索引:
create index doctor_index on t_doctor(empno desc, job asc)
drop index doctor_index
由于对基表做DML操作, 导致索引表块的自动更改操作,尤其是基表的delete操作会引起index表的index_entries的逻辑删除,注意只有当一个索引块中的全部index_entry都被删除了,才会把这个索引块删除,索引对基表的delete、insert操作都会产生索引碎片问题。
在Oracle文档里并没有清晰的给出索引碎片的量化标准,Oracle建议通过Segment Advisor(段顾问)解决表和索引的碎片问题,如果你想自行解决,可以通过查看index_stats视图,当以下三种情形之一发生时,说明积累的碎片应该整理了(仅供参考)。
查看执行计划:set autotrace traceonly explain;
analyze index ind_1 validate structure;
select name,HEIGHT,PCT_USED,DEL_LF_ROWS/LF_ROWS from index_stats;
1.HEIGHT >=4
2 PCT_USED< 50%
3 DEL_LF_ROWS/LF_ROWS>0.2
alter index ind_1 rebuild [online] [tablespace name];