精华内容
下载资源
问答
  • 全局分区索引与局部分区索引

    千次阅读 2014-01-24 20:12:09
    全局分区索引与局部分区索引
            分区索引
            分区索引,有是全局分区索引局部分区索引,加上一种全局非分区索引(也就是普通索引),加起来共三种。下面我们讨论了这三种索引的组织结构以及应用场景。


    1.全局非分区索引
    可以依赖普通的表,也可以依赖分区表建立。
    CREATE INDEX month_ix ON sales(sales_month);
    等同于CREATE INDEX month_ix ON sales(sales_month) GLOBAL;

    2.全局分区索引
        全局分区索引使用一种有别于底层表的分区机制,意思是索引的分区键可以选择跟表的分区键不一致,但索引的索引键前缀要包含索引的分区键。也就是只有”全局前缀索引“,而没有“全局非前缀索引”。这样,拿了索引分区键做前缀的索引,即使不包含表分区键,也能用于表的unique与primary约束。
        建成后有多个段,每个段代表一个索引分区,每个索引分区中的键值可以指向任何表分区。可以依赖普通的表,也可以依赖分区表建立。可能索引分区数不等于表分区数。只能按range或hash(10g起)对索引分区。全局索引的range分区最后一个分区必须是maxvalue,以保证底层表的所有行都能放到这个索引中。
    CREATE INDEX month_ix ON sales(sales_month,sales_date) GLOBAL PARTITION BY RANGE(sales_month)
          (PARTITION pm1_ix VALUES LESS THAN (2),
           PARTITION pm2_ix VALUES LESS THAN (3),
           PARTITION pm3_ix VALUES LESS THAN (4),
           PARTITION pm4_ix VALUES LESS THAN (5),
           PARTITION pm12_ix VALUES LESS THAN (MAXVALUE));

        全局索引建立时global 子句允许指定索引的范围值,这个范围值是索引分区键的范围。全局分区索引的GLOBAL PARTITION BY RANGE(sales_month)的sales_month是指定索引分区键,可以跟表分区键不一样,我行我素地设立分区键,此时sales(sales_month,sales_date)句子,指定索引键,其前缀就必须包含索引分区键了。这一切,都可以跟底层表没啥关系。

    使用场景:
    对于数据仓库,例如不断有旧数据的删除与新数据的流入(滑动窗口),全局索引很容易失效,使性能受影响。
    3.局部分区索引
        不能对普通表建这个索引,只能依赖分区表建立,并且是依赖分区表的分区键来建立,即依赖底层表的分区机制来建立索引。随着表分区,建立一一对应的索引分区,每个索引分区中的条目都只指向一个表分区。
    CREATE INDEX loc_dept_ix ON dept(deptno) LOCAL;
    create index dinya_idx_t on dinya_test(item_id)
    local
    (
    partition idx_1 tablespace tbs1,
    partition idx_2 tablespace tbs2,
    partition idx_3 tablespace tbs3
    );
    局部分区索引逻辑上可以划分为:
    局部前缀索引--表分区键在索引定义的第一列上。例如对表的字段LOAD_DATE进行range分区,而建索引时,LOAD_DATE又是索引的第一列。
    局部非前缀索引--索引不以表分区键作为它的索引字段的第一列,甚至压根不包含分区键。

    局部前缀索引与局部非前缀索引,对分区消除的影响?
        首先我们得明白什么是分区消除。一个事务,可以只考虑特定的分区,其余分区就算物理介质损坏,其他分区所在表空间offline等,事务都可以不理会以及不扫描他们。分区消除的种类:表的分区消除,与索引的分区消除。分区消除更多的是为了可用性,以及在出现全表扫与全索引扫的时候,转换为只扫特定的分区以提高性能。
        能否使用分区消除,关键在于谓词是否有分区键。如果谓词包含分区键,那可能是实现索引分区消除,也可能是表分区消除。如果谓词不包含分区键,那神马分区消除都是奢想。至于使用的是局部前缀索引还是局部非前缀索引,影响的只是能否实现索引分区消除。用局部前缀索引才能实现索引分区消除,用局部非前缀索引,不能实现“索引分区消除“(但表的分区消除仍然可能实现,但当cbo评估出来要先走索引,却发现索引分区不可用,如所在表空间offline了,此时已不能改路了)。cbo评估代价时,不会考虑分区索引是否可用,评估出一个路径,走下去发现此路不通,也不能走回头路了而直接报错了。

    局部前缀索引与局部非前缀索引,对于sql执行性能?
    如果将索引作为查询计划的第一步,效率上其实并没有什么区别,尽管前缀与非前缀索引会影响到是否能使用分区消除,但分区消除是什么呢?是可用性的提高,以及将全表扫描转为单分区全扫的性能上的优化。所以对于走索引作为第一步,是否分区消除不要紧,从而是否前缀也就不要紧了。

    局部前缀索引与局部非前缀索引的选择?
        怎么选择,首先应该是能满足需求的。你如果建立一个(b,a)的索引,却总查where a=3,引出很多skip scan那就不好了,此时是应该换成建立(a,b)的索引。
        如果仅仅有where a=1 and b=2这样的查询,你可能会问,我们是建(a,b)好还是(b,a)好呢,看哪个字段的选择性好,看我们有没有必要走a的索引分区消除,假如b的密度很大,从1-50000都有,而a只能是1与2,那么我们把b排前面更好。所以将哪个字段放前面,得满足业务需求、综合谓词的分区消除,与字段选择率来选择。

    局部索引与唯一约束
    分区表字段想用unique或primary key约束,一般是使用全局索引来保证唯一性,这是一般的做法。因为局部索引只保证分区内部的键的唯一性,而不能跨分区,如果你的确想用局部索引来保证整个表的唯一性,就得把分区键加到约束当中,也成。如果oracle允许局部索引(不包含约束的情况)就能轻易来保证全表的唯一性,那么所有的update与insert,都得扫每一个分区,这样可用性与可扩展性都会丧失殆尽。

    4.总结
    三种索引的选择?
    OLAP系统中多用局部索引,OLTP系统上,全局索引更为常见。
    可用性角度:局部索引更可用,就算一个索引分区出问题了也不影响其他,而全局索引很可能会成为一个故障点,一旦出现问题则整个索引都不可用。
    维护性角度:局部索引更好维护更灵活,DBA决定移动一个表分区,只需要重建与维护一个索引分区。对全局索引,很多情况下都需重建。
    sql效率:因为局部索引随表分区,可以涉及出最优的执行计划。

    视图
    select * from DBA_IND_PARTITIONS where index_name='LOCAL_NOPREFIXED';
    select * from DBA_PART_INDEXES where index_name='LOCAL_NOPREFIXED';
    select * from DBA_PART_KEY_COLUMNS where name='LOCAL_NOPREFIXED';


    实验:
    --创建表空间tbs1,tbs2,tbs3
    create tablespace tbs1 datafile '+DATA6_MIDG';
    create tablespace tbs2 datafile '+DATA6_MIDG';
    create tablespace tbs3 datafile '+DATA6_MIDG';
    SQL>
    --创建一个range分区表
    create table t_part(a int,b int,data char(20))
    partition by range (a)
    (partition p1 values less than(2) tablespace tbs1,
    partition p2 values less than(3) tablespace tbs2
    );
    --插入一些数据
    insert into t_part select mod(rownum-1,2)+1,rownum,'x' from all_objects;
    commit;
    SQL> select * from t_part where rownum<=10;
    --创建局部前缀索引与局部非前缀索引
    create index local_prefixed on t_part(a,b) local;
    create index local_noprefixed on t_part(b) local;
    create index local_prefixed on t_part(a,b) local
    (partition ind1 tablespace tbs3,
    partition ind2 tablespace tbs2);

    --为表收集统计信息
    begin dbms_stats.gather_table_stats(user,'t_part',cascade=>TRUE);end;
    --把tbs2表空间下线,此时可以验证索引分区消除,将tbs1下线,可以验证表分区消除。
    alter tablespace tbs3 offline;
    --再用这种命令来测试
    select * from t_part where a=1 and b=1;
    select * from t_part where b=1;
    select /*+full(t_part)*/ * from t_part where a=1 and b=1;


    展开全文
  • 最近正在温习ORACLE分区表,下面是关于全局分区索引和局部分区索引,以及前缀局部分区索引和非前缀局部分区索引的概念和需要注意的地方全局分区索引:索引分区不按照表的分区进行,索引的分区可以指向任何表分区局部...

    最近正在温习ORACLE分区表,下面是关于全局分区索引和局部分区索引,以及前缀局部分区索引和非前缀局部分区索引的概念和需要注意的地方
    全局分区索引:索引分区不按照表的分区进行,索引的分区可以指向任何表分区
    局部分区索引:索引分区完成按照表的分区进行
    前缀局部分区索引:分区键在索引定义的第一列上
    非前缀局部分区索引:分区键不在索引定义的第一列上,可能根本不包含分区键
    1、这里先说明下分区修剪,以及前缀局部分区索引和非前缀局部分区索引的关系
    何为分区修剪?其实这个是分区表的主要功能,表示可以通过分区,ORACLE会判断查询的数据在那个分区中
    从而不会去访问未包含数据的分区,从而提高性能。
    前缀局部分区索引总是可以很好的利用分区修剪,而非前缀局部分区索引可能在利用上有一些问题。
    因为根据分区键总能准确的判定出数据所在的分区,而非前缀局部分区索引因为不包含分区键所以不会很好的
    利用,因为它判定不出分区中是否有需要的数据只能全分区扫描。
    列子如下;
    建立分区表
    SQL> CREATE TABLE pp
      2        ( a int,
      3        b int,
      4        data char(20)
      5        )
      6        PARTITION BY RANGE (a)
      7        (
      8               PARTITION part_1 VALUES LESS THAN(2) tablespace tbs1,
      9               PARTITION part_2 VALUES LESS THAN(3) tablespace tbs2
     10   ) ;

    表已创建。
    前缀局部分区索引
    SQL>   create index pp_local on pp(a,b) local;

    索引已创建。
    非前缀局部分区索引
    SQL>   create index pp_nolocal on pp(b) local;

    索引已创建。
    插入数据
    SQL> insert into pp
      2  select mod(rownum-1,2)+1, rownum, 'x'
      3  from all_objects;

    已创建49580行。

    分析表和索引
    SQL> execute dbms_stats.gather_table_stats(ownname => 'PP',tabname => 'PP',cascade => true);

    PL/SQL 过程已成功完成。
    现在进行查看执行计划
    SQL> select * from pp where a=1 and b=1;

             A          B DATA
    ---------- ---------- --------------------
             1          1 x


    执行计划
    ----------------------------------------------------------
    Plan hash value: 1330722014

    ----------------------------------------------------------------------------------------------------
    | Id  | Operation                          | Name     | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
    ----------------------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT                   |          |     1 |    28 |     2   (0)| 00:00:01 |       |       |
    |   1 |  PARTITION RANGE SINGLE            |          |     1 |    28 |     2   (0)| 00:00:01 |     1 |     1 |
    |   2 |   TABLE ACCESS BY LOCAL INDEX ROWID| PP       |     1 |    28 |     2   (0)| 00:00:01 |     1
    |*  3 |    INDEX RANGE SCAN                | PP_LOCAL |     1 |       |     1   (0)| 00:00:01 |     1 |     1 |
    ----------------------------------------------------------------------------------------------------

    Predicate Information (identified by operation id):
    ---------------------------------------------------

       3 - access("A"=1 AND "B"=1)
    PSTART PSTOP都是1这里忽略了分区2
    如果我是用以下的查询
    SQL>  select * from pp  where b=1;

             A          B DATA
    ---------- ---------- --------------------
             1          1 x


    执行计划
    ----------------------------------------------------------
    Plan hash value: 1993740852

    ----------------------------------------------------------------------------------------------------
    | Id  | Operation                          | Name       | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
    ----------------------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT                   |            |     1 |    28 |     4   (0)| 00:00:01 |       |       |
    |   1 |  PARTITION RANGE ALL               |            |     1 |    28 |     4   (0)| 00:00:01 |     1 |     2 |
    |   2 |   TABLE ACCESS BY LOCAL INDEX ROWID| PP         |     1 |    28 |     4   (0)| 00:00:01 |     1 | 
    |*  3 |    INDEX RANGE SCAN                | PP_NOLOCAL |     1 |       |     3   (0)| 00:00:01 |     1 |     2 |
    ----------------------------------------------------------------------------------------------------

    Predicate Information (identified by operation id):
    ---------------------------------------------------

       3 - access("B"=1)
    大家都知道其实返回的值都是一样这里却扫描的全分区PSTART=1,PSTOP=2因为没有分区键索引这里
    只能进行全分区扫描了。其实感觉这里和索引的类型没有多大的关系。关键在于查询中是否有分区键。

    另外一个限制局部分区索引只会保证分居中的数据唯一性,而不会去关注全分区的数据唯一性,索引
    即使对表进行了分区,加入主键的时候主键对应的索引一样不是分区的,列子
    SQL>  CREATE TABLE pp2
      2       (
      3       id int,
      4       ic_id int,
      5        constraint partitioned_pk primary key(id)
      6        )
      7        PARTITION BY RANGE (id)
      8        (
      9        PARTITION part_1 VALUES LESS THAN (20000) tablespace tbs1,
     10        PARTITION part_2 VALUES LESS THAN (70000) tablespace tbs2
     11  ) ;
     
    Table created
    SQL>  insert into pp2
      2    select rownum,mod(rownum-1,2)+1
      3    from all_objects;
     
    49587 rows inserted
     
    SQL>
    SQL> execute dbms_stats.gather_table_stats(ownname => 'PP100',tabname => 'PP2',cascade => true);
     
    PL/SQL procedure successfully completed
     
    SQL> select * from user_objects;
     
    SQL>  CREATE TABLE pp2
      2       (
      3       id int,
      4       ic_id int,
      5        constraint partitioned_pk primary key(id)
      6        )
      7        PARTITION BY RANGE (id)
      8        (
      9        PARTITION part_1 VALUES LESS THAN (20000) tablespace tbs1,
     10        PARTITION part_2 VALUES LESS THAN (70000) tablespace tbs2
     11  ) ;
     
    Table created
    SQL>  insert into pp2
      2    select rownum,mod(rownum-1,2)+1
      3    from all_objects;
     
    49587 rows inserted
     
    SQL>
    SQL> execute dbms_stats.gather_table_stats(ownname => 'PP100',tabname => 'PP2',cascade => true);
     
    PL/SQL procedure successfully completed
     
    SQL> select * from user_objects;
     
    OBJECT_NAME                                                                      SUBOBJECT_NAME                  OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE         CREATED     LAST_DDL_TIME TIMESTAMP           STATUS  TEMPORARY GENERATED SECONDARY
    -------------------------------------------------------------------------------- ------------------------------ ---------- -------------- ------------------- ----------- ------------- ------------------- ------- --------- --------- ---------
    PP2                                                                              PART_2                              58189          58189 TABLE PARTITION     2010-9-3 14 2010-9-3 14:5 2010-09-03:14:56:19 VALID   N         N         N
    PP2                                                                              PART_1                              58188          58188 TABLE PARTITION     2010-9-3 14 2010-9-3 14:5 2010-09-03:14:56:19 VALID   N         N         N
    PP2                                                                                                                  58187                TABLE               2010-9-3 14 2010-9-3 14:5 2010-09-03:14:56:19 VALID   N         N         N
    PARTITIONED_PK                                                                                                       58190          58190 INDEX               2010-9-3 14 2010-9-3 14:5 2010-09-03:14:56:19 VALID   N         N         N
    ORACLE这样做是为了提高性能,如果每次插入数据的时候ORACLE都必须去检查每个分区,这样导致的结果是性能地下,分区越多性能就越差。
    2、全局分区索引
    这个分区索引只有前缀这一种方式,全局分区索引可以用于保证主键的惟一性,这样一来,即使不包括表的分区键,也可以有能保证惟一性的分区索引

    来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7728585/viewspace-672548/,如需转载,请注明出处,否则将追究法律责任。

    转载于:http://blog.itpub.net/7728585/viewspace-672548/

    展开全文
  • PLSQL,测试 ,创建局部分区索引,全局未分区索引 ,全局分区索引,以及失效重建

    1. 在创建索引时如果不显式指定global或local,则默认是global。
    2. 在创建global索引时如果不显式指定分区子句,则默认不分区(废话)。

    --创建测试表

    DROP TABLE t_part;
    create table t_part(object_id int,object_name varchar2(1000)) partition by range(object_id)
    (
    partition p1 values less than (1000),
    partition p2 values less than (2000),
    partition p3 values less than (3000),
    partition p4 values less than (4000),
    partition pm values less than (maxvalue)
    );

    --插入测试数据
    INSERT INTO t_part SELECT ROWNUM,t.index_name FROM dba_indexes t;

    commit;


    --创建本地分区索引
    create index idx_part_local on t_part(object_name) local;

    --创建全局非分区索引
    create index idx_part_global on t_part(object_id) global;

    --删除分区前查询索引状态,全局非分区索引和本地分区索引都正常
    select status,index_name from user_indexes s where index_name='IDX_PART_GLOBAL';
    select status,index_name from user_ind_partitions s where index_name='IDX_PART_LOCAL';

    --删除一个分区,或者,清除一个分区的数据,都会使全局未分区索引失效
    alter table t_part drop partition p1;
    --alter table t_part truncate partition p1;

    --删除后再查询索引状态,全局非分区索引失效,本地分区索引没有失效
    select status,index_name from user_indexes s where index_name='IDX_PART_GLOBAL';
    select status,index_name from user_ind_partitions s where index_name='IDX_PART_LOCAL';

    --查询不报错
    select /*+index(t IDX_PART_LOCAL)*/ * from t_part t where object_id > 35000;

    --查询报错,ORA-01502: 索引 'SCOTT.IDX_PART_GLOBAL' 或这类索引的分区处于不可用状态
    select /*+index(t IDX_PART_GLOBAL)*/ * from t_part t where object_id > 35000;

    --重建失效索引
    alter index idx_part_global rebuild;

    --删除后再查询索引状态,全局非分区索引和本地分区索引都恢复正常
    select status,index_name from user_indexes s where index_name='IDX_PART_GLOBAL';
    select status,index_name from user_ind_partitions s where index_name='IDX_PART_LOCAL';

    --在删除表分区的时候,可以通过以下命令进行索引重建
    alter table t_part drop partition p2 UPDATE Global indexes; --(alter table t_part drop partition p2 UPDATE indexes;)

    =================================================
    --创建全局分区索引
    drop index idx_part_global;

    CREATE INDEX idx_part_global_full ON t_part (object_id)
    GLOBAL PARTITION BY RANGE (object_id)
    (PARTITION p1 VALUES LESS THAN (1000),
    PARTITION p2 VALUES LESS THAN (3000),
    PARTITION p3 VALUES LESS THAN (MAXVALUE)
    );
    --删除其中一个分区
    alter table t_part drop partition p3;

    --全局分区索引失效
    select status,index_name from user_ind_partitions s where index_name='IDX_PART_GLOBAL_FULL';

    --本地索引没失效,不报错
    select /*+index(t IDX_PART_LOCAL)*/ * from t_part t where object_name = 'SYS_C003319';

    --全局分区索引失效,报错 ORA-01502: 索引 'SCOTT.IDX_PART_GLOBAL_FULL' 或这类索引的分区处于不可用状态
    select /*+index(t IDX_PART_GLOBAL_FULL)*/ * from t_part t where object_id > 35000;


    /*
    当需要对分区表进行下面操作时,都会导致全局索引的失效。
    ADD (HASH)
    COALESCE (HASH)
    DROP
    EXCHANGE
    MERGE
    MOVE
    SPLIT
    TRUNCATE
    之后需要对失效索引进行重建,也可以在删除分区表的时候指定 UPDATE INDEXES 直接进行索引的重建。
    */

    SELECT * FROM t_part Partition(p1)
    SELECT * FROM dba_Indexes WHERE index_name='IDX_PART_GLOBAL_FULL' ;--索引基本信息
    SELECT * FROM dba_part_indexes WHERE index_name='IDX_PART_GLOBAL_FULL' ;--索引对应表,相关信息,local/global,范围分区,list分区
    SELECT * FROM dba_ind_partitions WHERE index_name='IDX_PART_LOCAL' ;--索引对应分区信息
    SELECT * FROM dba_ind_subpartitions WHERE index_name='IDX_PART_LOCAL' ;--索引对应子分区信息
    SELECT TABLESPACE_NAME FROM DBA_INDEXES WHERE INDEX_NAME = 'IDX_PART_GLOBAL';
    展开全文
  • 局部分区索引的分区消除分区消除行为:如果查询首先访问索引,是否能消除分区完全取决于查询中的谓词。 SQL> create table test 2 (a int, 3 b int, 4 data char(20)...
    局部分区索引的分区消除
    分区消除行为:如果查询首先访问索引,是否能消除分区完全取决于查询中的谓词。

    SQL> create table test

    2 (a int,

    3 b int,

    4 data char(20)

    5 )

    6 partition by range(a)

    7 (partition part_1 values less than(2),

    8 partition part_2 values less than(3)

    9 )

    10 /

    表已创建。

    SQL> create index local_pre on test(a,b) local;

    索引已创建。

    SQL> create index local_nopre on test(b) local;

    索引已创建。

    SQL> insert into test

    2 select mod(rownum -1 ,2) +1, rownum, 'x'

    3 from all_objects;

    已创建11201行。

    进行对象统计信息收集:

    SQL> edit

    已写入 file afiedt.buf

    1 BEGIN

    2 dbms_stats.gather_table_stats(

    3 ownname => user,

    4 tabname => 'TEST',

    5 estimate_percent => 100,

    6 method_opt => 'for all columns size skewonly',

    7 cascade => TRUE

    8 );

    9* END;

    SQL> /

    PL/SQL 过程已成功完成。

    SQL> set autot traceonly explain

    SQL> select * from test where a=1 and b=1;

    执行计划

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

    Plan hash value: 3724286461

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

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

    | Id | Operation | Name | Rows | Bytes | Cost (%

    CPU)| Time | Pstart| Pstop |

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

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

    | 0 | SELECT STATEMENT | | 1 | 28 | 2

    (0)| 00:00:01 | | |

    | 1 | PARTITION RANGE SINGLE | | 1 | 28 | 2

    (0)| 00:00:01 | 1 | 1 |

    | 2 | TABLE ACCESS BY LOCAL INDEX ROWID| TEST | 1 | 28 | 2

    (0)| 00:00:01 | 1 | 1 |

    |* 3 | INDEX RANGE SCAN | LOCAL_PRE | 1 | | 1

    (0)| 00:00:01 | 1 | 1 |

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

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

    Predicate Information (identified by operation id):

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

    3 - access("A"=1 AND "B"=1)

    通过查看执行计划,此查询通过索引local_pre做了分区消除。

    SQL> select * from test where b =1;

    执行计划

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

    Plan hash value: 3332543978

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

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

    | Id | Operation | Name | Rows | Bytes | Cost

    (%CPU)| Time | Pstart| Pstop |

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

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

    | 0 | SELECT STATEMENT | | 1 | 28 | 4

    (0)| 00:00:01 | | |

    | 1 | PARTITION RANGE ALL | | 1 | 28 | 4

    (0)| 00:00:01 | 1 | 2 |

    | 2 | TABLE ACCESS BY LOCAL INDEX ROWID| TEST | 1 | 28 | 4

    (0)| 00:00:01 | 1 | 2 |

    |* 3 | INDEX RANGE SCAN | LOCAL_NOPRE | 1 | | 3

    (0)| 00:00:01 | 1 | 2 |

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

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

    Predicate Information (identified by operation id):

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

    3 - access("B"=1)

    通过local_nopre,oracle不能排除分区,两个分区都必须考虑,此查询未做分区消除。使用非前缀索引,要做到分区消除,必须使用一个允许分区消除的查询。

    SQL> drop index local_pre;

    索引已删除。

    SQL> select * from test where a= 1 and b=1;

    执行计划

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

    Plan hash value: 2334989887

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

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

    | Id | Operation | Name | Rows | Bytes | Cost

    (%CPU)| Time | Pstart| Pstop |

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

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

    | 0 | SELECT STATEMENT | | 1 | 28 | 2

    (0)| 00:00:01 | | |

    | 1 | PARTITION RANGE SINGLE | | 1 | 28 | 2

    (0)| 00:00:01 | 1 | 1 |

    |* 2 | TABLE ACCESS BY LOCAL INDEX ROWID| TEST | 1 | 28 | 2

    (0)| 00:00:01 | 1 | 1 |

    |* 3 | INDEX RANGE SCAN | LOCAL_NOPRE | 1 | | 1

    (0)| 00:00:01 | 1 | 1 |

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

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

    Predicate Information (identified by operation id):

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

    2 - filter("A"=1)

    3 - access("B"=1)

    通过查看执行计划,Oracle利用了分区消除。因为使用了条件a = 1,Oracle拥有了足够的信息,从而使用非前缀索引也能做到分区消除。

    根据这个例子中创建的分区表,如果经常使用如下查询:

    select * from test where a = 1 and b = 1;

    select * from test where b = 1;

    可以测试创建(b,a)索引的效果,此索引以上两个查询都可以使用。如果创建局部前缀索引(a ,b),很可能只对第一个查询有用,对第二个查询不能作分区消除,但能否用得上索引,需要测试,看执行计划是否走index skip scan。

    来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/23577591/viewspace-704078/,如需转载,请注明出处,否则将追究法律责任。

    转载于:http://blog.itpub.net/23577591/viewspace-704078/

    展开全文
  • 环境:Oracle 12.2.0.1注:未确定10g,11g...很多时候,如果需要在一个巨大的表上创建新的索引,例如这个表示一个基站性能数据,可能整张表有3-5亿条。如果按照以往的操作,明显是非常可怕的事情:消耗巨量的时间不...
  • 表用A列作分区,索引用B做局部分区索引,若where条件中用B来查询,那么oracle会扫描所有的表和索引的分区,成本会比分区更高,此时可以考虑用B做全局分区索引 。 假设一个大表WIP_D_CSN_MASTER , 其中以...
  • Oracle分区索引

    2018-07-08 10:54:54
    分区索引分为两类:Locally partitioned index(局部分区索引)Globally partitioned index(全局分区索引)下面就来详细解析一下这两类索引。 一:Locally partitioned index(局部分区索引)1. 概念:局部分区...
  • Oracle分区表及分区索引

    千次阅读 2017-08-10 17:06:52
    Oracle分区索引 索引与表类似,也可以分区; ...分区索引分为两类: ...Locally partitioned index(局部分区索引)Globally partitioned index(全局分区索引) ...局部分区索引随表对索引完成相应的分区
  • 分区索引

    2017-08-09 08:51:21
    索引与表类似,也可以分区; 分区索引分为两类: Locally partitioned index(局部分区索引) Globally partitioned index(全...
  • Oracle 分区表的索引、分区索引 ...索引分为两类:locally partition index(局部分区索引)、globally partition index(全局分区索引)。 1. 局部分区索引(locally partition index) 局部分区索引随表...
  • 数据库-分区索引

    千次阅读 2016-05-25 16:21:52
    分区索引分为本地分区索引(局部分区索引)和全局分区索引。其中本地分区索引又分为有前缀(prefix)的索引和无前缀(nonprefix)的索引。全局索引目前只支持有前缀的索引.B树索引和位图索引都可以分区,但是HASH索引...
  • 全局分区索引

    2015-12-29 15:44:22
    分区索引,包括全局分区索引和局部分区索引2种 全局分区索引 :  索引的分区键可以选择跟表的分区键不一致。能用于表的unique与primary约束。 建成后有多个段,每个段代表一个索引分区,每个索引分区中的键值可以...
  • Oracle的分区索引技术

    2011-12-23 15:21:15
    在Oracle中,和表一样,索引也可以分区。有两种类型的分区索引,局部分区索引和全局分区索引。1. 局部分区索引局部分区索引使用LOCAL关键字创建,其分区边界与表相同,即与每个表分区相关...
  • 分区索引初步理解

    2011-11-20 17:54:40
    分区索引类型:局部分区索引与全局分区索引。局部分区索引使用与底层表相同的机制分区;全局分区索引使用与底层表不同的机制进行分区,索引按区间或散列对索引进行分区,一个全局索引分区可能指向任何表分区或所有表...
  • ♣答案部分索引按照是否分区可以分为分区索引(Partitioned Indexes)和非分区索引(NonPartitioned Indexes),如下图所示:图3-12分区索引与分区表类似,分区索引被分解成更小、更易于管理的索引片断。分区索引提高了...
  • 表用A列作分区,索引用B做局部分区索引(local partitioned indexes),若where条件中用B来查询,那么oracle会扫描所有的表 和索引的分区,成本会更高,此时可以考虑用B做全局分区索引(global partitioned indexes...
  • 局部索引一定是分区索引,分区键等同于表的分区键,分区数等同于表的分区数,一句话,局部索引的分区机制和表的分区机制一样。2.如果局部索引的索引列以分区键开头,则称为前缀局部索引。3.如果局部索引的列不是以...
  • oracle分区索引

    2015-09-01 10:52:59
    表可以按range、hash、list分区,表分区后,其...1.局部索引一定是分区索引,分区键等同于表的分区键,分区数等同于表的分区数,一句话,局部索引的分区机制和表的分区机制一样。 2.如果局部索引的索引列以分区键开头
  • 全局分区索引在一个索引分区中包含来自多个表分区的键。一个全局分区索引的分区键是分区表中不同的或指定一个范围的值。在创建全局分区索引时,必须定义分区键的范围和值。 全局索引只能是B树索引。Oracle在默认...
  • 表可以按range,hash,list分区,表分区后,其上的索引和普通表上的索引有所...局部索引一定是分区索引,分区键等同于表的分区键,分区数等同于表的分区说,一句话,局部索引的分区机制和表的分区机制一样。 2.  如

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 18,650
精华内容 7,460
关键字:

局部分区索引