索引——分区索引

局部索引local index   
1. 局部索引一定是分区索引,分区键等同于表的分区键,分区数等同于表的分区说,一句话,局部索引的分区机制和表的分区机制一样。
2. 如果局部索引的索引列以分区键开头,则称为前缀局部索引。
3. 如果局部索引的列不是以分区键开头,或者不包含分区键列,则称为非前缀索引。
4. 前缀和非前缀索引都可以支持索引分区消除,前提是查询的条件中包含索引分区键。
5. 局部索引只支持分区内的唯一性,无法支持表上的唯一性,因此如果要用局部索引去给表做唯一性约束,则约束中必须要包括分区键列。
6. 局部分区索引是对单个分区的,每个分区索引只指向一个表分区,全局索引则不然,一个分区索引能指向n个表分区,同时,一个表分区,也可能指向n个索引分区,
对分区表中的某个分区做truncate或者move,shrink等,可能会影响到n个全局索引分区,正因为这点,局部分区索引具有更高的可用性。
7. 位图索引只能为局部分区索引。
8. 局部索引多应用于数据仓库环境中。

全局索引global index
1. 全局索引的分区键和分区数和表的分区键和分区数可能都不相同,表和全局索引的分区机制不一样。
2. 全局索引可以分区,也可以是不分区索引,全局索引必须是前缀索引,即全局索引的索引列必须是以索引分区键作为其前几列。
3. 全局分区索引的索引条目可能指向若干个分区,因此,对于全局分区索引,即使只动,截断一个分区中的数据,都需要rebulid若干个分区甚
至是整个索引。
4. 全局索引多应用于oltp系统中。
5. 全局分区索引只按范围或者散列hash分区,hash分区是10g以后才支持。
6. oracle9i以后对分区表做move或者truncate的时可以用update global indexes语句来同步更新全局分区索引,用消耗一定资源来换取高度的可用性。
7. 表用a列作分区,索引用b做局部分区索引,若where条件中用b来查询,那么oracle会扫描所有的表和索引的分区,成本会比分区更高,此时可以考虑用b做全局分区索引


索引键压缩
假如有表     college( 院系   班级   学号)在院系,班级上建符合索引
则索引可能是
1         1
1         2
1         3
2         1
2         2
2         3
这时可以压缩为   
1            1
              2
              3
2            1
              2
      3
总结:节省了空间,但是增加了索引的复杂度,耗费了更多的cpu,但也因为占空间小,能缓存更多索引,增大了命中率
位图索引
假如有表   stu(is   sex in('M','F'))
值\行 1   2   3   4   5   6    7
M              0   1   1   0  0    1    1
F              1    0   0   1   1   0    0
总结:一个位图索引键条目指向多行,如果一个会话修改了索引的数据,则这个索引指向的所有的行都会被锁定。oracle无法锁定位图索引条目中单独的一位。这大大影响并发性。一般用于数据仓库

优化器不用索引的原因
1:没有使用复合索引的第一列
2:select count(*) from dual;  索引建立在一些可以为null的列上
3: 索引列上加了函数
4:字符列上的索引用数字匹配

普通表
普通索引
全局分区索引(相当于将一个索引分成若干个小索引)
分区表
普通索引
全局分区索引
本地索引()

全局分区索引      只有一种 (解释如下)
前缀索引:索引第一列是分区键
全局索引的好处是将分区分成了多个小索引,实现了将索引分区消除,但不能表分区消除。
情况1:假如你用索引的第2列分区,你又想享受索引分区消除的优点,你的查询条件中肯定有第2列,但是如果只有第2列的话,因为没有用到第一列。优化器根本就不会不会使用这个索引。如果有索引的第二列,也有索引第一列的话。oracle会根据索引第一列直接全索引扫描了。索引分区的意义就不存在了。
情况2:假如将索引按第1列分区, 你又想享受索引分区消除的优点, 你的查询条件中肯定有第1列, 如果只有第1列,你可以享受索引分区消除的优点。如果查询条件有第1列,也有第2列,你还是可以享受索引分区消除的优点

如果有一个表分区修改了,那么整个全局索引都无法使用

本地索引       分2种(不管哪一种分区键总是索引键的子集)
前缀索引:索引的第一列是分区键
非前缀索引:索引的第一列不是分区键
本地索引:看你常用什么列访问了,本地索引一般和分区键没有什么关系

一个表分区的修改不会影响其他表分区的分区索引


索引种类
普通表
create table t(a number,b number,c number,d number)
create index t_a on t(a)                                     创建普通索引
create index t_b on t(b) global                         感觉和上面一样
CREATE  INDEX  t_c ON t(c)                           全局 分区索引
GLOBAL PARTITION BY RANGE(c)
 (
 PARTITION IDX_P1 values less than (1000),
 PARTITION IDX_P2 values less than (2000),
 PARTITION IDX_P3 values less than (MAXVALUE)
 )
 begin 
 for i in 1..2 loop
 insert into t values(i,i,i,i);
 end loop;commit;
 end;
 select * from t where c=1   不用索引因为行数很少
 truncate table t
  begin 
 for i in 1..2000 loop
 insert into t values(i,i,i,i);
 end loop;commit;
 end;
 select * from t where c=1   用索引,因为行数很多
不考虑删除索引分区的问题,因为删除全局索引的一个分区没有任何意义。
分区表
 CREATE TABLE t1( 
  a NUMBER(5),  
  b VARCHAR2(30),  
  c NUMBER(10) 
  d number)
PARTITION BY RANGE(a)( 
PARTITION p1 VALUES LESS THAN(10), 
PARTITION p2 VALUES LESS THAN(20) 
); 
create index t1_a on t1(a)                                    普通索引
create index t1_b on t1(b) global                        感觉和上面一样
CREATE  INDEX  t1_d ON t1(d) local                 本地分区索引    
CREATE  INDEX  t1_c ON t1(c)                           全局分区索引
GLOBAL PARTITION BY RANGE(c)
 (
 PARTITION IDX_P1 values less than (1000),
 PARTITION IDX_P2 values less than (2000),
 PARTITION IDX_P3 values less than (MAXVALUE)
 )  
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值