日期:2014-05-16  浏览次数:20617 次

主子表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的话,不会有啥性能问题。(当然前提是硬件不是太差的情况下)