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(表名 空格 索引名)。

   --如果表用了别名,注释里的表也要使用别名。

    

posted on 2019-03-07 11:07  kingle-l  阅读(396)  评论(0编辑  收藏  举报

levels of contents