oracle 基础知识(十二)----索引
一, 索引介绍
索引与表一样,也属于段(segment)的一种。里面存放了用户的数据,跟表一样需要占用磁盘空间。索引是一种允许直接访问数据表中某一数据行的树型结构,为了提高查询效率而引入,是一个独立于表的对象,可以存放在与表不同的表空间中。索引记录中存有索引关键字和指向表中数据的指针(地址)。对索引进行的I/O操作比对表进行操作要少很多。索引一旦被建立就将被Oracle系统自动维护,查询语句中不用指定使用哪个索引.
二,索引语法
create or replace unique|bitmap index <schema>.<index_name> on <schema>.<table_name> (<column_name>|<expression> asc|desc , <column_name>|<expression> asc|desc ...) tablespace <tablespace_name> storage <storage_settings> logging|nologging compute statistics nocompress|compress<nn> nosort|reverse partition|global partition<partition_setting>
1 unique|bitmap : unique表示唯一值索引,bitmap表示位图索引,为空则默认为B-tree索引 2 column_name|expression asc|desc , ... :可以单列索引,也可以多列进行联合索引,当为 3 tablespace : 制定存放索引的表空间(当表和索引在不同的表空间的时候,效率更高) 4 storage : 可以设置表空间的存储参数 5 logging|nologging : 是否对索引产生redolog(对于大表来说,可以设置为nologging从而来减少空间占用,提高效率) 6 compute statistics : 设置为创建索引时,收集统计信息 7 nocompress|compressnn : 是否使用“键压缩”(使用键压缩可以删除一个键列中出现的重复值) 8 nosort|reverse : nosort表示与表中相同的顺序进行创建索引,reverse表示使用与表中相反的顺序进行创建索引 9 partition|nopartition|global partition : 可以在分区表上和未分区表上对创建的索引进行分区
三,索引优缺点
优点:
🎄大大加快检索数据的速度
🎋通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性
🎍加速表与表之间的连接
🎑查询语句汇总含有分组或者排序的语句时,速度更快
⛳查询的过程中,使用索引,使用优化隐藏器,从而提高系统的性能
缺点:
🏟创建和维护索引,比较耗费时间,随着数据量的增大而增大
🏛创建索引,占一定的物理空间(聚簇索引,占用空间会更大)你可能发现过了特别久索引会比数据大
🏗在对表进行增删改的时候,索引相应的也需要进行动态的更新
适合:
🏘经常需要搜索的列上,
🏙主键,一般建立唯一性索引,保持数据的唯一性
🌍外键,提高表与表之间连接的速度
🛰需要排序的列上
🌧where子句后边经常出现的字段
🚛经常需要根据范围进行搜索的列上,比如日期
不适合:
🐕很少进行搜索的列上
🐈列取值比较少的列上
🐅blob类型的列上
🐆修改频率比较高的列上
四, 索引结构
B-tree:
适合与大量的增、删、改(OLTP);
不能用包含OR操作符的查询;
适合高基数的列(唯一值多)
典型的树状结构;
每个结点都是数据块;
大多都是物理上一层、两层或三层不定,逻辑上三层;
叶子块数据是排序的,从左向右递增;
在分支块和根块中放的是索引的范围;
Bitmap:
适合与决策支持系统;
做UPDATE代价非常高;
非常适合OR操作符的查询;
基数比较少的时候才能建位图索引;
树型结构:
索引头
开始ROWID,结束ROWID(先列出索引的最大范围)
五,索引类型
唯一索引
当建立Primary Key(主键)或者Unique constraint(唯一约束)时,唯一索引将被自动建立
组合索引
组合索引中列的顺序是任意的,也无需相邻。但是建议将最频繁访问的列放在列表的最前面,当两个或多个列经常一起出现在where条件中时,则在这些列上同时创建组合索引
位图索引
列中有非常多的重复的值时候。例如某列保存了 “性别”信息。Where 条件中包含了很多OR操作符。较少的update操作,因为要相应的跟新所有的bitmap
基于函数的索引
在WHERE条件语句中包含函数或者表达式时, 函数包括:算数表达式、PL/SQL函数、程序包函数、SQL函数、用户自定义函数。
反向键索引
索引值是一个自动增长的列.多个用户对集中在少数块上的索引行进行修改,容易引起资源的争用,比如对数据块的等待。此时建立反向索 引。
键压缩索引
索引键压缩的是可以减小索引的大小,从而减少IO量,使扫描索引时效率更高,压缩的条件是索引的前导列或者前几个索引字段是有重复的(当然这个索引肯定是多键值索引)
分区索引
Locally partitioned index(局部分区索引)
局部分区索引随表对索引完成相应的分区(即索引会使用与底层表相同的机制分区),每个表分区都有一个索引分区,并且只索引该表分区。
局部分区索引又分为两类:
Local prefixed index(局部前缀索引)
Local nonprefixed index(局部非前缀索引)
局部前缀索引:以分区键作为索引定义的第一列
局部非前缀索引:分区键没有作为索引定义的第一列
Globally partitioned index(全局分区索引)
全局分区索引,顾名思义,就是针对整个表空间(全局)来说的。索引按范围(Range)或散列(Hash,Oracle 10g中引入)进行分区,一个分区索引(全局)可能指向任何(或全部的)表分区。
使用:
1) 数据仓库
许多数据仓库系统都存在大量的数据出入,如典型的数据“滑入滑出”(即删除表中最旧的分区,并为新加载的数据增加一个新分区);这个过程涉及:
- 去除老数据:最旧的分区要么被删除,要么与一个空表交换(将最旧的分区变为一个表),从而允许对旧数据进行归档;
- 加载新数据并建立索引:将新数据加载到一个“工作”表中,建立索引并进行验证;
- 关联新数据:一旦加载并处理了新数据,数据所在的表会与分区表中的一个空分区交换,将表中的这些新加载的数据变成分区表中的一个分区(分区表会变得更大)
2) OLTP系统
OLTP系统的特点是会频繁出现许多小的读写事务,一般在OLTP系统中,首要的是需要快速访问所需的行,其次数据的完整性、可用性也非常重要。
在OLTP系统中,很多情况下全局索引很有意义,比如当表按一列分区后,你可能还需要通过其他列来快速访问数据,如此便可以考虑在这些列上建立全局索引。
强制走索引
在一些场景.oracle 不自动走索引,你又对数据业务逻辑十分的熟悉,查看数据它走全表索引的话,手动强制来一波索引!!
使用强制索引,在SELECT 后面加上/*.......*/ 中间加上索引的属性,
SELECT /*+index(dg pk_emp)*/* FROM EMP DG;
--强制索引,/*.....*/第一个星星后不能有空格,里边内容结构为:加号index(表名 空格 索引名)。
--如果表用了别名,注释里的表也要使用别名。