小表是否就真的没有必要加索引

之前总结了部分使用索引的规则,其中有一条: 小表不必要加索引

今个,在读Oracle性能诊断艺术的时候,作者对这条规则提出了异议,说是曾经在一次调优中,对一个小表添加索引,使得整个查询的性能得以提高30倍。


我觉得非常诧异,再细读下去才得知,小表做一次全表扫描,和做一次索引定位,时间的相差也许只有0.01秒,一般情况下是可以忽略不计的, 但小表如果在查询中处于核心路径的话,对小表的访问次数可能会放大很多倍,如果放大10000倍,那就相差100秒,这样的消耗还是相当严重的。


为此,特意准备了一组数据进行测试,目前开发的项目中正好有这样的大小表,可以测:

placement 20w行左右, schverfile 100行


select p.trafficId from placement p where exists (select null from schverfile s where p.schedFileName = s.schedFileName)


采用子关联查询,分别在schverfile.schedFileName有索引和无索引的条件下跑, 前者是0.91秒,后者确有27.37秒。 对于每一行p的记录,都会调用一次s的查询,相当于放大了20W倍


所以,得出结论是,小表是否加索引,还得看其运行的查询,处于核心路径的小表,如果不会频繁修改,最好是加上索引,以防万一。 如果是频繁修改的,那就还得在权衡维护索引的消耗和全表扫描消耗之间做一个权衡了。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值