注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

金生丽水,雨润轩德

 
 
 

日志

 
 

Oracle 索引优化一例  

2014-11-04 08:15:57|  分类: oracle |  标签: |举报 |字号 订阅

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

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018