精华内容
下载资源
问答
  • oracle 位图索引

    2019-01-16 13:34:00
    主要针对大量相同值的列而创建,比如(性别、婚配等字段可选值很少的字段创建位图索引); 位图索引非常适合于决策支持系统(Decision Support System,DSS)和数据仓库,它们不应该用于通过事务处理应用程序访问的表...
    位图索引是一种使用位图的特殊数据库索引。主要针对大量相同值的列而创建,比如(性别、婚配等字段可选值很少的字段创建位图索引);

    位图索引非常适合于决策支持系统(Decision Support System,DSS)和数据仓库,它们不应该用于通过事务处理应用程序访问的表。它们可以使用较少到中等基数(不同值的数量)的列访问非常大的表;

    索引块的一个索引行中存储键值和起止Rowid,以及这些键值的位置编码,

    位置编码中的每一位表示键值对应的数据行的有无.一个块可能指向的是几十甚至成百上千行数据的位置.
    这种方式存储数据,相对于B*Tree索引,占用的空间非常小,创建和使用非常快
    当根据键值查询时,可以根据起始Rowid和位图状态,快速定位数据.
    创建语法很简单,就是在普通索引创建的语法中index前加关键字bitmap即可,例如:
     
    位图索引的特点:
    1.Bitmap索引的存储空间
    相对于B*Tree索引,位图索引由于只存储键值的起止Rowid和位图,占用的空间非常少.
    bitmap的空间占用主要跟以下4个因素相关:
    a.表的总记录数
    b.索引列的键值多少,列的不同值越少,所需的位图就越少.
    c.操作的类型,批量插入比单条插入所需的位图要少得多,8i,9i下是这样的,10G则没有这种区别,详见后面的分析.
    d.索引列相同键值的物理分布,8i,9i中,不同块上的数据,相同的键值,会建立不同的位图行(段)来表示
    注:本文提到的8i,9i,10g,我试验的环境是8.1.7,9.2.0.5,10.2
    2.Bitmap索引创建的速度
    位图索引创建时不需要排序,并且按位存储,所需的空间也少.
    B*Tree索引则在创建时需要排序,定位等操作,速度要慢得多.
    3.Bitmap索引允许键值为空
    B*Tree索引由于不记录空值,当基于is null的查询时,会使用全表扫描,
    而对位图索引列进行is null查询时,则可以使用索引.
    4.Bitmap索引对表记录的高效访问
    当使用count(XX),可以直接访问索引就快速得出统计数据.
    当根据位图索引的列进行and,or或 in(x,y,..)查询时,直接用索引的位图进行或运算,在访问数据之前可事先过滤数据.
    5.Bitmap索引对批量DML操作只需进行一次索引
    由于通过位图反映数据情况,批量操作时对索引的更新速度比B*Tree索引一行一行的处理快得多.
    6.Bitmap索引的锁机制
    对于B*Tree索引,insert操作不会锁定其它会话的DML操作.
    位图索引,由于用位图反映数据,不同会话更新相同键值的同一位图段,insert、update、delete相互操作都会发锁定。
     
     
     

    技巧:

    对于有较低基数的列需要使用位图索引。性别列就是这样一个例子,它有两个可能值:男或女(基数仅为2)。位图对于低基数(少量的不同值)列来说非常快,这是因为索引的尺寸相对于B树索引来说小了很多。因为这些索引是低基数的B树索引,

    所以非常小,因此您可以经常检索表中超过半数的行,并且仍使用位图索引。

    当大多数条目不会向位图添加新的值时,位图索引在批处理(单用户)操作中加载表(插入操作)方面通常要比B树做得好。当多个会话同时向表中插入行时不应该使用位图索引,在大多数事务处理应用程序中都会发生这种情况。

    技巧:

    如果要查询位图索引列表,可以在USER _INDEXES视图中查询index_type列。

    建议不要在一些联机事务处理(OLTP)应用程序中使用位图索引。B树索引的索引值中包含ROWID,这样Oracle就可以在行级别上锁定索引。

    位图索引存储为压缩的索引值,其中包含了一定范围的ROWID,因此Oracle必须针对一个给定值锁定所有范围内的ROWID。这种锁定类型可能在某些DML语句中造成死锁。SELECT语句不会受到这种锁定问题的影响。

    位图索引有很多限制,如下所示:

      • 基于规则的优化器不会考虑位图索引。
      • 当执行ALTER TABLE语句并修改包含有位图索引的列时,会使位图索引失效。
      • 位图索引不包含任何列数据,并且不能用于任何类型的完整性检查。
      • 位图索引不能被声明为唯一索引。
      • 位图索引的最大长度为30。

    技巧:

    不要在繁重的OLTP环境中使用位图索引

     

    转载于:https://www.cnblogs.com/leewi/p/10276537.html

    展开全文
  • Oracle 位图索引

    2014-07-20 11:12:00
    1.位图索引 1.1位图索引使用注意事项; 1.2使用位图索引; 1.3位图索引对DML操作的影响; 2.位图连接索引 2.1明确需求后使用位图索引; 2.1创建位图连接索引的注意事项: 1.位图索引: 1.1位图索引使用注意事项:...

    内容简介:

    1.位图索引

    1.1位图索引使用注意事项;

    1.2 使用位图索引;

    1.3 位图索引对DML操作的影响;

    2.位图连接索引

    2.1 明确需求后使用位图索引;

    2.1创建位图连接索引的注意事项:

     

    1.位图索引:

    1.1位图索引使用注意事项:

    ❏ 一般适用于低基数列;

     适合数据仓库;

     对于启用位图索引的表,应尽量减少或避免DML操作;

     如果对一张含有多列位图索引的表进行大量DML操作,应考虑将位图索引删除,DML操作结束后重建位图索引;

     不适用于频繁持续发生DML操作的OLTP系统,会出现行锁定,阻碍更新性能;


    1.2 使用位图索引

    位图索引与B-TREE索引有很大的不同,一个位图索引由多个位串组成,每个位串都表示基础列中一个独立的有效值;每个位串是打开或关闭,表示该值是否用于某一行;人员信息表th03 为例,性别(gender)字段的值(男、女、未记录),假如为其创建位图索引,那么每个位串(男、女、未记录)中的单个位表示一个给定行的值是男、女还是未记录;当判断某一列是否适合创建位图索引时,需要考虑是否符合”低基数列”,根据应用程序、数据组成以及数据库中的表的情况不同,是否创建位图索引的结论也可能不同;通常用来判断的一条基本经验法则是:”如果该列的有效值数目不足表中行数的1%,那么它就适合创建位图索引,th03来说,表行数为:500万行,而性别列的有效值数目仅为3( 男、女、未记录),可以确定它适合创建位图索引:

    人员信息表(th03)

     

    ID

    NAME

    GENDER

    IDCARD

    HOMEADDR

    JOBNO

    BIRTHDATE

    1

    998698

    李天

    440623197007253619

    水晶洞1

    526456

    25-JUL-70

    2

    998699

    李花

    510802197007251223

    水晶洞2

    5785452

    25-JUL-70

    3

    584625

    李某

    未记录

    564551545265642155

    水晶洞3

    1565452

    01-JUL-88

     

    SQL> create bitmap index ind_th03_gender on th03(gender) tablespace tbs03;

    Index created.

    Elapsed: 00:00:01.05

    SQL> execute dbms_stats.gather_table_stats('sywu','th03',cascade=>true);

    PL/SQL procedure successfully completed.

    Elapsed: 00:00:04.31

    SQL> @/oracle/getind

    TABLE_NAME INDEX_NAME COLUMN_NAME   SIZE_GB INDEX_TY STATUS COMPRESS NUM_ROWS DISTINCT_KEYS

    ------------------------------ ------------------------------ ------------------------------ ---------- -------- -------- --------- ---------- -------- ---------- ----

    TH03 IND_TH03_GENDER GENDER   .001953125 BITMAP VALID DISABLED 453 3

    位图索引的创建非常快并且占用的空间也非常小;位图索引和B-TREE索引存储值的方式不同,它存储表中的每一行值(包括空值),对于B-TREE索引,单列索引不存储空值,复合索引只要有一个非空值就可以存储;所以当执行 IS NULL 或者 IS NOT NULL 查询时位图索引的效率要高于B-TREE索引:

    SQL> select count(*) from th03 where gender is null;

    -----------------------------------------------------------------------------------------------

    | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |

    -----------------------------------------------------------------------------------------------

    | 0 | SELECT STATEMENT | | 1 | 5 | 1 (0)| 00:00:01 |

    | 1 | SORT AGGREGATE | | 1 | 5 | | |

    | 2 | BITMAP CONVERSION COUNT | | 1 | 5 | 1 (0)| 00:00:01 |

    |* 3 | BITMAP INDEX SINGLE VALUE| IND_TH03_GENDER | | | | |

    3 - access("GENDER" IS NULL)

    Statistics

    ----------------------------------------------------------

    1 recursive calls

    0 db block gets

    2 consistent gets

    1 physical reads

    如果在相同表相同列建立B-TREE索引,则该执行必须全表扫描:

    SQL> select count(*) from th03 where gender is null;

    ---------------------------------------------------------------------------

    | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |

    ---------------------------------------------------------------------------

    | 0 | SELECT STATEMENT | | 1 | 5 | 14908 (1)| 00:02:59 |

    | 1 | SORT AGGREGATE | | 1 | 5 | | |

    |* 2 | TABLE ACCESS FULL| TH03 | 1 | 5 | 14908 (1)| 00:02:59 |

    ---------------------------------------------------------------------------

    Predicate Information (identified by operation id):

    ---------------------------------------------------

    2 - filter("GENDER" IS NULL)

    Statistics

    ----------------------------------------------------------

    1 recursive calls

    0 db block gets

    54574 consistent gets

    54562 physical reads

    位图索引还可以在另外一些情况使用,如使用聚合函数:

    SQL> select count(*),count(gender) from th03;

    COUNT(*) COUNT(GENDER)

    ---------- -------------

    5000000 5000000

    -------------------------------------------------------------------------------------------------

    | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |

    -------------------------------------------------------------------------------------------------

    | 0 | SELECT STATEMENT | | 1 | 5 | 203 (0)| 00:00:03 |

    | 1 | SORT AGGREGATE | | 1 | 5 | | |

    | 2 | BITMAP CONVERSION TO ROWIDS | | 5000K| 23M| 203 (0)| 00:00:03 |

    | 3 | BITMAP INDEX FAST FULL SCAN| IND_TH03_GENDER | | | | |

    -------------------------------------------------------------------------------------------------

    Statistics

    ----------------------------------------------------------

    0 recursive calls

    0 db block gets

    232 consistent gets

    0 physical reads

    如果你决定在应用程序中实现位图索引,应时不时的检查建立了位图索引的列的数据组成,这一点很重要,如果你算错了包含位图索引的任何列的基数,可能会对应用程序造成负面影响,(位图索引的存储空间会增加、查询性能会降低、重建索引的时间将增加);

    1.3 位图索引对DML操作的影响:

    为了便于测试,我创建另一张分区表 th04,并为th04的性别、出生日期列创建位图索引,最后向它插入100万行数据:

    SQL> create table th04

    partition by range(id)(

    partition th04_part1 values less than(1000000) tablespace tbs03,

    partition th04_part2 values less than(2000000) tablespace tbs03,

    partition th04_part3 values less than(3000000) tablespace tbs03,

    partition th04_part4 values less than(4000000) tablespace tbs03,

    partition th04_part5 values less than(5000000) tablespace tbs03,

    partition th04_part6 values less than(maxvalue) tablespace tbs03

    ) as select * from tbbase where 1=0 ;

    SQL> create bitmap index ind_th04_gender on th04(gender) local tablespace tbs03;

    SQL> create bitmap index ind_th04_birthdate on th04(birthdate) local tablespace tbs03;

    SQL>insert into th04 select * from tbbase where rownum<1000001;

    1000000 rows created.

    Elapsed: 00:00:40.24

    从结果可以看出,插入100万行的数据花费40,从表面上看花费的时间似乎是合理的,但当数据量不断增加时,特别对于一个数据仓库环境,一天处理几百万甚至亿行数据是司空见惯的,合理的情况应考虑删除位图索引(如果是分区表则将目标分区标记为不可用),执行完DML加载操作后重建位图索引;

    SQL> alter index IND_TH04_GENDER unusable;

    SQL> alter index IND_TH04_BIRTHDATE unusable;

    SQL> insert into th04 select * from tbbase where rownum<1000001;

    禁用位图索引后,插入100万行数据只花费23 ,对于大数据而言这或许可以提高装载数据的性能;数据装载结束后重建位图索引:

    SQL> alter index ind_th04_gender rebuild partition TH04_PART1;

    alter index ind_th04_gender rebuild partition TH04_PART2;

    alter index ind_th04_gender rebuild partition TH04_PART3;

    alter index ind_th04_gender rebuild partition TH04_PART4;

    alter index ind_th04_gender rebuild partition TH04_PART5;

    alter index ind_th04_gender rebuild partition TH04_PART6;

    alter index ind_th04_birthdate rebuild partition th04_part1;

    .........

    重建分区索引也可以通过下面的命令重建:

    SQL> alter table th04 modify partition th04_part1 rebuild unusable local indexes;

    此命令虽然简单,但它也有不足之处,对于一个指定的分区,它只能按顺序执行;而对于每一个指令发出的命令重建分区,它可以同时执行多个语句,实现并行重建索引;

    除装载数据的影响外,位图索引也会影响数据的DML操作,请观察下面的人员信息表数据:

    人员信息表(th04)

     

    ID

    NAME

    GENDER

    IDCARD

    HOMEADDR

    JOBNO

    BIRTHDATE

    1

    998698

    李天

    440623197007253619

    水晶洞1

    526456

    25-JUL-70

    2

    998699

    李四

    510802197007251223

    水晶洞2

    5785452

    25-JUL-70

    .....

    ....

     

     

     

     

     

     

     

    数据显示他们的出生日期是相同的,并且出生日期列(BIRTHDATE)还建立了位图索引( IND_TH04_BIRTHDATE) ,因业务错误记录两人的出生日期,so,现在对其修改:

    ---session 1-----

    SQL> select distinct sid from v$mystat;

    SID

    ----------

    191

    SQL> update th04 set birthdate='26-JUL-70' where idcard='440623197007253619';

    1 row updated.

    此时session 1 的用户因为业务繁忙没有及时提交,这时另一个业务员在新的会话 session2中修该另一个错误记录:

    ----session 2 -----

    SQL> select distinct sid from v$mystat;

    SID

    ----------

    194

    SQL> update th04 set birthdate='27-JUL-70' where idcard='510802197007251223';

    session 2 中的用户会一直处于等待状态,因为他们修改的错误人员出生日期在更新之前在同一个位图索引位串中,当修改位串中的位信息时位串会被锁定,直到更新提交后更新位串中的位值;观察此时的锁状态:

    SQL>select sid,type,id1,id2,lmode,request,ctime,block from v$lock where sid in(191,194) order by sid

    SID TY ID1 ID2 LMODE REQUEST CTIME BLOCK

    ---------- -- ---------- ---------- ---------- ---------- ---------- ----------

    191 AE 100 0 4 0 2052 0

    191 TM 75667 0 3 0 263 0

    191 TX 65562 848 6 0 263 1

    191 TM 75668 0 3 0 263 0

    191 TO 65927 1 3 0 286 0

    194 TM 75668 0 3 0 238 0

    194 TX 131081 1071 6 0 238 0

    194 TM 75667 0 3 0 238 0

    194 TX 65562 848 0 4 238 0

    194 AE 100 0 4 0 1406 0

    对于session 1(191)此时持有一个6级事务锁,并且堵塞session 2(194),它们请求的资源是一样的,这并非巧合;只有当session 1(191)提交或回退后,这个6级事物锁才会被释放,session 2(194)才能持有锁修改数据;

    SID TY ID1 ID2 LMODE REQUEST CTIME BLOCK

    ---------- -- ---------- ---------- ---------- ---------- ---------- ----------

    191 AE 100 0 4 0 2832 0

    191 TO 65927 1 3 0 1066 0

    194 TX 131081 1071 6 0 1018 0

    194 TM 75667 0 3 0 1018 0

    194 TM 75668 0 3 0 1018 0

    194 AE 100 0 4 0 2186 0

    所以建立位图索引时,应仔细分析表结构和表数据,作出明智、合理选择;以上测试因环境、版本、数据库状态测试结果可能不同;

     

    转载于:https://www.cnblogs.com/zwl715/p/3855990.html

    展开全文
  • ORACLE位图索引

    2013-12-28 22:16:00
    1.位图索引 1.1位图索引使用注意事项; 1.2 使用位图索引; 1.3 位图索引对DML操作的影响; 2.位图连接索引 2.1 明确需求后使用位图索引; 2.1创建位图连接索引的注意事项: 1.位图索引: 1.1位图索引使用注意...

    内容简介:

    1.位图索引

    1.1位图索引使用注意事项;

    1.2 使用位图索引;

    1.3 位图索引对DML操作的影响;

    2.位图连接索引

    2.1 明确需求后使用位图索引;

    2.1创建位图连接索引的注意事项:

     

    1.位图索引:

    1.1位图索引使用注意事项:

    ❏ 一般适用于低基数列;

    适合数据仓库;

    对于启用位图索引的表,应尽量减少或避免DML操作;

    如果对一张含有多列位图索引的表进行大量DML操作,应考虑将位图索引删除,DML操作结束后重建位图索引;

    不适用于频繁持续发生DML操作的OLTP系统,会出现行锁定,阻碍更新性能;

    1.2 使用位图索引

    位图索引与B-TREE索引有很大的不同,一个位图索引由多个位串组成,每个位串都表示基础列中一个独立的有效值;每个位串是打开或关闭,表示该值是否用于某一行;人员信息表th03 为例,性别(gender)字段的值(男、女、未记录),假如为其创建位图索引,那么每个位串(男、女、未记录)中的单个位表示一个给定行的值是男、女还是未记录;当判断某一列是否适合创建位图索引时,需要考虑是否符合”低基数列”,根据应用程序、数据组成以及数据库中的表的情况不同,是否创建位图索引的结论也可能不同;通常用来判断的一条基本经验法则是:”如果该列的有效值数目不足表中行数的1%,那么它就适合创建位图索引,th03来说,表行数为:500万行,而性别列的有效值数目仅为3( 男、女、未记录),可以确定它适合创建位图索引:

    人员信息表(th03)

    ID

    NAME

    GENDER

    IDCARD

    HOMEADDR

    JOBNO

    BIRTHDATE

    1

    998698

    李天

    440623197007253619

    水晶洞1

    526456

    25-JUL-70

    2

    998699

    李花

    510802197007251223

    水晶洞2

    5785452

    25-JUL-70

    3

    584625

    李某

    未记录

    564551545265642155

    水晶洞3

    1565452

    01-JUL-88

    SQL> create bitmap index ind_th03_gender on th03(gender) tablespace tbs03;

    Index created.

    Elapsed: 00:00:01.05

    SQL> execute dbms_stats.gather_table_stats('sywu','th03',cascade=>true);

    PL/SQL procedure successfully completed.

    Elapsed: 00:00:04.31

    SQL> @/oracle/getind

    TABLE_NAME  INDEX_NAME  COLUMN_NAME   SIZE_GB  INDEX_TY  STATUS  NUM_ROWS  DISTINCT_KEYS

    ------------------------------ ------------------------------ ------------------------------ ---------- -------- -------- --------- --------

    TH03                 IND_TH03_GENDER   GENDER   .001953125   BITMAP    VALID     453    3

    位图索引的创建非常快并且占用的空间也非常小;位图索引和B-TREE索引存储值的方式不同,它存储表中的每一行值(包括空值),对于B-TREE索引,单列索引不存储空值,复合索引只要有一个非空值就可以存储;所以当执行 IS NULL 或者 IS NOT NULL 查询时位图索引的效率要高于B-TREE索引:

    SQL> select count(*) from th03 where gender is null;

    Elapsed: 00:00:00.03

    -----------------------------------------------------------------------------------------------

    | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |

    -----------------------------------------------------------------------------------------------

    | 0 | SELECT STATEMENT | | 1 | 5 | 1 (0)| 00:00:01 |

    | 1 | SORT AGGREGATE | | 1 | 5 | | |

    | 2 | BITMAP CONVERSION COUNT | | 1 | 5 | 1 (0)| 00:00:01 |

    |* 3 | BITMAP INDEX SINGLE VALUE| IND_TH03_GENDER | | | | |

    -----------------------------------------------------------------------------------------------

    Predicate Information (identified by operation id):

    ---------------------------------------------------

    3 - access("GENDER" IS NULL)

    Statistics

    ----------------------------------------------------------

    1 recursive calls

    0 db block gets

    2 consistent gets

    1 physical reads

    如果在相同表相同列建立B-TREE索引,则该执行必须全表扫描:

    SQL> select count(*) from th03 where gender is null;

    Elapsed: 00:00:00.16

    ---------------------------------------------------------------------------

    | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |

    ---------------------------------------------------------------------------

    | 0 | SELECT STATEMENT | | 1 | 5 | 14908 (1)| 00:02:59 |

    | 1 | SORT AGGREGATE | | 1 | 5 | | |

    |* 2 | TABLE ACCESS FULL| TH03 | 1 | 5 | 14908 (1)| 00:02:59 |

    ---------------------------------------------------------------------------

    Predicate Information (identified by operation id):

    ---------------------------------------------------

    2 - filter("GENDER" IS NULL)

    Statistics

    ----------------------------------------------------------

    1 recursive calls

    0 db block gets

    54574 consistent gets

    54562 physical reads

    位图索引还可以在另外一些情况使用,如使用聚合函数:

    SQL> select count(*),count(gender) from th03;

    COUNT(*) COUNT(GENDER)

    ---------- -------------

    5000000 5000000

    Elapsed: 00:00:00.11

    -------------------------------------------------------------------------------------------------

    | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |

    -------------------------------------------------------------------------------------------------

    | 0 | SELECT STATEMENT | | 1 | 5 | 203 (0)| 00:00:03 |

    | 1 | SORT AGGREGATE | | 1 | 5 | | |

    | 2 | BITMAP CONVERSION TO ROWIDS | | 5000K| 23M| 203 (0)| 00:00:03 |

    | 3 | BITMAP INDEX FAST FULL SCAN| IND_TH03_GENDER | | | | |

    -------------------------------------------------------------------------------------------------

    Statistics

    ----------------------------------------------------------

    0 recursive calls

    0 db block gets

    232 consistent gets

    0 physical reads

    如果你决定在应用程序中实现位图索引,应时不时的检查建立了位图索引的列的数据组成,这一点很重要,如果你算错了包含位图索引的任何列的基数,可能会对应用程序造成负面影响,(位图索引的存储空间会增加、查询性能会降低、重建索引的时间将增加);

    1.3 位图索引对DML操作的影响:

    为了便于测试,我创建另一张分区表 th04,并为th04的性别、出生日期列创建位图索引,最后向它插入100万行数据:

    SQL> create table th04

    partition by range(id)(

    partition th04_part1 values less than(1000000) tablespace tbs03,

    partition th04_part2 values less than(2000000) tablespace tbs03,

    partition th04_part3 values less than(3000000) tablespace tbs03,

    partition th04_part4 values less than(4000000) tablespace tbs03,

    partition th04_part5 values less than(5000000) tablespace tbs03,

    partition th04_part6 values less than(maxvalue) tablespace tbs03

    ) as select * from tbbase where 1=0 ;

    Table created.

    Elapsed: 00:00:00.04

    SQL> create bitmap index ind_th04_gender on th04(gender) local tablespace tbs03;

    Index created.

    Elapsed: 00:00:00.04

    SQL> create bitmap index ind_th04_birthdate on th04(birthdate) local tablespace tbs03;

    Index created.

    Elapsed: 00:00:00.09

    SQL>insert into th04 select * from tbbase where rownum<1000001;

    1000000 rows created.

    Elapsed: 00:00:40.24

    从结果可以看出,插入100万行的数据花费40,从表面上看花费的时间似乎是合理的,但当数据量不断增加时,特别对于一个数据仓库环境,一天处理几百万甚至亿行数据是司空见惯的,合理的情况应考虑删除位图索引(如果是分区表则将目标分区标记为不可用),执行完DML加载操作后重建位图索引;

    SQL> alter index IND_TH04_GENDER unusable;

    Index altered.

    Elapsed: 00:00:00.18

    SQL> alter index IND_TH04_BIRTHDATE unusable;

    Index altered.

    Elapsed: 00:00:00.41

    SQL> insert into th04 select * from tbbase where rownum<1000001;

    1000000 rows created.

    Elapsed: 00:00:23.74

    禁用位图索引后,插入100万行数据只花费23 ,对于大数据而言这或许可以提高装载数据的性能;数据装载结束后重建位图索引:

    SQL> alter index ind_th04_gender rebuild partition TH04_PART1;

    alter index ind_th04_gender rebuild partition TH04_PART2;

    alter index ind_th04_gender rebuild partition TH04_PART3;

    alter index ind_th04_gender rebuild partition TH04_PART4;

    alter index ind_th04_gender rebuild partition TH04_PART5;

    alter index ind_th04_gender rebuild partition TH04_PART6;

    alter index ind_th04_birthdate rebuild partition th04_part1;

    .........

    重建分区索引也可以通过下面的命令重建:

    SQL> alter table th04 modify partition th04_part1 rebuild unusable local indexes;

    Table altered.

    Elapsed: 00:00:05.81

    此命令虽然简单,但它也有不足之处,对于一个指定的分区,它只能按顺序执行;而对于每一个指令发出的命令重建分区,它可以同时执行多个语句,实现并行重建索引;

    除装载数据的影响外,位图索引也会影响数据的DML操作,请观察下面的人员信息表数据:

    人员信息表(th04)

    ID

    NAME

    GENDER

    IDCARD

    HOMEADDR

    JOBNO

    BIRTHDATE

    1

    998698

    李天

    440623197007253619

    水晶洞1

    526456

    25-JUL-70

    2

    998699

    李四

    510802197007251223

    水晶洞2

    5785452

    25-JUL-70

    .....

    ....







    数据显示他们的出生日期是相同的,并且出生日期列(BIRTHDATE)还建立了位图索引( IND_TH04_BIRTHDATE) ,因业务错误记录两人的出生日期,so,现在对其修改:

    ---session 1-----

    SQL> select distinct sid from v$mystat;

    SID

    ----------

    191

    SQL> update th04 set birthdate='26-JUL-70' where idcard='440623197007253619';

    1 row updated.

    Elapsed: 00:00:00.11

    此时session 1 的用户因为业务繁忙没有及时提交,这时另一个业务员在新的会话 session2中修该另一个错误记录:

    ----session 2 -----

    SQL> select distinct sid from v$mystat;

    SID

    ----------

    194

    SQL> update th04 set birthdate='27-JUL-70' where idcard='510802197007251223';

    session 2 中的用户会一直处于等待状态,因为他们修改的错误人员出生日期在更新之前在同一个位图索引位串中,当修改位串中的位信息时位串会被锁定,直到更新提交后更新位串中的位值;观察此时的锁状态:

    SQL>select sid,type,id1,id2,lmode,request,ctime,block from v$lock where sid in(191,194) order by sid

    SID TY ID1 ID2 LMODE REQUEST CTIME BLOCK

    ---------- -- ---------- ---------- ---------- ---------- ---------- ----------

    191 AE 100 0 4 0 2052 0

    191 TM 75667 0 3 0 263 0

    191 TX 65562 848 6 0 263 1

    191 TM 75668 0 3 0 263 0

    191 TO 65927 1 3 0 286 0

    194 TM 75668 0 3 0 238 0

    194 TX 131081 1071 6 0 238 0

    194 TM 75667 0 3 0 238 0

    194 TX 65562 848 0 4 238 0

    194 AE 100 0 4 0 1406 0

    对于session 1(191)此时持有一个6级事务锁,并且堵塞session 2(194),它们请求的资源是一样的,这并非巧合;只有当session 1(191)提交或回退后,这个6级事物锁才会被释放,session 2(194)才能持有锁修改数据;

    SID TY ID1 ID2 LMODE REQUEST CTIME BLOCK

    ---------- -- ---------- ---------- ---------- ---------- ---------- ----------

    191 AE 100 0 4 0 2832 0

    191 TO 65927 1 3 0 1066 0

    194 TX 131081 1071 6 0 1018 0

    194 TM 75667 0 3 0 1018 0

    194 TM 75668 0 3 0 1018 0

    194 AE 100 0 4 0 2186 0

    所以建立位图索引时,应仔细分析表结构和表数据,作出明智、合理选择;以上测试因环境、版本、数据库状态测试结果可能不同;


    2.位图连接索引

    2.1 明确需求后使用位图索引

    在创建位图连接索引时,它是两个表或多个表之间的索引值的连接,连接的结果存储在索引自身中;通过前期做连接并存储结果,当查询时通过扫描索引(避免两表或多表全表扫描)来获取数据,当然对于建立这样的索引,建立前需求必须明确; 请观察如下人员信息表(th04)和人员单位关系信息表(tbbsj)

    人员信息表(th04)

    ID

    NAME

    GENDER

    IDCARD

    HOMEADDR

    JOBNO

    BIRTHDATE

    1

    789524

    张三

    429005198911261805

    水晶洞1

    1300440

    05-AUG-79

    2

    564895

    李四

    429005198911296178

    水晶洞2

    1000209

    14-AUG-79

    .....

    ....








    人员单位关系信息表(tbbsj)

    ID(单位ID)

    IDCARD(人员身份证)

    DNAME(单位名称)

    JOINDATE(进入单位时间)

    SRZW(所任职位)

    GZZT(工作状态)

    TSGX(特殊贡献)

    1

    785652

    429005198911261805

    太空建筑有限公司

    2013-12-22 21:51:33

    总经理助理

    暂无

    2

    5689556

    429005198911296178

    飞轮实业有限公司

    2013-12-22 21:51:42

    总经理小秘

    暂无

    ..

    .....








    已知人员信息数据量为:100,人员单位关系信息数据量为:1106642,在建立普通索引的情况下获取人员IDCARD:429005198911261805 的人员单位信息:

    SQL> select t1.*,t2.* from th04 t1,tbbsj t2

    2 where t1.idcard=t2.idcard and t1.idcard='429005198911261805';

    ----------------------------------------------------------------------------------------------

    | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop |

    ----------------------------------------------------------------------------------------------

    | 0 | SELECT STATEMENT | | 1 | 253 | 10959 (1)| 00:02:12 | | |

    |* 1 | HASH JOIN | | 1 | 253 | 10959 (1)| 00:02:12 | | |

    | 2 | PARTITION RANGE ALL| | 1 | 65 | 2661 (1)| 00:00:32 | 1 | 6 |

    |* 3 | TABLE ACCESS FULL | TH04 | 1 | 65 | 2661 (1)| 00:00:32 | 1 | 6 |

    |* 4 | TABLE ACCESS FULL | TBBSJ | 1 | 188 | 8297 (1)| 00:01:40 | | |

    ----------------------------------------------------------------------------------------------

    Predicate Information (identified by operation id):

    ---------------------------------------------------

    1 - access("T1"."IDCARD"="T2"."IDCARD")

    3 - filter("T1"."IDCARD"='429005198911261805')

    4 - filter("T2"."IDCARD"='429005198911261805')

    Statistics

    ----------------------------------------------------------

    1 recursive calls

    0 db block gets

    40165 consistent gets

    40137 physical reads

    分析结果得知为获取IDCARD: 429005198911261805的人员单位信息,两张大表都做了全表扫描;因为获得人员单位关系信息需求已经明确,为其创建位图连接索引:

    SQL> create bitmap index ind_th04uniontbbsj on th04(t1.idcard)

    2 from th04 t1,tbbsj t2

    3 where t1.idcard=t2.idcard

    4 tablespace tbs03

    5* local

    SQL> /

    Index created.

    Elapsed: 00:00:01.65

    创建位图连接索引后再次查询:

    SQL> select t1.*,t2.* from th04 t1,tbbsj t2

    2* where t1.idcard=t2.idcard and t1.idcard='429005198911261805';

    -----------------------------------------------------------------------------------------------------------------

    | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop |

    -----------------------------------------------------------------------------------------------------------------

    | 0 | SELECT STATEMENT | | 1 | 253 | 5 (0)| 00:00:01 | | |

    | 1 | NESTED LOOPS | | 1 | 253 | 5 (0)| 00:00:01 | | |

    | 2 | TABLE ACCESS BY INDEX ROWID | TBBSJ | 1 | 188 | 3 (0)| 00:00:01 | | |

    |* 3 | INDEX UNIQUE SCAN | PK_IDCARD | 1 | | 2 (0)| 00:00:01 | | |

    | 4 | TABLE ACCESS BY GLOBAL INDEX ROWID| TH04 | 1 | 65 | 2 (0)| 00:00:01 | ROWID | ROWID |

    |* 5 | INDEX UNIQUE SCAN | CS_IDCARD | 1 | | 1 (0)| 00:00:01 | | |

    -----------------------------------------------------------------------------------------------------------------

    Predicate Information (identified by operation id):

    ---------------------------------------------------

    3 - access("T2"."IDCARD"='429005198911261805')

    5 - access("T1"."IDCARD"='429005198911261805')

    Statistics

    ----------------------------------------------------------

    0 recursive calls

    0 db block gets

    3 consistent gets

    0 physical reads

    对于位图连接索引,它将主导表和关联表中的ROWID以及主导列的列值存储在索引中,查询数据时通过扫描索引提高查询效率:

    人员信息表(TH04)ROWID

    人员单位关系信息表(tbbsj)ROWID

    IDCARD

    AAASdEAAGAAB6w6AAY

    AAASfXAAIAAAmCQAAE

    440621197102274116

    AAASdEAAGAAB6z5AAf

    AAASfXAAIAAAmCGAAX

    440621197311244423

    AAASdEAAGAAB6zCAAl

    AAASfXAAIAAAmCPAAW

    440621197405202427


    2.2创建位图连接索引的注意事项:

    2.2.1创建位图连接索引时WHERE 子句中的关联条件列必须是主键唯一约束(不符合条件会报错ORA-25954: missing primary key or unique constraint on dimension);

    2.2.2在指定索引列时,如果两表都具有相同列,必须使用表名.列名的方式指定或者别名.列名的方式指定(不符合条件会报错:ORA-00918: column ambiguously defined);

    2.2.3 创建位图索引同样DML操作效率差,建立前请仔细分析表结构和数据DML操作率;

    2.2.4 更新表数据时同样会有锁定主导表、关联表问题;




    转载于:https://www.cnblogs.com/lanston/p/3495864.html

    展开全文
  • Oracle位图索引

    千次阅读 2014-07-24 08:52:31
    位图索引主要针对大量相同值的列而创建(例如:类别,操作员,部门ID,库房ID等), 索引块的一个索引行中存储键值和起止Rowid,以及这些键值的位置编码, 位置编码中的每一位表示键值对应的数据行的有无.一个位图索引...
    一.什么是位图索引
    我们目前大量使用的索引一般主要是B*Tree索引,在索引结构中存储着键值和键值的RowID,并且是一一对应的.
    而位图索引主要针对大量相同值的列而创建(例如:类别,操作员,部门ID,库房ID等),
    索引块的一个索引行中存储键值和起止Rowid,以及这些键值的位置编码,
    位置编码中的每一位表示键值对应的数据行的有无.一个位图索引块可能指向的是几十甚至成百上千行数据的位置.

    这种方式存储数据,相对于B*Tree索引,占用的空间非常小,创建和使用非常快.

    当根据键值查询时,可以根据起始Rowid和位图状态,快速定位数据.
    当根据键值做and,or或 in(x,y,..)查询时,直接用索引的位图进行或运算,快速得出结果行数据.
    当select count(XX) 时,可以直接访问索引就快速得出统计数据.

    创建语法很简单,就是在普通索引创建的语法中index前加关键字bitmap即可,例如:
    create bitmap index H病人挂号记录_ix_执行人 on H病人挂号记录(执行人);

    二.位图索引的特点
    1.Bitmap索引的存储空间
    相对于B*Tree索引,位图索引由于只存储键值的起止Rowid和位图,占用的空间非常少.
    bitmap的空间占用主要根以下4个因素相关:
    a.表的总记录数
    b.索引列的键值多少,列的不同值越少,所需的位图就越少.
    c.操作的类型,批量插入比单条插入所面的位图要少得多,8i,9i下是这样的,10G则没有这种区别,详见后面的分析.
    d.索引列相同键值的物理分布,8i,9i中,不同块上的数据,相同的键值,会建立不同的位图行(段)来表示

    注:本文提到的8i,9i,10g,我试验的环境是8.1.7,9.2.0.5,10.2

    2.Bitmap索引创建的速度
    位图索引创建时不需要排序,并且按位存储,所需的空间也少.
    B*Tree索引则在创建时需要排序,定位等操作,速度要慢得多.

    3.Bitmap索引允许键值为空
    B*Tree索引由于不记录空值,当基于is null的查询时,会使用全表扫描,
    而对位图索引列进行is null查询时,则可以使用索引.

    4.Bitmap索引对表记录的高效访问
    当使用count(XX),可以直接访问索引就快速得出统计数据.
    当根据位图索引的列进行and,or或 in(x,y,..)查询时,直接用索引的位图进行或运算,在访问数据之前可事先过滤数据.

    5.Bitmap索引对批量DML操作只需进行一次索引
    由于通过位图反映数据情况,批量操作时对索引的更新速度比B*Tree索引一行一行的处理快得多.

    6.Bitmap索引的锁机制
    对于B*Tree索引,insert操作不会锁定其它会话的DML操作.
    而位图索引,由于用位图反映数据,不同会话更新相同键值的同一位图段,insert、update、delete相互操作都会发锁定。

    对于oracle 8i,9i,单行插入时,由于一个位图行(位图段)只记录8行记录,所以最多锁住相同键值的8行数据的DML操作.
    而批量插入时,和10G一样,同一键值只有一个位图行(位图段),所以,相同键值的所有数据的DML操作都会被锁住。

    下面,针对8i,9i观察一下锁机制:
    SQL> Declare
    Begin
    For i In 1..9
    Loop
       Insert Into H病人挂号记录(Id,No,号别,执行人) Values(i,'G000001',1,'张1');
    End Loop;
    Commit;
    End;
    /
    SQL> delete H病人挂号记录 where id=1;
    不提交,另开一个会话,
    SQL> delete H病人挂号记录 where id=9;
    操作可以进行,没有锁定。
    SQL> delete H病人挂号记录 where id=8;
    操作等待,由于和另外一个会话操作的记录的位图索引在同一个位图段上(一个位图段最多8行),所以被锁住了。


    三.位图索引的适用场合
    1.位图索引是Oracle数据库在7.3版本中加入的,8i,9i企业版和个人版支持,标准版不支持.
    2.基于规则的优化器无法使用Bitmap索引
    3.适应于有大量重复值的列查询
    4.对于8i,9i版本,不适用于单行插入,适用于批量插入的数据,
       因为单行插入时,相同键值,每插入8行就会生成一行索引块中的位图段,即使相同的值.
       而批量插入时,相同键值只生成一个位图段.
    5.由于并发DML操作锁定的是整个位图段的大量数据行,所以位图索引主要是用于OLAP应用,也可以用于OLTP中主要为读操作的表.


    关于bitmap的两个参数
    SQL> show parameter bitmap;

    NAME                                  TYPE         VALUE
    ------------------------------------ ----------- ------------------------------
    bitmap_merge_area_size                integer      1048576
    create_bitmap_area_size               integer      8388608

    其中bitmap_merge_area_size是bitmap索引进行合并操作时使用的内存区域,create_bitmap_area_size是创建时使用的内存区域.
    8i,9i中,需要根据bitmap的大小以及常见的使用情况来调整.
    9i以上,只需设置pga_aggregate_target的值,Oracle即会自动进和内存的调整.


    四.位图索引存储原理
    位图索引对数据表的列的每一个键值分别存储为一个位图,Oracle对于不同的版本,不同的操作方式,数据生成均有差别.
    对于8i,9i,
    下面分3种方式来讨论数据的插入:
    a.一次插入一行,插入多行后,一次提交;
    b.每插入一行,提交一次;
    c.批量插入方式,一次提交;

    对于第一种方式,观察位图索引的变化情况.
    a.假设插入8行相同键值的数据,如果以每行方式插入,然后一次提交,则会生成8个位图
    SQL> Insert Into H病人挂号记录(Id,No,号别,执行人) Values(1,'G000001',1,'张1');
    1 row inserted
    SQL> /
    1 row inserted
    SQL> /
    1 row inserted
    SQL> /
    1 row inserted
    SQL> /
    1 row inserted
    SQL> /
    1 row inserted
    SQL> /
    1 row inserted
    SQL> /
    1 row inserted
    SQL> commit;
    Commit complete

    SQL> alter system dump datafile 1 block 40028;
    System altered

    row#0[7847] flag: -----, lock: 0
    col 0; len 3; (3):   d5 c5 31    --键值'张1'
    col 1; len 6; (6):   00 40 9c 54 00 00   --rowid的起始位置
    col 2; len 6; (6):   00 40 9c 54 00 07   --rowid的终止位置
    col 3; len 2; (2):   c8 ff    --位图编码
    row#1[7802] flag: -----, lock: 0
    col 0; len 3; (3):   d5 c5 31
    col 1; len 6; (6):   00 40 9c 54 00 08
    col 2; len 6; (6):   00 40 9c 54 00 0f
    col 3; len 2; (2):   c8 03
    row#2[7780] flag: -----, lock: 0
    col 0; len 3; (3):   d5 c5 32
    col 1; len 6; (6):   00 40 9c 54 00 08
    col 2; len 6; (6):   00 40 9c 54 00 0f
    col 3; len 1; (1):   02
    row#3[7758] flag: -----, lock: 0
    col 0; len 3; (3):   d5 c5 33
    col 1; len 6; (6):   00 40 9c 54 00 08
    col 2; len 6; (6):   00 40 9c 54 00 0f
    col 3; len 1; (1):   03
    row#4[7736] flag: -----, lock: 2
    col 0; len 3; (3):   d5 c5 34
    col 1; len 6; (6):   00 40 9c 54 00 08
    col 2; len 6; (6):   00 40 9c 54 00 0f
    col 3; len 1; (1):   04
    row#5[7714] flag: -----, lock: 2
    col 0; len 3; (3):   d5 c5 35
    col 1; len 6; (6):   00 40 9c 54 00 08
    col 2; len 6; (6):   00 40 9c 54 00 0f
    col 3; len 1; (1):   05
    ----- end of leaf block dump -----


    但是,下次再插入一行相同键值的数据时,会自动合并这8行位图为一行位图,并生成一个新的索引位图行存放刚插入行的索引:
    SQL> Insert Into H病人挂号记录(Id,No,号别,执行人) Values(1,'G000001',1,'张1');
    1 row inserted
    SQL> commit;
    Commit complete
    SQL> alter system dump datafile 1 block 40028;
    System altered

    row#0[7847] flag: -----, lock: 2
    col 0; len 3; (3):   d5 c5 31
    col 1; len 6; (6):   00 40 9c 54 00 00
    col 2; len 6; (6):   00 40 9c 54 00 07
    col 3; len 2; (2):   c8 ff
    row#1[7825] flag: -----, lock: 2
    col 0; len 3; (3):   d5 c5 31
    col 1; len 6; (6):   00 40 9c 54 00 08
    col 2; len 6; (6):   00 40 9c 54 00 0f
    col 3; len 1; (1):   00
    ----- end of leaf block dump -----

    b.数据每行提交方式,与上面的情况相似,但有一点不一样,每提交一行,拷贝原来的位图,生成新的位图,并标记原来的位图为已删除,
    标记为已删除的位图,只有索引块需要分配新的位图时,才会清除标记为已删除的位图,重用这些空间.

    在8i,9i上实验的结果,与ITPUB的<Oracle 数据库性能优化>一书378页一致.
    如果1000条相同键值的数据插入,将生成125个包括8条记录的位图行.

    c.第三种方式,批量插入数据,insert into H病人挂号记录(Id,No,号别,执行人) select ***方式,
       同一键值,只生成一次位图,只有一个位图.

    SQL> Insert Into H病人挂号记录(Id,No,号别,执行人)
    Select 1,'G000001',1,'张1' From dual
    Union All
    Select 2,'G000002',1,'张1' From dual
    Union All
    Select 3,'G000003',1,'张1' From dual
    Union All
    Select 4,'G000004',1,'张1' From dual
    Union All
    Select 5,'G000005',1,'张1' From dual
    Union All
    Select 6,'G000006',1,'张1' From dual
    Union All
    Select 7,'G000006',1,'张1' From dual
    Union All
    Select 8,'G000006',1,'张1' From dual
    Union All
    Select 9,'G000006',1,'张1' From dual;
    SQL> commit;
    Commit complete
    SQL> alter system dump datafile 1 block 40028;
    System altered

    row#0[8006] flag: -----, lock: 2
    col 0; len 3; (3):   d5 c5 31
    col 1; len 6; (6):   00 40 9c 54 00 00
    col 2; len 6; (6):   00 40 9c 54 00 0f
    col 3; len 3; (3):   c9 ff 01
    row#1[8030] flag: ---D-, lock: 2
    col 0; NULL
    col 1; NULL
    col 2; NULL
    col 3; NULL
    ----- end of leaf block dump -----

    所以,位图索引最好采用批量插入方式,这样,每个键值只生成一个位图.而单行数据插入方式,每个键值将每8行数据生成一个位图.


    10G的情况,则简单得多.
    上面3种方式,相同键值的插入,位图的生成是一样的,只有一个位图,并且,每次提交时,并不会删除以前的位图,而是直接修改对应键值的位图.

    每次插入一行数据,插入9行后提交
    row#0[7763] flag: ------, lock: 2, len=29
    col 0; len 3; (3):   d5 c5 31
    col 1; len 6; (6):   00 00 00 00 00 00
    col 2; len 6; (6):   00 40 ef f2 00 0f
    col 3; len 8; (8):   f9 e4 d5 dc bc 01 ff 01
    ----- end of leaf block dump -----

    再批量插入9行数据并提交
    row#0[7733] flag: ------, lock: 2, len=30
    col 0; len 3; (3):   d5 c5 31
    col 1; len 6; (6):   00 00 00 00 00 00
    col 2; len 6; (6):   00 40 ef f2 00 17
    col 3; len 9; (9):   fa e4 d5 dc bc 01 ff ff 03
    ----- end of leaf block dump -----

    可以看出,10G对位图索引的存储进行了优化,一个键值在索引块中只有一个位图

    关于位图索引的一些信息,可以参考:bitmap 的一点探究 http://www.itpub.net/114023.html
    注意,其中有些结论并不是完全正确的,可以自己实验证明,另外,该文涉及的实验没有标明Oracle版本,不同的版本,结果有差异.
    展开全文
  • Oracle关于位图索引创建与应用

    千次阅读 2018-03-18 13:05:01
    Oracle关于位图索引创建与应用 标签: Oracle 位图索引 2016年03月13日 10:55:383730人阅读 评论(0) 收藏 举报  分类: 数据库(10) oracle(12)  1)创建  CREATE ...
  • 位图索引Oracle为每个唯一键创建一个位图,然后把与键值所关联的ROWID保存为位图。最多可以包括30列。 一般情况下,大多数用户都只创建TYPE为NORMAL的B-树索引,所以对于较低基数的列我们都是不创建索引的,因为B...
  • Oracle位图索引引发的阻塞与死锁

    千次阅读 2016-09-18 16:27:15
    前面我介绍了itl引发的阻塞与死锁,这里有必要再介绍一下位图索引引发的阻塞与死锁,因为这个也是不同于...假定,一个表,上面有标志字段(flags),分别是(0、1),而我们在这个flag字段上创建了一个位图索引,那么,现
  • 在实际应用中,如果某个字段的值需要频繁更新,那么就不适合在它上面创建位图索引。在位图索引中,如果你更新或插入其中一条数值为n的记录,那么相应表中数值为n的记录(可能成百上千条)全部被oracle锁定,这就...
  • 1.位图索引 位图索引适用于性别、婚姻状态、行政区等只有几列固定值的类型列,身份证号等就不适合位图索引位图索引适用于静态数据,频繁更新的字段不适用... 位图索引创建 create bitmap index index_name o...
  • oracle位图索引

    千次阅读 2010-09-26 11:33:00
    在实际应用中,如果某个字段的值需要频繁更新,那么就不适合在它上面创建位图索引。在位图索引中,如果你更新或插入其中一条数值为N的记录,那么相应表中数值为N的记录(可能成百上千条)全部被Oracle锁定,这就意味...
  • oracle中的位图索引

    2018-03-15 10:41:55
    原理 使用须知 如果用户查询的列的基数非常的小, 即只有的几个固定值,如性别、婚姻状况、行政区等等。要为这些基数值比较小的...位图索引创建时,不需要进行排序,因此速度较快;而B-tree索引创建时,需要排...
  • 3、创建需要的时间不同:位图索引创建很快,而B-tree索引创建很耗时。 4、dml操作影响大小不同:位图索引只适合海量查询,update、insert、delete时会产生负影响,而B-tree索引适合频繁的dm...
  • 创建位图索引

    2017-05-28 10:01:00
    创建位图索引 位图索引 1位图索引与B树索引不同,位图索引不存储rowid值(数据实际物理地址),也不存储键值。 2在特殊的列上创建位图 索引. ...4基数很低的列不适合B树索引,适合位图索引oracle建议...
  • oracle 创建索引

    千次阅读 多人点赞 2014-12-31 09:19:51
    oracle的索引分为5种:唯一索引,组合索引,反向键索引,位图索引,基于函数的索引 创建Oracle索引的标准语法: CREATE INDEX 索引名 ON 表名 (列名) TABLESPACE 表空间名; 创建唯一索引: CREATE unique ...
  • Oracle B树索引和位图索引简介

    千次阅读 2019-01-23 17:43:47
    创建索引时它就是默认的索引类型。B 树索引可以是一个列的(简单)索引,也可以是多个列的(组合/复合)索引。B 树索引最多可以包括32 列。 在下图的例子中,B 树索引位于雇员表的 last_name 列上。这个索引的二元...
  • 概述oracle索引主要分为以下几种:1. b-tree索引Oracle数据库中最常见的索引...2. 位图索引(bitmap index)位图索引特定于该列只有几个枚举值的情况,比如性别字段,标示字段比如只有0和1的情况。3. 基于函数的索引...
  • Oracle创建索引

    2010-04-28 09:08:33
    Oracle创建索引语法 oracle的索引分为5种:唯一索引,组合索引,反向键索引,位图索引,基于函数的索引 创建索引的标准语法: CREATE INDEX 索引名 ON 表名 (列名) TABLESPACE...
  • oracle创建索引

    2011-09-06 09:12:16
    oracle的索引分为5种:唯一索引,组合索引,反向键索引,位图索引,基于函数的索引 创建索引的标准语法: CREATE INDEX 索引名 ON 表名 (列名)  TABLESPACE 表空间名; 创建唯一索引: CREATE unique IND
  • Oracle 创建索引语法

    千次阅读 2018-05-04 17:16:52
    Oracle 的索引可分为5种,它们包括唯一索引、组合索引、反向键索引、位图索引和基于函数的索引。1、创建索引的标准语法以下为引用内容:  CREATE INDEX 索引名 ON 表名 (列名)TABLESPACE 表空间名;例如:以下为引用...

空空如也

空空如也

1 2 3 4 5 ... 15
收藏数 284
精华内容 113
关键字:

oracle位图索引创建