分区表建索引问题

时间:2022-06-25 08:40:54
问题如下:我经常做一个表的查询包括4个字段是 where a=? and b=? and c=? and d=? 
现在按照 a和b字段建立了复合分区,现在想知道建索引的时候是建立一个包括a,b,c,d四个字段的联合索引好,还是只建立c,d两个字段的联合索引(因为a,b已经分区了).

10 个解决方案

#1


感觉是cd的联合索引号.查询里用到了a和b,会找到相应的分区.

#2


引用楼主 mixmix 的回复:
问题如下:我经常做一个表的查询包括4个字段是 where a=? and b=? and c=? and d=? 
现在按照 a和b字段建立了复合分区,现在想知道建索引的时候是建立一个包括a,b,c,d四个字段的联合索引好,还是只建立c,d两个字段的联合索引(因为a,b已经分区了).


a和b字段建立了复合分区  查询指定了分区表  可以考虑cd 

#3


既然是经常用,可以建四个组合索引。你可以试下,对比下效率啊。

#4


你查询条件就指定了A,B,而A,B你又建了分区的,因此只需要考虑再建C,D的联合索引就行了,主要是你查询条件已经定死了要用A,B分区。 

#5


如果你的查询条件每次都是4个,用联合索引好.

#6


还要看你的dml的情况啊。

#7


我看了我们的生产数据库,分区索引里面都包括了分区字段,但是位置不是第一个。至于为啥俺也不清楚。
帮顶。

#8


引用楼主 mixmix 的回复:
问题如下:我经常做一个表的查询包括4个字段是 where a=? and b=? and c=? and d=? 
现在按照 a和b字段建立了复合分区,现在想知道建索引的时候是建立一个包括a,b,c,d四个字段的联合索引好,还是只建立c,d两个字段的联合索引(因为a,b已经分区了).


如果你的查询是希望使用这个索引,同时又希望使用到分区特性partition pruning,那建议将分区字段加入索引,同时将索引建为local index,local index实际就是一个分区一棵索引树,oracle在查询local索引时,如果查询条件中有限制查询部分分区,就会只查询对应分区的索引树,而不会扫描全表的索引,这样对于效率提高也很有好处。

另外,如果分区字段并不是高筛选度的字段,那建议将高筛选度的字段放在索引前列,原因和一般索引的原理一样,只要是local索引,即使查询条件中的分区字段没有作为索引匹配列,一样可以使用到分区特性partition pruning

比如你的例子分区字段为A、B,索引中还有C、D两个字段,索引中的列顺序建为{C、D、A、B}
对于下面的查询一样可以限定到到某个分区,里面的A、B其实没法作为真正的匹配列,这个可以从执行计划中看出
select ... from ...
where c = ? and a=? and b?

#9


索引建在c,d上面吧。

#10


分区表如果想要用到分区查询,查询条件中肯定包含A=? B=?否则分区没有效果

你可以试一下到底建C、D还是A、b c d自己测试一下效果吧

#1


感觉是cd的联合索引号.查询里用到了a和b,会找到相应的分区.

#2


引用楼主 mixmix 的回复:
问题如下:我经常做一个表的查询包括4个字段是 where a=? and b=? and c=? and d=? 
现在按照 a和b字段建立了复合分区,现在想知道建索引的时候是建立一个包括a,b,c,d四个字段的联合索引好,还是只建立c,d两个字段的联合索引(因为a,b已经分区了).


a和b字段建立了复合分区  查询指定了分区表  可以考虑cd 

#3


既然是经常用,可以建四个组合索引。你可以试下,对比下效率啊。

#4


你查询条件就指定了A,B,而A,B你又建了分区的,因此只需要考虑再建C,D的联合索引就行了,主要是你查询条件已经定死了要用A,B分区。 

#5


如果你的查询条件每次都是4个,用联合索引好.

#6


还要看你的dml的情况啊。

#7


我看了我们的生产数据库,分区索引里面都包括了分区字段,但是位置不是第一个。至于为啥俺也不清楚。
帮顶。

#8


引用楼主 mixmix 的回复:
问题如下:我经常做一个表的查询包括4个字段是 where a=? and b=? and c=? and d=? 
现在按照 a和b字段建立了复合分区,现在想知道建索引的时候是建立一个包括a,b,c,d四个字段的联合索引好,还是只建立c,d两个字段的联合索引(因为a,b已经分区了).


如果你的查询是希望使用这个索引,同时又希望使用到分区特性partition pruning,那建议将分区字段加入索引,同时将索引建为local index,local index实际就是一个分区一棵索引树,oracle在查询local索引时,如果查询条件中有限制查询部分分区,就会只查询对应分区的索引树,而不会扫描全表的索引,这样对于效率提高也很有好处。

另外,如果分区字段并不是高筛选度的字段,那建议将高筛选度的字段放在索引前列,原因和一般索引的原理一样,只要是local索引,即使查询条件中的分区字段没有作为索引匹配列,一样可以使用到分区特性partition pruning

比如你的例子分区字段为A、B,索引中还有C、D两个字段,索引中的列顺序建为{C、D、A、B}
对于下面的查询一样可以限定到到某个分区,里面的A、B其实没法作为真正的匹配列,这个可以从执行计划中看出
select ... from ...
where c = ? and a=? and b?

#9


索引建在c,d上面吧。

#10


分区表如果想要用到分区查询,查询条件中肯定包含A=? B=?否则分区没有效果

你可以试一下到底建C、D还是A、b c d自己测试一下效果吧