外键上索引作用的一个实际测试

 

今天又看了下上次给部分表的外键加上索引后的效果,发现仍旧有一些sql查询速度比较慢,查看执行plan,发现也没用到子表外键上的索引,而且主表也没有索引,完全就是2个表的full access。

于是坐下来测试了一下这个sql,测试的主表大概有将近100万数据,子表大概几百万数据,sql查询子表的结果有6600条记录。

1、主表和子表完全没有索引,出第一条结果3秒多点

2、主表加上索引,子表仍旧full access,出第一条结果1.7秒。

3、主表加上索引,子表用/*+ INDEX(t index) */强制使用外键上的索引,出第一条结果0.3秒。

仔细看了执行计划,发现区别在于情况2的两表连查用得是hash join,cost也就10000多,但是情况3的时候,虽然子表使用索引基本上没有cost,但两表联查用的是nested loop,Oracle估算的cost高达34000,从效果看,这个外键索引还是应该用的,感觉oracle高估了hashjoin的性能,也可能是服务器机器太烂吧(2006年左右的P590),

改程序的sql太麻烦了,好多地方,只能在主表上加好索引,能快一点是一点了,禁用hashjoin涉及整个数据库所有sql,这种事也不能干,只能先就这样了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值