主子表Group by求和的问题
有类似于如下,A 、B 两个表
A
------------------------
Order_ID Order_Number Order_Date
1 1000 2014-01-01 ....
2 900 2014-04-01 ....
3 5000 2014-04-01 ....
.....
------------------------
B
------------------------
Prod_ID Order_ID Send_Number
1 1 500
2 1 500
3 3 2000
4 2 500
.....
------------------------
A 对B是1对多的关系。
A是客人订单表,B是送货表
两个表的数据量都很大,A表约在8、9万行,B表超过20万行。
我要计算一段时间内的客人订购数和对应客人订单的送货数。这样先从A表中筛选出一个较小的数据量在和B表做联接在做Group by 求和速度就快很多了。
下边两个写法,我自己试验,有时候是第一个写法快些,有时候是第二个写法快些。这个有时候是毫无规律的。
所以请问大家,哪个写法更好些?
Select * into #T From A Where A.Order_Date Between '2014-04-01 00:00:00' And '2014-04-02 00:00:00'
写法一:
Select B.Order_ID,Sum(Purch_Number) From B,#T T Where T.Order_ID=B.Order_ID Group by B.Order_ID
写法二:
Select Order_ID,Sum(Purch_Number) From B Where B.Order_ID in (Select Order_ID from #T) Group by B.Order_ID
------解决方案--------------------写法一快,尤其在orderid返回较多的情况下会更明显
不清楚你为什么要单独还整个临时表,只要时间列加上索引,放到一句sql里就ok了
------解决方案--------------------Select B.Order_ID,Sum(Purch_Number) From B inner into A on A.Order_ID=B.Order_ID
where a.Order_Date Between '2014-04-01 00:00:00' And '2014-04-02 00:00:00'
and '一堆杂七杂八的条件'
Group by B.Order_ID
--不用临时表的速度一定会要快些。
------解决方案--------------------应该写法一快吧,order ID作为索引
------解决方案--------------------做好索引,直接对A进行sum,然后跟B关联即可。
8,9万行 ,索引OK的话,不会有啥性能问题。(当然前提是硬件不是太差的情况下)