zoukankan      html  css  js  c++  java
  • 分区表 全局索引和本地索引 区别

    SQL> create user test100 identified by test100 ;
    
    User created.
    
    
    
    SQL> grant dba to test100;
    
    Grant succeeded.
    
    ALL_IND_PARTITIONS 描述,对于每个index 分区访问到当前用户, 分区级别分区信息, 分区的存储参数
    
    
    相关的视图:
    
    DBA_IND_PARTITIONS 描述所有的index 分区在数据库
    
    INDEX_OWNER              索引所有者
    
    INDEX_NAME               索引名字
    
    PARTITION_NAME           分区名字
    
    drop table T48_TRANSACTION_MODEL;
    create table T48_TRANSACTION_MODEL
    (
      trandate    DATE,
      orgid       VARCHAR2(11),
      stan        NUMBER,
      subjectno   VARCHAR2(10),
      subjectname VARCHAR2(50),
      acctid      NUMBER
    )
    partition by range (TRANDATE)
    (
      partition XYZ_20100000 values less than (TO_DATE(' 2011-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS')),
       
      partition XYZ_20110101 values less than (TO_DATE(' 2011-01-02 00:00:00', 'SYYYY-MM-DD HH24:MI:SS')),
    
      partition XYZ_20110102 values less than (TO_DATE(' 2011-01-03 00:00:00', 'SYYYY-MM-DD HH24:MI:SS')),
    
      partition XYZ_20110103 values less than (TO_DATE(' 2011-01-04 00:00:00', 'SYYYY-MM-DD HH24:MI:SS')),
      
      partition XYZ_20110104 values less than (TO_DATE(' 2011-01-05 00:00:00', 'SYYYY-MM-DD HH24:MI:SS')),
    
      partition XYZ_20110105 values less than (TO_DATE(' 2011-01-06 00:00:00', 'SYYYY-MM-DD HH24:MI:SS')),
      partition XYZ_20110106 values less than (TO_DATE(' 2011-01-07 00:00:00', 'SYYYY-MM-DD HH24:MI:SS')),
      partition XYZ_20110107 values less than (TO_DATE(' 2011-01-08 00:00:00', 'SYYYY-MM-DD HH24:MI:SS'))
    );
    
    SQL> select * from dba_ind_partitions where index_owner='TEST100';
    
    no rows selected
    
    
    create index T48_TRANSACTION_MODEL_IDX1 on T48_TRANSACTION_MODEL(stan) local;
    
    
    create index T48_TRANSACTION_MODEL_IDX2 on T48_TRANSACTION_MODEL(acctid)  ;
    
    
    
    
    SQL> select index_owner,index_name,partition_name from dba_ind_partitions where index_owner='TEST100';
    
    INDEX_OWNER		       INDEX_NAME		      PARTITION_NAME
    ------------------------------ ------------------------------ ------------------------------
    TEST100 		       T48_TRANSACTION_MODEL_IDX1     XYZ_20110107
    TEST100 		       T48_TRANSACTION_MODEL_IDX1     XYZ_20110106
    TEST100 		       T48_TRANSACTION_MODEL_IDX1     XYZ_20110105
    TEST100 		       T48_TRANSACTION_MODEL_IDX1     XYZ_20110104
    TEST100 		       T48_TRANSACTION_MODEL_IDX1     XYZ_20110103
    TEST100 		       T48_TRANSACTION_MODEL_IDX1     XYZ_20110102
    TEST100 		       T48_TRANSACTION_MODEL_IDX1     XYZ_20110101
    TEST100 		       T48_TRANSACTION_MODEL_IDX1     XYZ_20100000
    
    8 rows selected.
    
    
    查看是否是分区索引:
    
    SQL> select owner,index_name,index_type,table_owner,table_name,table_type,partitioned from dba_indexes where owner='TEST100';
    
    OWNER			       INDEX_NAME		      INDEX_TYPE TABLE_OWNER			TABLE_NAME		       TABLE_TYPE  PAR
    ------------------------------ ------------------------------ ---------- ------------------------------ ------------------------------ ----------- ---
    TEST100 		       T48_TRANSACTION_MODEL_IDX2     NORMAL	 TEST100			T48_TRANSACTION_MODEL	       TABLE	   NO
    TEST100 		       T48_TRANSACTION_MODEL_IDX1     NORMAL	 TEST100			T48_TRANSACTION_MODEL	       TABLE	   YES
    
    
    partitioned  表明是否索引是分区的(YES) 否则是(NO)
    
    
    我举个 global 索引的例子
    
    
    查询 条件 不走 分区键这个值
    
    但是 我走另外一个where条件
    
    而且选择性很高
    
    
    
    
    就是where 条件里带上了分区键,对应的列 就用LOCAL 
    
    索引高度为3
    
    不跨越分区 扫描3个block +1个 data block
    
    跨越分区 扫描 1000个 分区 *3 +1个data block
    
    
    
    扫描要跨越 多个 分区你就建立 global 
    
    
    条件里不带上了分区键对应的列,对应的列就用GLOBAL
    
    oracle会对主键自动创建全局索引
    
    
    
    
    我 有一个查询
    查询 条件 不走 分区键这个值
    但是 我走另外一个where条件
    
    总结就是
    扫描要跨越 多个 分区
    你就建立 global
    
    global 索引是为了解决 跨越 分区扫描的用的
    
    
    
    
    分区 键
    
    一般情况下 都已经定位到 单独的分区了
    
    你再去建立 对该列的索引 其实 是毫无意思的
    
    
    
    总结:
    全局索引:
    优点:通过索引检索,没有限定分区的谓词、或跨分区时,性能好点,
    缺点:分区维护的时候麻烦,drop分区等维护会失效,dml的时候索引维护成本高,数据大了rebuild也难
    
    local 索引:
    优点:通过索引检索,有限定分区的谓词、不跨分区时,性能好,分区维护容易,dml的索引维护底,rebuild也方便。
    缺点:通过索引检索,又没有限定分区的谓词、或跨分区时,性能不如全局索引
    
    有分区裁剪的,那么其他列就建立分区索引
    
    没有分区裁剪的,那么列就建立global 索引

  • 相关阅读:
    剑指office--------重建二叉树
    剑指office--------二进制中1的个数
    剑指office--------最小的K个数 (待补充)
    剑指office--------二维数组的查找
    剑指office--------替换空格
    Redis集群
    一致性hash算法
    Zab协议(转)
    Redis线程模型
    Http Cookie和session
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13349918.html
Copyright © 2011-2022 走看看