索引的基本概念
※索引的分类:
- 非唯一索引(最常用)
- 唯一索引
- 位图索引(取值范围小时使用)
- 局部有前缀分区索引
- 局部无前缀分区索引
- 全局有前缀分区索引
- 散列分区索引
- 基于函数的索引(适用于date类型列)
※索引的作用:
- 加快查询速度
- 减少I/O操作
- 消除磁盘排序
※索引的缺点:
- 基础表维护时,系统要同时维护索引,不合理的索引将严重影响系统资源,主要表现在CPU和I/O上;
- 插入、更新、删除数据产生大量db file sequential read锁等待。
※索引的组成:索引包含
索引数据和确定行实际位置的rowid。
△Oracle存储索引的数据结构是B*树,位图索引也是如此,只不过是叶子节点不同B*数索引。
ROWID
※rowid的概念:rowid作为标识了行记录在数据文件中的具体位置。
※伪列:rowid作为伪列,即可以在表中直接查询
※ROWID的格式:ROWID是64进制数组成的一串数字。
例如:
OOOOOOFFFBBBBBBRRR
rowid被分别四段,分别对应:
- 数据对象编号,具体对应为dba_objects.data_object_id
- 文件号,对应v$datafile.file#
- 数据块号,对应v$datafile.block#
- 数据行号,对应v$datafile.row#
唯一索引
※当某列的任意两行值都不相同时使用唯一索引。
△当建立primary key与unique constraint时,自动建立唯一索引。
△当建立primary key与unique constraint时,自动建立唯一索引。
※语法:
CREATE UNIQUE INDEX index_name ON table_name(column_name1 [,column_name2...]);
组合索引
※当两个或多个列经常一起出现在where条件中时,则在这些列上同时创建组合索引。
※组合中的列顺序是任意的,但建议把最常用的列放在最前面。
△例如dx_groupid_serv_id(groupid,serv_id),在where条件中使用groupid或groupid,serv_id,查询将使用索引,若仅用到serv_id字段,则索引无效。
位图索引
※当列值重复度比较高且列取值范围较少时使用位图索引,例如“性别”信息。
※结构:位图索引使用位图作为键值,对表中的每一数据行位图包含了TRUE,FALSE或NULL值。
※语法
CREATE BITMAP INDEX index_name ON table_name(column_name1 [,column_name2...]);
※优点:位图以一种压缩的格式存放,所以占用的磁盘空间比标准索引要小的多。
※缺点:不适用于更新比较频繁的表,因为要相应的更新所有的bitmap
基于函数的索引
※当where查询语句中包含函数或者表达式时,使用函数索引。
△函数包括:
- 算数表达式
- PL/SQL函数
- 程序包函数
- SQL函数
- 用户自定义函数
※语法:
CREATE INDEX index_name ON table_name (FUNCTION(column_name));
删除索引
※原因:
- 不再需要的索引
- 索引不能提供期望的性能改善
- 应用没有使用该索引来查询数据
- 索引无效,需要在重建前删除
- 索引碎片化,需要在重建前删除
※语法
DROP INDEX index_name;
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26121819/viewspace-708600/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/26121819/viewspace-708600/