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

来源:互联网 发布:java dos 运行命令 编辑:程序博客网 时间:2024/06/04 19:55

 

今天又看了下上次给部分表的外键加上索引后的效果,发现仍旧有一些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
原创粉丝点击