背景:oracle11g RAC4台机器,有2个表上亿数据使用了年度(year)的range分区发现结果不理想,我印象中选中分区字段能够去掉相当一部分数据,效率也应该高,发现不是这样的,于是各种测试,
现象发现:其中一个表跟网上说的相符合,用的range分区,分区字段也没有建立索引,但是走分区表,走已有的索引字段,这个就不写了,记录一下另外一个表跟网上不一致的情况
SELECT count(*) FROM inspect p where p.code= '11111' and p.year = 2019;
1、分区是用range(year)的情况
1.1给code加上索引(本地和全局一样):执行计划不走索引,不走分区,为全表扫描
1.2给year和code加上联合索引:测试环境不走索引,不走分区,为全表扫描;生产环境走- -!
2、分区是list(year)的情况
2.1给code加上索引(本地和全局差不多):走分区,走code索引;
2.2给year和code加上联合索引:走分区,走联合索引;
2.3总结2.1和2.2的效率一样,只是执行计划的基数2.1稍大而已,不影响效率,都是0.013s左右
3、由于本表查询的条件相对比较多,因此有测试了一下其它字段单个索引和联合索引的影响(基于list分区的),比如code,name分别建立索引,在联合建立一个索引,总结如下
3.1单个索引(0.017s)比联合索引(0.013s)慢0.004s,性能高23%
3.2单独查询code索引和查询以code开头的联合索引速度基本一致,这个时候建立联合索引比较划算