索引简介
数据的目录,便于快速定位数据。减少IO读。索引是物理结构
--建立索引
create index ind_dep on dep_log(OPERATE_TAB);
--查询索引
select * from dba_indexes;
select ind.owner 拥有者,ind.index_name 索引名称,ind.index_type 索引类型,ind.table_name 表名 from dba_indexes ind;
索引的工作原理
在创建索引时,Oracle会对将要建立索引的字段进行排序,然后将对于rowid和字段数据一起存储在索引段中。
在查询数据时,在索引中查找相关数据,找到后根据保存在索引中的ROWID在表中直接找到特定数据。
索引分类
B树索引,位图索引,反向键索引,基于函数的索引
建立索引注意情况
索引的建立要合理,如果不合理会影响DML的操作速度。建立索引时应考虑一下情况;
1.索引应建立在where子句频繁使用的字段上。
2.键索行数低于总行数的15%
3.需要经常对某行排序,索引可以加快数据排序速度。
4.限制表的索引个数,索引是为了加快查询,但会降低DML操作。
5.不要在小表上建立索引。
6.为提高多表连接的性能,应在连接列上建立索引
7.因Oracle能够并行读取不同硬盘的数据,故可以将索引和对应的表分别放在不同硬盘中的表空间。这样在避免产生I/O冲突的情况下提高查询速度。
创建索引
建立B树索引(NORMAL);最常用,也是默认索引。以B树结构组织并存索引数据。
oracle会自动为表的主键列创建B树索引。
create index aa_bb_index on aa(bb) pctfree 25 tablespace users;
pctfree;指定将来insert操作所预留的空间
tablespace;指定表空间。
B树索引不适合列的基数小于1%的情况
建立位图索引(BITMAP);解决B树索引在些情况效率很低的情况
如性别字段里面只存储两个值,这时B树对表检索时就会返回一半的记录,效率太低。此时就需要建立位图索引
create bitmap index aa_bb_index on aa(bb);
建立反向键索引(REV)
对于表主键是递增的索引,其总会把数据添加在最后的叶子节点上,如果把前面的数据删除,
那前面的分支也不会被利用,这样就会造成索引数据分布不均。
反向就是把列值’1234’倒序转换‘4321’后再加入到
create index aa_bb_index on aa(bb) reverse;
修改成反向索引
alter index aa_bb_index rebuild reverse;
建立基于函数的索引(FUNCTION)
ORACLE对于大小写字符敏感,对于查询可以用select * from table_name where col= upper('aaaa');
采用这样的方法,都可以进行查询,但查询索引中不存在的值时,oracle还是会进行全表搜索,请对各行进行upper计算。
为了解决该问题,建立基于函数的索引。
函数索引也是子常规的B树索引,其索引是通过对表数据进行计算得到的。
create index emp_job_fun on emp(lower(job));
如果在查询条件中包含相同的函数,则系统会利用它来提高查询的执行效率。
修改索引
修改索引使用alter index
索引合并
alter index index_name coalesce deallocate unused;
重建索引
alter index index_name rebuild;
消除索引碎片化的两个方法:合并索引和重建索引。
删除索引
drop index index_name;