Oracle 索引优化一例
2014-11-04 08:15:57| 分类:
oracle
| 标签:
|举报
|字号大中小 订阅
在进行优化调整时,发现有某个表的查询比较慢,通过对具体SQL语句的分析,现场总结了几点规律,今天回来后,又连接到测试环境中进行了测试和验证。
一个总体原则,就是要保证在查询时系统能够使用结果集最小的索引。
1. 要为离散度较高的列建立单独的索引。
2. 不要为离散度高的列与其他列建立符合索引。
3. 不要为离散度不高的列建立单独索引。
现场的例子是为车牌号和结算时间两个列建立了复合索引,同时又为记账时间建立了单独索引,并且没有车牌号的单独索引。 在某个SQL语句中,使用了车牌号和记账时间作为查询条件,多次测试验证表明,oracle数据库的优化器不会选择符合索引进行查询,而是采用了单独记账时间索引,而记账时间列中,每天的数据量都在数十万左右,也就是说虽然走了索引,但数据库会读取这几十万条记录(以查询一天为例)中找到特定车牌号。测试时通过命令把记账时间所以变得不可见,此时优化器会选择车牌号和结算时间的复合索引,此时,针对特定车牌号的记录共计约有100多条,系统会在这100多条记录中找到特定时间的记录,就会快的多。通过在SQL中指定车牌号复合索引也可以获得较快查询效率。
从测试的情况看,如果查询中具有单独列的索引,系统会首选这种索引,即使是这种索引的效率较低,也不会去选择效率较高的符合索引。(从理论上看,oracle 11g的优化器都是采用CBO策略,就是基于成本的考量来选择执行计划,这种情况按照道理不符合成本考量原则,这是我们认识的一个误区,所以才没有将优化更早的考虑到索引效率这方面的问题上。现场没有来得及问专家,请找机会请教一下专家的看法),此时如果对车牌号这种离散度较高的列使用了单独索引,效果可能会好一些。
评论这张
转发至微博
转发至微博
评论