• 分区索引笔记(三)--全局分区索引


           全局分区索引在一个索引分区中包含来自多个表分区的键。一个全局分区索引的分区键是分区表中不同的或指定一个范围的值。在创建全局分区索引时,必须定义分区键的范围和值。

           全局索引只能是B树索引Oracle在默认情况下不会维护全局分区索引如果一个分区被截取、增加、分割、删除等就必须重建全局分区索引,除非在修改表时指定ALTER TABLE命令的UPDATE GLOBAL INDEXES子句。

    1、种类

    1)有前缀的索引

            通常,全局有前缀索引在底层表中没有经过对等分区。没有什么因素能限制索引的对等分区,但Oracle在生成查询计划或执行分区维护操作时,并不会充分利用对等分区。如果索引被对等分区,就必须把它创建为一个本地索引,这样Oracle可以维护这个索引,并使用它来删除不必要的分区,每个分区都包含指向多个表分区中行的索引条目。

    技巧:如果一个全局索引将被对等分区,就必须把它创建为一个本地索引,这样Oracle可以维护这个索引,并使用它来删除不必要的分区。

    2)无前缀的索引

           到目前为止(10gR2)Oracle不支持无前缀的全局索引。

    2.、注意事项:

    1全局索引可以分区,也可以是不分区索引,全局索引必须是前缀索引,即全局索引的索引列必须是以索引分区键作为其前几列。

    2全局索引可以依附于分区表;也可以依附于非分区表。

    3全局分区索引的索引条目可能指向若干个分区,因此,对于全局分区索引,即使只截断一个分区中的数据,都需要rebulid若干个分区甚至是整个索引。

    4全局索引多应用于oltp系统中。

    5)全局分区索引只按范围或者散列分区,hash分区是10g以后才支持。

    6  oracle9i 以后对分区表做move或者truncate 的时可以用update global indexes 语句来同步更新全局分区索引,用消耗一定资源来换取高度的可用性。

    7表用a列作分区,索引用b做局部分区索引,若where条件中用b来查询,那么oracle会扫描所有的表和索引的分区,成本会比分区更高,此时可以考虑用b做全局分区索引。

    3、实验

    示例1 全局索引,全局索引对所有分区类型都支持:

    sql> create index ix_custaddr_ global_id on custaddr(id) global;

    索引已创建。

    示例2:全局分区索引,只支持Range 分区和Hash 分区:

    1)创建2个测试分区表:

    sql> create table pdba (id number, time date) partition by range (time)

      (

      partition p1 values less than (to_date('2010-10-1', 'yyyy-mm-dd')),

      partition p2 values less than (to_date('2010-11-1', 'yyyy-mm-dd')),

      partition p3 values less than (to_date('2010-12-1', 'yyyy-mm-dd')),

      partition p4 values less than (maxvalue)

      );

    表已创建。

     

    SQL> create table Thash

      (

      id number primary key,

      item_id number(8) not null

      )

      partition by hash(id)

      (

      partition part_01,

      partition part_02,

     partition part_03

     );

    表已创建。

    2)创建分区索引

    示例2:全局分区索引

    SQL> create index i_id_global on PDBA(id) global

      partition by range(id)

      (partition p1 values less than (200),

      partition p2 values less than (maxvalue)

      );

    索引已创建。

     

    -这个是有前缀的分区索引。

     

    SQL> create index i_time_global on PDBA(id) global

      partition by range(time)

      (partition p1 values less than (TO_DATE('2010-12-1', 'YYYY-MM-DD')),

      partition p2 values less than (maxvalue)

      );

    partition by range(time)

                           *

    2 行出现错误:

    ORA-14038: GLOBAL 分区索引必须加上前缀

    SQL> create index i_time_global on PDBA(time) global

      partition by range(time)

      (partition p1 values less than (TO_DATE('2010-12-1', 'YYYY-MM-DD')),

      partition p2 values less than (maxvalue)

      );

    索引已创建。

    --有前缀的分区索引

    SQL>  select  index_name,table_name,partitioning_type,locality,ALIGNMENT  from

    user_part_indexes where table_name='PDBA';

    index_name                        table_name partition locali alignment

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

    i_id_global                          pdba              range          global prefixed

    i_time_global                      pdba              range          global prefixed

     

    SQL> CREATE INDEX ix_hash ON PDBA (id,time) GLOBAL

      2              PARTITION BY HASH (id)

      3              (PARTITION p1,

      4                PARTITION p2,

      5                PARTITION p3,

      6                PARTITION p4);

    索引已创建。

    只要索引的引导列包含分区键,就是有前缀的分区索引。

  • 相关阅读:
    大整数相加算法
    java中String和char的区别
    Git命令
    Dart随记
    用nodejs或者Chrome控制台的js对URI进行编码或解码
    Rust执行cmd或shell命令
    cargo expand用于查看被宏隐藏的代码
    Blocking waiting for file lock on package cache
    Rust生命周期之个人理解
    Rust为基础类型实现Trait
  • 原文地址:https://www.cnblogs.com/james1207/p/3280002.html
Copyright © 2020-2023  润新知