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 索引