Oracle索引
Oracle索引
前言
Oracle索引使用可以加快数据库搜索速度、提高数据库的性能。索引与表关联的可选结构。
Oracle索引的分类
- B树索引(标准索引)
- 分区或非分区索引
- 正常或反向键索引
- 位图索引
- 单列或组合索引
- 唯一或非唯一索引
- 基于函数索引
Oracle索引原则
- 频繁搜索的列可以作为索引
- 经常排序、分组的列可以作为索引
- 经常用作连接的列(主键\外键)可作为索引
- 将索引放在一个单独的表空间中,不要放在有回退段、临时段和表的表空间中
- 对大型索引而言,考虑使用NOLOGGING子句创建大型索引
- 根据业务数据发生的频率、定期重新生成或重新组织索引、并进行碎片整理
- 仅包含几个不同值的列不可以创建为B数索引,可以根据需要创建位图索引(对于基数大的列适合建立B树索引,对于基数小的列适合简历位图索引)
- 不要仅包含几行的表中创建索引
- LONG(可变长字符串数据,最长2G)和LONG RAW(可变长二进制数据,最长2G)列不能创建索引
- 限制表中索引的数量(创建索引耗费时间,随数据量的增大而增大;索引会占用物理空间;当对表中的数据进行增、删、改的时候,索引也要动态的维护,降低数据的维护速度)
- 列中有很多空值,但经常查询该列上非空记录时应该建立索引
Oracle索引注意情况
1.通配符在搜索词首出现时,oracle不能使用索引、如:
--我们在name上创建索引;
create index index_name on student('name');
--下面的方式oracle不适用name索引
select * from student where name like '%wish%';
--如果通配符出现在字符串的其他位置时,优化器能够利用索引;如下:
select * from student where name like 'wish%';
- 不要在索引列上使用not,可以采用其他方式代替如下:(oracle碰到not会停止使用索引,而采用全表扫描)
- 索引上使用空值比较将停止使用索引
- 建立组合索引,但查询谓词并未使用组合索引的第一列,此处有一个INDEX SKIP SCAN概念。
- 在索引列上使用函数时不会使用索引,如果一定要使用索引只能建立函数索引。
- 当被索引的列进行隐式的类型转换时不会使用索引。
Oracle索引
唯一索引:定义索引的字段列不能有重复值。
--添加唯一索引 create unique index index_name on 表名(字段名);
反向键索引:常规B树索引相反,在保持列顺序的同时反转索引列的字节。对于连续增长的索引列,可以将索引数据分散在多个索引块间减少I/O瓶颈发生。
--添加反向键索引 create index index_reverse_name on 表名(字段名) reverse;
位图索引:适用于低基数列(低基数:内容多单类型少很多重复的值)。
--添加位图索引 create bitmap index index_name on 表名(字段名);
B树索引:也称为标准索引。顶部为根、下一级为分支块。按关键字值的升序和降序扫描所有。
--添加B树索引 create index index_name on 表名(字段名);
创建索引:索引名必须是唯一的
create [unique]|[bitmap] index index_name on 表名(字段名); [tablespace tablespacename]
删除索引
drop index index_name;
重建索引
--将反向键索引改为正常B树索引 alter index index_name rebuild noreverse;
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Slikeの后花园!