索引分区

有两种:

1、局部索引(Local index),每一个分区都有一个分区索引,而且只索引该分区的数据。该分区的所有数据都索引条目都存放在该分区索引中,该索引分区条目都存放在该该分区数据。

2、按照区间或者散列对索引进行分区:成为全局分区索引(global partition index),一个索引可以指向任何区/全部区。

全局分区索引与表分区数一般不一样,局部分区跟表分区一致。


局部索引

1、局部前缀索引(Local Prefixed index):分区键值在索引键的前几列上(开头),

2、局部非前缀索引(Local Prefixed Index):分区键值不在索引键的前几列,可能在索引键中,也可以不再。

局部前缀分区

create table Part_index_example
(
x number ,
y number,
data varchar2(20)
)
partition by range(x)
(
partition Part_index_part1 values less than(5),
partition Part_index_part2 values less than(10)
);

----创建本地前缀索引
create index local_prefixed on Part_index_example(x,y) local;
 select * from user_ind_partitions;

---创建本地非前缀索引
create index local_noprefixed on Part_index_example(y) local;
 select * from user_ind_partitions;

本地前缀索引:一定有消除功能,

本地非前缀索引:不一定能够消除,如果它里面包含分区键就能消除

两个索引没有好坏,如果在一个分区内走索引全扫描,都一样,但是

insert into Part_index_example(x,y,Data) select mod(level ,10),level,level from dual connect by level<11;
commit;
begin 
       dbms_stats.gather_table_stats(ownname => user,tabname => upper('Part_index_example'),cascade => true);
end;

在x,y上建立主键

alter table Part_index_example add constraint con_partitioned_pk primary key(x,y);-----但是这个主键所公用的索引为本地索引

我在11.1上测试能够,但是有些书上说不允许,并给出了oracle这样做的理由:如果允许主键使用本地分区索引,这样插入一条新纪录,都要扫描该本地索引分区,检查是否有重复,如果直接用一个大索引,这样会减少竞争,增加并发。其实我个人认为这个如果用大索引肯定没有小索引好:1、小索引可以根据插入主键直接定位到具体分区,这样缩小许多倍。2、多个索引分区反而增加了并发,将一些竞争分散到其他分区段上,不论从软件资源和硬件资源,都是一个福音。




全局分区索引

全局分区索引必须是前缀索引

create index global_part_index on Part_index_example(y,x)
global
partition by range(y)
(
   partition global_part1_index values less than(10000) tablespace example,
   partition global_part2_index values less than (maxvalue) tablespace learn 
)

 


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值