中国开发网: 论坛: 程序员情感CBD: 贴子 284167
王中王
麻烦各位牛进来看,尤其是DeepBlue牛,Oracle问题
先客气一下,拜个晚年了!

大数据表,按某字段T(Varchar型的时间字段)分区,一个月一个分区。有常用业务字段A和B(其它字段并不重要),字段A值的重复率不高,B的重复率稍高。建有索引1:A,组合索引2:T,B。
对该表的常用查询有两种:通过条件T、A查询,通过条件T、B查询。
原来应用一直正常,近期由于其它分区表查询索引选择策略不优化的问题,对所有大数据表的分区表进行数据分析(1%抽样,对数据和索引进行分析),促使Oracle选用正确的更合适的索引。分析后,其它表的问题解决,但这个表分析后查询速度反面大幅下降。
查看数据库查询的计划,对条件T、A进行查询时(select * from talbe where t between someday and anotherday and a=something order by T desc),当T的范围在一个月分区时,选用索引1,速度在一秒以内,在T范围跨月时,系统选择索引2,速度很慢,要10几秒甚至更多,通过SQL语句强制使用索引1,速度很快,在一秒以内。

问题处理及疑问:
1、以为索引1没带时间信息,造成跨分区查询时选择了不够优化的索引,于是增加一索引3(T, A),重新进行数据分析,但数据库仍没有选择更优的索引,强制使用索引3,发现还没有原索引1快(4秒多)(这是个疑问1,理论上更快的索引反而速度慢,而且慢好几秒)。
2、把索引1修改为全局索引(原为分区索引),问题仍未解决。
3、经过一番折腾,发现有索引3时,把Where条件中的order by T desc的DESC去掉,数据库就能选择索引3的索引。(这是疑问2,DESC对索引选择策略有什么影响,在这里的影响是偶然还是必然?)
4、一个类似的表,有类似的T/A/B字段以及类似的索引2、索引3,当时速度慢,选择的是不优化的索引,就是通过对表进行数据分析,让数据库选择了较优化的索引,但同样的方法使用到这个表反而引起了问题,情况正相反(这是疑问3,数据分析的后果不确定嘛?)
5、这个表数据分析后发生了慢的问题,于是采用Delete分析结果的方法进行回退,但回退后数据库仍选择“错误”的索引(这是疑问4,为什么回退失败?数据库的查询计划和分析结果到底有什么关系?)
6、应用的SQL语句是个组合查询,条件语句是拼出来的,如果在SQL中直接指定索引,一来应用实现起来很麻烦(要根据不同的组合条件拼前面的指定索引语句),二来应用的数据库依赖性增强。除了改应用,到底可不可以通过对分区数据表进行定时分析的方法确保数据库选择更优的索引?数据库对分区表的索引选择策略到底有没有固定可循的原则?(这是疑问5)
http://wangzw.wordpress.com/
个性化台历、日历制作
http://shop33697570.taobao.com/

相关信息:


欢迎光临本社区,您还没有登录,不能发贴子。请在 这里登录