zoukankan      html  css  js  c++  java
  • Use Local Or Global Index?

    常常我们须要将大表依据分区键进行分区,当建立索引的时候。我们究竟使用local 还是global 索引呢

    先看看两种索引的特点:

    本地索引特点:
    1. 本地索引一定是分区索引。分区键等同于表的分区键。分区数等同于表的分区说。一句话。本地索引的分区机制和表的分区机制一样。
    2. 假设本地索引的索引列以分区键开头,则称为前缀局部索引。
    3. 假设本地索引的列不是以分区键开头。或者不包括分区键列,则称为非前缀索引。

    4. 前缀和非前缀索引都能够支持索引分区消除,前提是查询的条件中包括索引分区键。

    5. 本地索引仅仅支持分区内的唯一性,无法支持表上的唯一性,因此假设要用本地索引去给表做唯一性约束,则约束中必需要包含分区键列。

    6. 本地分区索引是对单个分区的,每一个分区索引仅仅指向一个表分区。全局索引则不然。一个分区索引能指向 n个表分区,同一时候。一个表分区。也可能指向 n个索引分区,对分区表中的某个分区做 truncate或者 move, shrink等,可能会影响到 n个全局索引分区,正由于这点,本地分区索引具有更高的可用性。
    7. 位图索引仅仅能为本地分区索引。

    8. 本地索引多应用于数据仓库环境中。
    全局索引特点:
    1.全局索引的分区键和分区数和表的分区键和分区数可能都不同样,表和全局索引的分区机制不一样。

    2.全局索引能够分区,也能够是不分区索引,全局索引必须是前缀索引,即全局索引的索引列必须是以索引分区键作为其前几列。
    3.全局分区索引的索引条目可能指向若干个分区,因此。对于全局分区索引,即使仅仅截断一个分区中的数据,都须要 rebulid若干个分区甚至是整个索引。

    4.全局索引多应用于 oltp系统中。
    5.全局分区索引仅仅按范围或者散列 hash分区。 hash分区是 10g以后才支持。
    6.oracle9i以后对分区表做move 或者truncate 的时能够用update global indexes语句来同步更新全局分区索引,用消耗一定资源来换取高度的可用性。
    7.表用 a列作分区。索引用 b做局部分区索引,若 where条件中用 b来查询。那么 oracle会扫描全部的表和索引的分区。成本会比分区更高,此时能够考虑用 b做全局分区索引。

    通常开发者喜欢建立local索引。由于在删除分区的时候不须要重建索引。可是有时候本地索引将会带来非常大的性能影响:
    -----------------------------------------------------------------------------------------------------------------------
    | Id  | Operation                          |Name                  | Starts | E-Rows | A-Rows |Buffers |Pstart| Pstop |
    -----------------------------------------------------------------------------------------------------------------------
    |   0 |SELECT STATEMENT                   |                       |      1 |        |   1493 |   2984 |      |       |
    |   1 |  PARTITION RANGEALL               |                       |      1 |   1493 |   1493 |   2984 |    1 |  1493 |
    |   2 |  TABLE ACCESS BY LOCAL INDEX ROWID| PARTITIONED_TAB       |   1493 |   1493 |   1493 |   2984 |    1 |  1493 |
    |*  3 |   INDEX RANGE SCAN                | LC_NON_PREFIXED_TYP_I |   1492 |   1493 |   1493 |   1492 |    1 |  1493 |
    -----------------------------------------------------------------------------------------------------------------------
     
    Predicate Information (identifiedby operation id):
    ---------------------------------------------------
    3 - access(MHO_TYP_ID=0)
     
    Statistics
    ----------------------------------------------------------
    0     recursive calls
    0     db block gets
    2984  consistent gets
    0     physical reads
    0     redosize
    28937 bytes sent via SQL*Netto client
    372   bytes received via SQL*Netfrom client
    4     SQL*Net roundtripsto/fromclient
    0     sorts (memory)
    0     sorts (disk)
    1493 rows processed


    LC_NON_PREFIXED_TYP_I运行了1942次,这样的情况假设我们加上适当的条件,尽量降低分区的扫描:
    SQL>select * from partitioned_tab
         wheremho_typ_id = 0
         and mho_date = to_date('01122012','ddmmyyyy');
     
    MHO_ID MHO_DATE          M MHO_TYP_ID
    ---------- ----------------- - ----------
    1 20121201 00:00:00 Z          0
     
    -------------------------------------------------------------------------------------------------------------------------
    | Id  | Operation                          |Name                  | Starts | E-Rows | A-Rows | Buffers | Pstart| Pstop |
    -------------------------------------------------------------------------------------------------------------------------
    |   0 |SELECT STATEMENT                   |                       |      1 |        |      1 |       2 |       |       |
    |   1 |  PARTITION RANGE SINGLE            |                       |      1 |      1 |      1 |       2 |     2 |     2 |
    |*  2 |  TABLE ACCESS BY LOCAL INDEX ROWID| PARTITIONED_TAB       |      1 |      1 |      1 |       2 |     2 |     2 |
    |*  3 |   INDEX RANGE SCAN                | LC_NON_PREFIXED_TYP_I |      1 |      1 |      1 |       1 |     2 |     2 |
    -------------------------------------------------------------------------------------------------------------------------
     
    Predicate Information (identifiedby operation id):
    ---------------------------------------------------
    2 - filter(MHO_DATE=TO_DATE(' 2012-12-01 00:00:00','syyyy-mm-dd hh24:mi:ss'))
    3 - access(MHO_TYP_ID=0)


    这次LC_NON_PREFIXED_TYP_I仅仅运行了一次

    那我们换成global index呢?

    SQL>select * from partitioned_tab where mho_typ_id = 0;
     
    ------------------------------------------------------------------------------------------------------------------
    | Id  | Operation                          |Name            | Starts | E-Rows | A-Rows |Buffers | Pstart| Pstop |
    ------------------------------------------------------------------------------------------------------------------
    |   0 |SELECT STATEMENT                   |                 |      1 |        |   1493 |   1496 |       |       |
    |   1 | TABLE ACCESS BY GLOBAL INDEX ROWID| PARTITIONED_TAB |      1 |   1493 |   1493 |   1496 | ROWID | ROWID |
    |*  2 |  INDEX RANGE SCAN                 | GL_TYP_I        |      1 |   1493 |   1493 |      4 |       |       |
    ------------------------------------------------------------------------------------------------------------------
     
    Predicate Information (identifiedby operation id):
    ---------------------------------------------------
    2 - access(MHO_TYP_ID=0)
     
    Statistics
    ----------------------------------------------------------
    1     recursive calls
    0     db block gets
    1496  consistent gets
    1493  physical reads
    0     redosize
    28937 bytes sent via SQL*Netto client
    372   bytes received via SQL*Netfrom client
    4     SQL*Net roundtripsto/fromclient
    0     sorts (memory)
    0     sorts (disk)
    1493 rows processed


    索引仅仅运行了一次,consistent gets为1496 是用local的一半。

    索引建立global或local index 我们须要依据分区数量、分区稳定性、sql语句综合考虑。


  • 相关阅读:
    第十周课程总结
    第九周课程总结&实验报告(七)
    第八周课程总结&实验报告(六)
    第七周课程总结&实验报告(五)
    第六周&java实验报告四
    第五周课程总结&试验报告(三)
    课程总结
    第十四周课程总结
    第十三周学习总结
    第十二周编程总结
  • 原文地址:https://www.cnblogs.com/slgkaifa/p/6892436.html
Copyright © 2011-2022 走看看