oracle的数据库索引占很大吗,Oracle数据库中的索引

建立索引的优点:

1、大大加快数据的检索速度;

2、创建唯一性索引,保证数据库表中每一行数据的唯一性;

3、加速表和表之间的连接;

4、在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间。

索引的种类

1、按照索引列值的唯一性,索引可分为唯一索引和非唯一索引;

非唯一索引:

create index 索引名 on 表名(列名) tablespace 表空间名;

唯一索引:

建立主键或者唯一约束时会自动在对应的列上建立唯一索引;

注:创建主键时,默认在主键上创建了唯一索引,因此不能再在主键上创建索引。

2、索引列的个数:单列索引和复合索引;

3、按照索引列的物理组织方式。

B树索引

create index 索引名 on 表名(列名) tablespace 表空间名;

位图索引

create bitmap index 索引名 on 表名(列名) tablespace 表空间名;

反向键索引

create index 索引名 on 表名(列名) reverse tablespace 表空间名;

函数索引

create index 索引名 on 表名(函数名(列名)) tablespace 表空间名;

聚集索引(也叫聚簇索引)

在聚集索引中,表中行的物理顺序与键值的逻辑(索引)顺序相同.一个表只能包含一个聚集索引.如果某索引不是聚集索引,则表中行的物理顺序与键值的逻辑顺序不匹配.与非聚集索引相比,聚集索引通常提供更快的数据访问速度.

删除索引

drop index 索引名

重建索引

alter index 索引名 rebuild

索引的创建格式:1

2

3

4

5

6

7

8

9

10

11CREATE UNIQUE | BITMAP INDEX .

ON .

( | ASC | DESC,

| ASC | DESC,...)

TABLESPACE

STORAGE

LOGGING | NOLOGGING

COMPUTE STATISTICS

NOCOMPRESS | COMPRESS

NOSORT | REVERSE

PARTITION | GLOBAL PARTITION

​ UNIQUE | BITMAP:指定UNIQUE为唯一值索引,BITMAP为位图索引,省略为B-Tree索引。

​ | ASC | DESC:可以对多列进行联合索引,当为expression时即“基于函数的索引”

​ TABLESPACE:指定存放索引的表空间(索引和原表不在一个表空间时效率更高)

​ STORAGE:可进一步设置表空间的存储参数

​ LOGGING | NOLOGGING:是否对索引产生重做日志(对大表尽量使用NOLOGGING来减少占用空间并提高效率)

​ COMPUTE STATISTICS:创建新索引时收集统计信息

​ NOCOMPRESS | COMPRESS:是否使用“键压缩”(使用键压缩可以删除一个键列中出现的重复值)

​ NOSORT | REVERSE:NOSORT表示与表中相同的顺序创建索引,REVERSE表示相反顺序存储索引值

​ PARTITION | NOPARTITION:可以在分区表和未分区表上对创建的索引进行分区

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

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

Oracle中的索引类型

​ 在Oracle中的索引可以分为:B树索引、位图索引、反向键索引、基于函数的索引、簇索引、全局索引、局部索引、HASH索引、降序索引等,下面逐一讲解:

B树索引

​ 最常用的索引,各叶子节点中包括的数据有索引列的值和数据表中对应行的ROWID,简单的说,在B树索引中,是通过在索引中保存排过续的索引列值与相对应记录的ROWID来实现快速查询的目的。其逻辑结构如图:

可以保证无论用户要搜索哪个分支的叶子结点,都需要经过相同的索引层次,即都需要相同的I/O次数。

​ B树索引的创建示例:

​ create index ind_t on t1(id) ;

​ 注1:索引的针对字段创建的,相同字段不能创建一个以上的索引;

​ 注2:默认的索引是不唯一的,但是也可以加上unique,表示该索引的字段上没有重复值(定义unique约束时会自动创建);

​ create unique index ind_t on t1(id) ;

​ 注3:创建主键时,默认在主键上创建了B树索引,因此不能再在主键上创建索引。

位图索引

​ 有些字段中使用B树索引的效率仍然不高,例如性别的字段中,只有“男、女”两个值,则即便使用了B树索引,在进行检索时也将返回接近一半的记录。

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

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

​ 位图索引的创建示例:

​ create bitmap index ind_t on t1(type);

注:位图索引不可能是唯一索引,也不能进行键值压缩。

反向键索引

​ 考虑这个情况:某一字段的值是1-1000顺序排列,建立B树索引后依旧递增,到后来该B数索引不断在后面增加分支,会形成如下如的不对称树:

反向键索引是一种特殊的B树索引,在存储构造中与B树索引完全相同,但是针对数值时,反向键索引会先反向每个键值的字节,然后对反向后的新数据进行索引。例如输入2008则转换为8002,这样当数值一次增加时,其反向键在大小中的分布仍然是比较平均的。

​ 反向键索引的创建示例:

​ create index ind_t on t1(id) reverse;

​ 注:键的反转由系统自行完成。对于用户是透明的。

基于函数的索引

​ 有的时候,需要进行如下查询:select * from t1 where to_char(date,’yyyy’)>’2007’;

​ 但是即便在date字段上建立了索引,还是不得不进行全表扫描。在这种情况下,可以使用基于函数的索引。其创建语法如下:

​ create index ind_t on t1(to_char(date,’yyyy’));

​ 注:简单来说,基于函数的索引,就是将查询要用到的表达式作为索引项。

聚集索引(也叫聚簇索引)

”聚簇”表示把数据行和相邻的键值紧凑地存储在一起。因为无法同时把数据行存放在两个不同的地方,所以一个表只能有一个聚簇索引。

聚簇索引的优点:可以把相关的数据保存在一起;数据访问更快;使用覆盖索引扫描的查询可以直接使用叶节点中的主键值。

聚簇索引的缺点:更新聚簇索引列的代价很高,因为会强制将每个被更新的行移动到新的位置;

全局索引和局部索引

​ 这个索引貌似很复杂,其实很简单。总得来说一句话,就是无论怎么分区,都是为了方便管理。

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

​ 1、局部分区索引:分区索引和分区表1对1

​ 2、全局分区索引:分区索引和分区表N对N

​ 3、全局非分区索引:非分区索引和分区表1对N

​ 创建示例:

​ 首先创建一个分区表1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21create table student

(

stuno number(5),

sname vrvhar2(10),

deptno number(5)

)

partition by hash (deptno)

(

partition part_01 tablespace A1,

partition part_02 tablespace A2

);

创建局部分区索引(1v1)1

2

3

4

5

6

7

8

9create index ind_t on student(stuno)

local(

partition part_01 tablespace A1,

partition part_02 tablespace A2

);

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

2

3

4

5

6

7

8

9

10

11create index ind_t on student(stuno)

global partition by range(stuno)

(

partition p1 values less than(1000) tablespace A1,

partition p2 values less than(maxvalue) tablespace A2

); --只可以进行range分区

创建全局非分区索引(1vN)1create index ind_t on student(stuno) GLOBAL;

HASH索引

使用HASH索引必须要使用HASH群集。建立一个群集或HASH群集的同时,也就定义了一个群集键。这个键告诉Oracle如何在群集上存储表。在存储数据时,所有与这个群集键相关的行都被存储在一个数据库块上。若数据都存储在同一个数据库块上,并且使用了HASH索引,Oracle就可以通过执行一个HASH函数和I/O来访问数据——而通过适用一个二元高度为4的B-树索引来访问数据,则需要在检索数据时使用4个I/O。

技巧:HASH索引在有限制条件(需要指定一个确定的值而不是一个值范围)的情况下非常有用。

降序索引(descending index)

这是基于函数索引的一种特殊类型。降序索引可以显著优化ORDER BY x, y, z DESC子句查询的。

域索引(domain index)

当我们创建为用户自定义数据类型(datatype)创建用户自定义索引类型(indextype)时就要使用域索引。

虚拟索引(virtual index)

这是为测试人员和开发人员准备的又一个工具。虚拟索引(不分配段空间)可以让你在不需要实际创建索引的情况下,测试新索引及其对查询计划的影响。对于GB级的表来说,构建索引非常耗费资源而且还要占用大量时间。

总结

虽然Oracle数据库的索引世界有点吓人,不过实际上你平常经常使用的索引就只有那么一些。而且,Oracle 的优化器都已经设计相当出色;总体而言,Oracle很擅长于让你的数据库运行地更有效率。虽然这并不意味着你不需要对自己的SQL进行调优。不过,如果 你一直保持着最新的统计信息,并让Oracle为你整理出你所需要的最小数据集的话,它能够以极快的速度满足你的需要。

参考:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值