- 论坛徽章:
- 0
|
请求各位大侠来探讨一下这个SQL的执行效率[已搞定]
困扰我数天的这个问题总算搞定了。不敢藏私,写出来给大伙参考参考。
首先,第一个SQL和第二个SQL的结果是不同的。因为B表和C表有联结条件,所以在B表中不存在数据,用第一个SQL它还是会被抽取出来,而用第二个SQL它就不会被抽取出来。
其次,B表和C表联结后得到数据仍然至少有4千6百多万条,甚至更多,可能达到7,8千万条,因此按原来的SQL即第一个SQL执行,对大数据量的操作就要进行两次,而且由于B表和C表的联结条件是大于和小于,因此无法用到表的索引,子查询后和A表联结也无法用到索引,因此速度特别慢,总共花了5个半小时。
后来,将程序修改了一下,首先将C表单独抽取出来。因为C表数据少,所以直接全部抽取出来,存在内存里。然后A表和B表联结,取出所需数据。对每一条数据,去扫描内存,取得所需的C4值。(SQL如下)
由于A表和B表的联结用的都是两者的主键,查询速度相对较快,最终这样修改后的处理只花了15分钟,速度大大的提高了。
C表抽取SQL:
Select C2, C3, C4
From C
Where C1='200303';
A表和B表联结的抽取SQL:
Select A.A2, A.A3, A.A4, A.A5, B.B4, B.B5
From A Left Out Join B
On B.B1='200303'
And B.B2=A.A2
And B.B3=A.A3
Where A.A1='200303'
And A.A5 In ('1', '3', '9');
然后用取到的B4,B5到内存中和C2,C3比较,取得C4。
最后,再次感谢各位大侠,版主的指点。 |
|