微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Oracle索引(Index)创建使用

Oracle对象教程:索引(Index)创建使用,索引:对数据库表中的某些列进行排序,便于提高查询效率。

当我们在某本书中查找特定的章节内容时,可以先从书的目录着手,找到该章节所在的页码,然后快速的定位到该页。这种做法的前提是页面编号是有序的。如果页码无序,就只能从第一页开始,一页页的查找了。

数据库中索引(Index)的概念与目录的概念非常类似。如果某列出现在查询的条件中,而该列的数据是无序的,查询时只能从第一行开始一行一行的匹配。创建索引就是对某些特定列中的数据排序,生成独立的索引表。在某列上创建索引后,如果该列出现在查询条件中,Oracle会自动的引用该索引,先从索引表中查询出符合条件记录的ROWID,由于ROWID是记录的物理地址,因此可以根据ROWID快速的定位到具体的记录,表中的数据非常多时,引用索引带来的查询效率非常可观。

·如果表中的某些字段经常被查询并作为查询的条件出现时,就应该考虑为该列创建索引。

·当从很多行的表中查询少数行时,也要考虑创建索引。有一条基本的准则是:当任何单个查询要检索的行少于或者等于整个表行数的10%时,索引就非常有用。

Oracle数据库会为表的主键和包含唯一约束的列自动创建索引。索引可以提高查询的效率,但是在数据增删改时需要更新索引,因此索引对增删改时会有负面影响。

语法结构:创建索引

CREATE [UNIQUE] INDEX index_name ON table_name(column_name[,column_name…])

语法解析:

1. UNIQUE:指定索引列上的值必须是唯一的。称为唯一索引。

2. index_name:指定索引名。

3. tabl_name:指定要为哪个表创建索引。

4. column_name:指定要对哪个列创建索引。我们也可以对多列创建索引;这种索引称为组合索引。

案例4:为EMP表的ENAME列创建创建唯一索引,为EMP表的工资列创建普通索引,把JOB列先变为小写再创建索引。

代码演示:创建索引

sql> CREATE UNIQUE INDEX UQ_ENAME_IDX ON EMP(ENAME); ①

Index created

sql> CREATE INDEX IDX_SAL ON EMP(SAL); ②

Index created

sql> CREATE INDEX IDX_JOB_LOWER ON EMP(LOWER(JOB));③

Index created

代码解析:

① 为SCott.EMP表的ENAME列创建唯一索引。

② 为SCott.EMP表的SAL列创建索引。

③ 在查询中可能经常使用job的小写作为条件的表达式,因此创建索引时,可以先对JOB列中的所有值转换为小写后创建索引,而这时需要使用lower函数,这种索引称为基于函数的索引。

在select语句查询时,Oracle系统会自动查询条件上的列应用索引。索引就是对某一列进行排序,因此在索引列上,重复值越少,索引的效果越明显。

Oracle可以为一些列值重复非常多且值有限的列(比如性别列)上创建位图索引。关于Oracle更多的索引类型(比如反向键索引等),请参考Oracle官方文档。


Oracle基本索引的使用

一、索引的分类

序号 索引名称 中文含义
1 B*索引 最经典、最常用的索引
2 Primary Key 主键、也是也是一种索引
3 Unique Key 唯一索引
4 Function-Based Index 函数索引
5 Composite Index 多字段复合索引
6 Reverse Index 反转索引
7 Bitmap Index 位图索引
8 Cluster Index 聚簇索引
9 Cluster-Hash Index 簇哈希索引
10 Local Prefix Partitioned Index 本地前缀分区索引
11 Local non-Prefix Partitioned Index 本地非前缀分区索引
12 Global Range-Partitioned Index 全局范围分区索引
13 Global Hash-Partitioned Index 全局哈希分区索引
14 Context Index 全文搜索索引
15 CTXCA Index 文献目录索引
16 CTXRULE Index 文献分类索引
17 CTXXPASTH Index XML类型的全文索引
18 Bitmap-join Index 位图连接索引
19 ………… …………

虽然Oracle提供了如此多的索引,但是在实际中常用的索引类型也就那么几种

OLTP——联机事务处理,可以简单认为是我们的业务系统,有大量DML操作

OLAP——联机事务分析处理,可以简单认为是数据仓库,基本上都是查询操作

二、B*树索引(用于OLTP)

B树索引是Oracle认索引类型,也是最常用的索引,该类索引有许多好处:

1、针对唯一值或小范围的数据的访问时非常快。特别适合与精度匹配查询与范围查询

2、B*树可以自动进行平衡

3、虽然过多的B树索引会影响DML操作,但是单个B*树索引对DML操作的影响是很小的

4、大多数情况下,B*树索引可以随着数据量的增长而很好的进行扩展

B*树单字段索引使用建议

1、分析sql语句中约束条件的字段

2、如果条件字段不固定,可以针对单字段建立普通B*树索引

3、针对可选性高的字段建立索引

4、如果是多表连接,可以考虑在被驱动表上的连接字段加索引

5、通过对sql语句进行分析,查看执行计划来进行优化

三、位图索引(用于OLAP)

位图索引是用来改善基于有很少列值的行的访问速度,例如中国有十几亿人口,那么民族至于56个,那么针对民族代码就可以建立位图索引;

在OLTP中一般不使用位图索引

四、函数索引

如下情况:WHERE 1=1 AND (sysdate-to_date(DT_TIME,'yyyymmddhh24miss'))*24*60<10

在DT_TIME上面加上了索引,但是发现执行计划并没有按照索引来,这里其实是Oracle的一个缺陷了,

例如:DT_TIME-7<sysdate 与 DT_TIME<sysdate+7 在我们看来是一样的,但是在Oracle眼里却是不一样的,前面的表达式不会走索引,而后面的表达式就会走索引

针对上述情况,如果索引字段在函数里面,要么简历函数索引,要么就优化表达式。但是建立函数索引有一些限制

函数索引限制:

1、必须使用一个确定的函数定义基于该函数的索引,也就是说函数仅返回一个

2、必须使用返回可重复值的函数来定义基于该函数的索引,如sysdate就不行

3、可以对基于函数的索引进行分区,但是对基于函数的全局分区索引来说,分区键不能是索引所基于的函数

4、函数必须使用圆括号来定义,即使没有参数

5、索引基于的函数不能包含聚合函数

使用建议:

1、不要轻易在字段前面加函数

2、尽量不要将字段嵌入表达式中

3、尽量减少使用函数索引,能不用就不用,因为函数索引的维护代价比普通索引高;函数索引计算值可能大于原字段值,将消耗更多的存储空间

五、复合索引

在大多数情况下,复合索引比单字段索引号,因为可以过滤出更多数据,精确定位。但是要考虑实际情况,不能滥用,不能乱用。

复合索引设计原则:

1、前缀性

也就是说到底把那个字段放在第一个未知呢,这个至关重要

例如:(col1,col2,col3)这个索引包含三个字段

  1. SELECT*FROMtab1WHEREcol1='XX'
  2. WHEREcol2='XX'
  3. WHEREcol3='XX'
  4. WHEREcol1='XX'ANDNAME='CCC'
  5. WHEREcol2='XX'NAME='CCC'

针对上面的几个sql语句,到底谁会走索引,谁不走索引你。

其实只要含有col1='SSSS'条件的语句都会走索引

这就是为什么第一个字段为什么这么重要的原因了

2、可选性

就是用于索引的字段的非重复数据必须多,像用性别来做索引字段就行不通。

将字段可选性越多的字段放到前面

复合索引使用建议:

1、分析sql语句中约束条件字段

2、约束条件比较固定的,优先采用B*树复合索引

3、单个字段是主键、唯一键或则其他可选性很高的字段可以建立单字段索引,节省索引开销

4、在建立复合索引的时候,优先考虑其前缀性,其次是可选性

5、如果涉及到几个条件使用频繁,但是查询组合不固定,可以分别建立单字段索引

6、如果是多表连接,可以考虑在被驱动表的连接字段与该表的其他字段创建复合索引

7、通过查看sql语句执行计划进行分析

六、索引维护

1、索引并不是越多越好,因为索引会影响DML操作并且本身也会消耗存储,因此删掉没有使用的索引

2、索引碎片整理,可以定期重建压缩索引

alter index ix_name rebuild;

alter index ix_name coalesce;



oracle唯一索引与普通索引的区别和联系

区别:唯一索引unique index和一般索引normal index最大的差异是在索引列上增加一层唯一约束。添加唯一索引的数据列可以为空,但是只要尊在数据值,就必须是唯一的。

联系:1)unique index就是额外添加唯一性的约束。该约束严格的保证索引列的取值是唯一的,这在一些数据列上的业务约束是很重要的功能。比如一个数据列,不能作为主键,而且允许为空,但是业务上要求唯一特性,这个时候用唯一性索引就是最好的旋转。2)性能上两者并无很大区别。

using index用法

create primary key …. Using index :创建主键的时候同时将其设为索引,名称与主键名称相同。

在9i之后,在创建一个PK的时候,会自动创建一个与之对应的唯一索引。(因为某个字段如果被设置为Unique便会自动被设为索引)。如果不特别指定,这个索引的表空间和表的表空间是一样的,但是不建议将两者放在一起。

一般语句格式:

1
2
3
Create table test( name varchar (10));
Alter test add primary key ( name ) tablespace tablespace1;

以上的处理方式有两个不好的地方,第一是无法指定索引的名称,第二无法指定索引存放的表空间。为了避免这种错误,最后按照以下方式来定义表格与表空间。

3
4
5
test_uid( (10),
Constraint test_uid_pk ) using index (
create unique uid_test_uid on ) tablespace tablespace2);

当然也可以部分处理。

testone ((10char)) tablespace1;
testone constraint pk_testine1 tablespace tablespace2;

作为一个好习惯,不要把索引和表格的数据放在同一个表空间。

一般索引单独建一个表空间。

原文地址:https://www.jb51.cc/oracle/209260.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐