Oracle索引的内部结构

用于搜索的分支

用于存储索引数据的叶子块

lishixinzhi/Article/program/Oracle/201311/16672

数据库索引有哪几种,怎样建立索引

数据库索引的类型:

1根据索引列值的唯一性,索引可分为唯一索引和非唯一索引

非唯一索引:B-treeindexs

在表名(列名)表空间名表空间上创建索引索引名;

唯一索引:设置主键或唯一约束时,将创建唯一索引在对应列上自动创建

2索引列数:列索引单一索引和复合索引

3到索引列的物理结构组织方法

B树索引

创建索引索引名在表名(列name)tablespa名称ce表空间;

位图索引

在表名称(列名称)表空间名称表空间上创建索引名称bitmapindex;

反向键index

createindex索引名称on表名称(列名称)reversetabl表空间名称espace;

函数索引

在表名(函数名(列名))上创建索引索引名表空间名表空间;

删除索引

索引名称dropindex

重建索引

重建索引名称lterindex

索引创建格式:

CREATEUNIUQE|BITMAPINDEX.ON<架构>.<表名称>(<列名称>|<表达式>ASC|DESC,<列名称>|<表达式>ASC|DESC,...)TABLESPACE<表空间名称>STORAGE<存储设置>LOGING|NOLOGGINGCOMPUTESTATISTICSNOCOMPRESS|COMPRESSNOSORT|REVERSEPARTITION|GLOBALPARTITION

UNIQUE|BITMAP:指定UNIQUE作为唯一值索引,BITMAP作为位图索引,并将其保留为B树索引。
|<expression>ASC|DESC:可以将多个列一起索引当它是表达式时,它是“基于函数的索引”。
索引和原表不在同一个表空间高)STORAGE:可以进一步设置表空间存储参数LOGING|NOLOGGING:是否为索引重新生成日志(大表尽量使用NOLOGGING,以减少空间占用,提高效率)COMPUTESTATISTICS:创建新索引时收集统计信息NOCOMPRESS|COMPRESS:是否使用“键压缩”(使用键压缩可以删除键列中出现的重复值)NOSORT|REVERSE:NOSORT表示以与表中相同的顺序创建索引,REVERSE表示以相反的顺序存储索引值PARTITION|NOPARTITIONN:创建的索引可以在分区表和非分区表上分区

使用USER_IND_COLUMNS查询TABLE中相应字段的索引建立情况

使用DBA_INDEXES/USER_INDEXES查询所有索引的具体设置。

Oracle中索引可分为:B树索引、Bitmap索引、反向键索引、基于函数的索引、聚集索引、全局索引、局部索引等。
下面一一介绍:

1、B树索引:

最常用的索引每个索引包含的数据叶子节点包含索引列的值和对应行的ROWID。
简而言之,在B树索引中,通过在索引中存储连续的索引列值和记录对应的ROWID来达到快速查询的目的。
逻辑结构如图:

可以保证无论用户想要哪个分支找到节点叶子,他要经过相同的索引级别,需要相同数量的I/O。

创建B树索引示例:

createindexind_tont1(id);

注意1:为一个字段创建一个索引,同一个字段不能创建多个索引;

2:默认索引不唯一,但也可以添加唯一,表示索引字段中不存在重复值(定义唯一约束时将自动创建重复值

)。

注3:创建主键,默认在主键上创建B树索引,所以不能在主键上创建索引。

2.位图索引:

在某些领域使用B树索引的效率还是不高,比如性别领域,只有“男”和“女”两个值”。
即使使用树索引B,检索时也会返回几乎一半的记录。

所以当字段基数很低时,需要使用位图索引。
(“低”的标准是值的数量<行数*1%)

结构位图索引逻辑如上图所示:索引中不再记录rowid和key值,而是将每个值视为一列,用0和1表示该行是否等于键值(0表示否;1表示是)。
位图索引的行序与原表的行序一致,在数据查询过程中可以据此计算出该行的原始物理位置。

创建位图索引示例:

createbitmapindexind_tont1(type);

注意:位对图进行索引不能是唯一索引,并且不能进行键值压缩。

3.倒排键索引:

考虑这样一种情况:某个字段值按照1到1000的顺序排列,B树索引创建后,还在递增然后,B数索引继续增加后面的分支,将形成如下所示的非对称树:

反向键索引为一种特殊的B树索引,在存储结构上与B树完全相同,但是对于数值,反向键索引会首先反转每个值的字节key,然后索引新的反转数据。
例如输入2008,就会改为8002,这样随着值的增大,反向键在大小上的分布还是比较均匀的。

创建倒排键索引示例:

createindexind_tont1(id)inverted;

注意:密钥反转是由系统本身完成的。
它对用户来说是透明的。

4.基于函数的索引:

'2007';

但是即使在日期字段上创建索引,仍然需要进行全表扫描。
在这种情况下,可以使用基于函数的索引。
创建语法如下:

createindexind_tont1(to_char(date,'yyyy'));

说明:简单来说就是一个基于函数的索引是使用在查询中用作索引项的表达式。

5.全局索引和局部索引:

这个索引看起来很复杂,但实际上很简单。
总之,无论怎么划分,都是为了方便管理。

索引和表的具体关系有以下三种:

1、部分分区索引:分区索引与分区表1对1

2.全局分区索引:分区索引和分区表Nvs.N

3.全局非分区索引:非分区索引和分区表1ForN

创建示例:

首先创建一个表分区

创建tablestudent

(

stunnumber(5),

snamevrvhar2(10),

deptnonumber(5)

)

partitionbyhash(deptno)

(

partitionpart_01tablespaceA1,

partitionpart_02tablespaceA2

);

创建本地分区索引(1v1):

 createindexind_tonstudent(stuno)

local(

partitionpart_01tablespaceA2,

partitionpart_02tablespaceA1

);--local可省略

创建全局分区索引(NvN):

createindexind_tonstudent(stuno)

globalbyrange(stuno))

(

分区p1值小于(1000)tablespaceA1,

分区p2值小于(maxvallue)tablespaceA2

);--只能进行范围分区

创建全局非分区索引(1vN)

createindexind_tonstudent(stuno)GLOBAL;

oracle数据库索引种类,分别什么情况下使用

1.B树索引。
Oracle数据库中最常见的索引类型是B树索引,也称为B树索引,以计算机科学的同名结构命名。
CREATEINDEX,默认创建一个b树索引。
任何情况下都没有适用特殊规定。
2.位图索引(bitmapindex)。
位图索引适用于列只有几个枚举值的情况,例如性别字段,但标签字段只有0和13.基于特征的索引。
例如,如果您经常使用函数查询特定字段,那么构建该函数的索引会很有用。
4、对表进行分区时使用分区索引和全局索引。
第一个是分区内的索引,第二个是表的完整索引。
5.反向索引(REVERSE)这个索引并不常见,但是在某些情况下特别有效。
例如,varchar(5)位。
字段(员工编号)包含值(10001,10002,10033,10005,10016..)在这种情况下,默认索引分布过于密集,无法有效利用服务器并行性。
但反转后,10001、20001、33001、50001、61001会有良好的分布。
可以有效地利用并行操作。
6.HASH索引HASH索引可能是访问数据库中数据最快的方式,但它也有其缺点。
在创建HASH集群之前,需要知道不同集群键值的数量。
建HASH集群时必须指定该值。
要使用HASH索引,必须使用HASH簇。