- 主题:[求助]关于分区表复合索引的字段顺序
比如通常业务查询sql如下:
select *
from order
where function in ('A','B')
and custom_id in ('123456788')
and init_date >=20250102
and init_date <=20250301
and time >=9150000
and time <=15300000;
已知Oracle库的order表,init_date是分区字段,并且一个月一分区,每天记录数500万条,custom_id是用户ID,function 值只有A,B,C,三个,只要查询条件包含了日期,就会分区裁剪,且每个分区里custom_id显然比init_date字段选择性高,那么问题如下:
1.日期字段是分区字段,是否还需要放到复合索引里(因为在裁剪的分区里通过custom_id似乎也能快速定位目标记录).
2.如果放进去的话,是否放最前面,还是放custom_id之后,因为明显custom_id选择性更好(但deepseek给出了init_date放最前面的建议,我感觉放custom_id似乎会更优?);
3.function需要放到复合索引里吗,还是在filter里和time一并被筛选过滤,所以针对上面的sql推荐的复合索引是哪些字段、什么顺序呢,谢谢各位大佬。用deepseek和腾讯元宝竟然给出了完全相反的建议,所以只能问坛友了
--
修改:lostinT FROM 106.120.74.*
FROM 106.120.74.*
现在的cbo太复杂了
个人感觉,如果你建global索引,那把分区键放后面会好些
如果建local索引,那完全没必要加分区键
【 在 lostinT 的大作中提到: 】
: 比如通常业务查询sql如下:
: select *
: from order
: ...................
--
FROM 222.128.59.*
【 在 SankHeart 的大作中提到: 】
: 现在的cbo太复杂了
: 个人感觉,如果你建global索引,那把分区键放后面会好些
: 如果建local索引,那完全没必要加分区键
只用到了local index,感觉是这样,但是deepseek说通常都是分区键放复合索引第一列。。
--
FROM 106.120.74.*
每天一个分区就不必了。多天在一个分区还是必要的。
【 在 lostinT 的大作中提到: 】
: 只用到了local index,感觉是这样,但是deepseek说通常都是分区键放复合索引第一列。。
--
FROM 221.218.61.*
分区多了,跨分区查询时,优化器就有可能倾向于
使用global索引,而不是local索引,因为使用local
索引会需要访问多个segment对象,我们在生产上遇到过这个问题
【 在 ylh1969 的大作中提到: 】
: 每天一个分区就不必了。多天在一个分区还是必要的。
--
FROM 222.128.59.*
嗯,看楼主最后的方案,最好能发个结果来。
【 在 SankHeart 的大作中提到: 】
: 分区多了,跨分区查询时,优化器就有可能倾向于
: 使用global索引,而不是local索引,因为使用local
: 索引会需要访问多个segment对象,我们在生产上遇到过这个问题
--
FROM 221.218.61.*
嗯,但是分区字段放复合索引的最前面还是放高选择性字段后,还需要测一下
【 在 ylh1969 的大作中提到: 】
:每天一个分区就不必了。多天在一个分区还是必要的。
- 来自 水木社区APP v3.5.7
--
FROM 111.201.89.*
我们没有创建global index
【 在 SankHeart 的大作中提到: 】
:分区多了,跨分区查询时,优化器就有可能倾向于:使用global索引,而不是local索引,因为使用local:索引会需要
- 来自 水木社区APP v3.5.7
--
FROM 111.201.89.*