zoukankan      html  css  js  c++  java
  • oracle 的索引

    一、索引分类

         按逻辑分:

           单列索引(Single column): 

              单列索引是基于单列所创建的索引

           复合(多列)索引(Concatenated ):

              复合索引是基于两列或者多列所创建的索引

           唯一索引(Unique ):

              唯一索引是索引列值不能重复的索引。

           非唯一索引(NonUnique ):

               非唯一索引是索引列可以重复的索引。

           函数索引(Function-based):

               Oracle中不仅能够直接对表中的列创建索引,还可以对包含列的函数或表达式创建索引,这种索引称为“位图索引”。         

           域索引(Domain): 

             域索引实际为用户自定义索引,域索引主要对存储在数据库中的媒体,图像数据进行索引,这些数据在oracle中基本上以BLOB类型存储,不同的应用存储格式也不同,           oracle不可能提供某一种现成的算法对这些数据进行索引,为了能够对这些类型数据快速访问,oracle提供了现成的接口函数,用户可以针对自己的数据格式实现这些接口函数,以达到对这些数据的快速访问。

        按物理分:

          分区索引(Partitioned):

              表分区后其上建立的索引与普通表建立的索引不同,其索引是分区索引。

              分区表上的索引分为2类,即局部索引全局索引            

    局部索引local index

    • 局部索引一定是分区索引,分区键等同于表的分区键,分区数等同于表的分区数,一句话,局部索引的分区机制和表的分区机制一样。
    • 如果局部索引的索引列以分区键开头,则称为前缀局部索引。
    • 如果局部索引的列不是以分区键开头,或者不包含分区键列,则称为非前缀索引。
    • 局部索引只能依附于分区表上
    • 前缀和非前缀索引都可以支持索引分区消除,前提是查询的条件中包含索引分区键。
    • 局部索引只支持分区内的唯一性,无法支持表上的唯一性,因此如果要用局部索引去给表做唯一性约束,则约束中必须要包括分区键列。
    • 局部分区索引是对单个分区的,每个分区索引只指向一个表分区;全局索引则不然,一个分区索引能指向n个表分区,同时,一个表分区,也可能指向n个索引分区,对分区表中的某个分区做truncate或者move,shrink等,可能会影响到n个全局索引分区,正因为这点,局部分区索引具有更高的可用性。
    • 位图索引只能为局部分区索引
    • 局部索引多应用于数据仓库环境中

    全局索引global index

    • 全局索引的分区键和分区数和表的分区键和分区数可能都不相同,表和全局索引的分区机制不一样。
    • 全局索引可以分区,也可以是不分区索引,全局索引必须是前缀索引,即全局索引的索引列必须是以索引分区键作为其前几列。
    • 全局索引可以依附于分区表;也可以依附于非分区表
    • 全局分区索引的索引条目可能指向若干个分区,因此,对于全局分区索引,即使只截断一个分区中的数据,都需要rebulid若干个分区甚至是整个索引。
    • 全局索引多应用于oltp系统中
    • 全局分区索引只按范围或者散列分区,hash分区是10g以后才支持
    • oracle9i以后对分区表做move或者truncate的时可以用update global indexes语句来同步更新全局分区索引,用消耗一定资源来换取高度的可用性。
    • 表用a列作分区,索引用b做局部分区索引,若where条件中用b来查询,那么oracle会扫描所有的表和索引的分区,成本会比分区更高,此时可以考虑用b做全局分区索引。

          非分区索引(NonPartitioned):

               普通表上建立的索引。

          B树索引(B-tree):

                B树索引所函以下两种索引;

                B树索引是按B树算法组织并存放索引数据的,所以B树索引主要依赖其组织并存放索引数据的算法来实现快速检索功能。
                正常型B树(Normal):

                  适合于大量的增、删、改(OLTP);不能用包含OR操作符的查询;适合高基数的列(唯一值多)典型的树状结构;每个结点都是数据块;大多都是物理上一层、两层或三层不定,逻辑上三层;叶子块数据是排序的,从左向右递增;在分支块和根块中放的是索引的范围;

                反转型B树 (Rever Key):

                  适用于 OPS 或 RAC 环境;反转了索引码中每列的字节,降低索引叶块的争用;

         位图索引(Bitmap):

             位图索引在多列查询时,可以对两个列上的位图进行AND和OR操作,达到更好的查询效果。

             适合于决策支持系统;做UPDATE代价非常高;非常适合OR操作符的查询;基数比较少的时候才能建位图索引;

    二、索引创建

         索引的创建语法

    CREATE UNIUQE | 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:可以对多列进行联合索引,当为expression时即“基于函数的索引”
    3)TABLESPACE:指定存放索引的表空间(索引和原表不在一个表空间时效率更高)
    4)STORAGE:可进一步设置表空间的存储参数
    5)LOGGING | NOLOGGING:是否对索引产生重做日志(对大表尽量使用NOLOGGING来减少占用空间并提高效率)
    6)COMPUTE STATISTICS:创建新索引时收集统计信息
    7)NOCOMPRESS | COMPRESS<nn>:是否使用“键压缩”(使用键压缩可以删除一个键列中出现的重复值)
    8)NOSORT | REVERSE:NOSORT表示与表中相同的顺序创建索引,REVERSE表示相反顺序存储索引值
    9)PARTITION | NOPARTITION:可以在分区表和未分区表上对创建的索引进行分区

         单列索引

     create index 索引名 on 表名 (列名) tablespace 表空间名;
    
    CREATE INDEX idx_of_imsi ON uim_auth_file(imsi) TABLESPACE users;

         复合索引

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

         唯一索引

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

       反向键索引

    CREATE INDEX 索引名 ON 表名 (列名) reverseTABLESPACE 表空间名;
    
    CREATE INDEX idx_of_imsi ON uim_auth_file(imsi) reverse TABLESPACE users;

       分区索引实例

    --1、建分区表  
    CREATE TABLE P_TAB(  
     C1 INT,  
     C2 VARCHAR2(16),  
     C3 VARCHAR2(64),  
     C4 INT ,  
     CONSTRAINT PK_PT PRIMARY KEY (C1)  
    )  
    PARTITION BY RANGE(C1)(  
     PARTITION P1 VALUES LESS THAN (10000000),  
     PARTITION P2 VALUES LESS THAN (20000000),  
     PARTITION P3 VALUES LESS THAN (30000000),  
     PARTITION P4 VALUES LESS THAN (MAXVALUE)  
    );  
    --2、建全局索引(分区-》对索引分区)  
    CREATE INDEX IDX_PT_C4 ON P_TAB(C4) GLOBAL PARTITION BY RANGE(C4)  
    (  
     PARTITION IP1 VALUES LESS THAN(10000),  
     PARTITION IP2 VALUES LESS THAN(20000),  
     PARTITION IP3 VALUES LESS THAN(MAXVALUE)  
    );  
    --3、建本地(分区索引) (local index分区别索引)  
    CREATE INDEX IDX_PT_C2 ON P_TAB(C2) LOCAL (PARTITION P1,PARTITION P2,PARTITION P3,PARTITION P4);  
    --4、建全局(分区索引)(global index与分区表分区规则相同的列上)  
    CREATE INDEX IDX_PT_C1  
    ON P_TAB(C1)  
    GLOBAL PARTITION BY RANGE (C1)  
    (  
     PARTITION IP01 VALUES LESS THAN (10000000),  
     PARTITION IP02 VALUES LESS THAN (20000000),  
     PARTITION IP03 VALUES LESS THAN (30000000),  
     PARTITION IP04 VALUES LESS THAN (MAXVALUE)  
    );  
    --5、分区索引数据字典查看  
    SELECT * FROM USER_IND_PARTITIONS;  
    SELECT * FROM USER_PART_INDEXES;  
  • 相关阅读:
    Apollo服务搭建
    常用MIME类型
    eclipse 搭建 swagger-ui(maven项目 springboot框架)
    子页面iframe跨域执行父页面定义的JS方法
    SpringBoot 实现前后端分离的跨域访问(CORS)
    使用 QueryRunner 实现 JDBC 常用操作封装
    纯Java版本的JDBC基础操作,支持查询结果到泛型实体类的转换
    javascript_鼠标划词,弹出选取的词
    js获取url参数值
    纯CSS打造的下拉菜单
  • 原文地址:https://www.cnblogs.com/feiyun126/p/3164533.html
Copyright © 2011-2022 走看看