我是CROSS APPLY的新手,試圖理解它的工作機制。特別是,在做一些測試時,我發現在CROSS APPLY語句中包含一個GROUP BY子句會大大提高聚合的性能,但這似乎有點違反直覺。我想讓我感到困惑的是操作的確切順序。T-SQL與GROUP BY交叉應用
這裏是我的測試:
declare @cust table (CUSTID int, NAME varchar(30), MaxOrder decimal, TotalAmountSpent decimal, OrderCount int)
declare @order table (OID int, CUSTID int, AMOUNT decimal)
insert into @cust values (01, 'Fred', 0, 0, 0)
insert into @cust values (02, 'Mary', 0, 0, 0)
insert into @cust values (03, 'Karl', 0, 0, 0)
insert into @order values (20, 01, 6.00)
insert into @order values (21, 03, 10.00)
insert into @order values (22, 03, 20.00)
update @cust
set MaxOrder = app.MaxOrder, TotalAmountSpent = app.TotalAmountSpent, OrderCount = app.OrderCount
from @cust c
cross apply (
select MAX(AMOUNT) MaxOrder, SUM(AMOUNT) TotalAmountSpent, COUNT(OID) OrderCount
from @order o
where c.CUSTID = o.CUSTID
group by o.CUSTID
) app
select * from @cust
這將產生正確的結果:
CUSTID NAME MaxOrder TotalAmountSpent OrderCount
1 Fred 6 6 1
2 Mary 0 0 0
3 Karl 20 30 2
註釋掉GROUP BY導致瑪麗的價值觀爲NULL被覆蓋:
CUSTID NAME MaxOrder TotalAmountSpent OrderCount
1 Fred 6 6 1
2 Mary NULL NULL 0
3 Karl 20 30 2
所以雖然兩個結果集都可以被認爲是「正確的」,但第一種方法隻影響那些行實際上相關。在一個更大的數據集上,這似乎有點提高了性能。
以下是我對此感到困惑的內容:一般來說,我相信在任何SQL語句中,WHERE子句都將在GROUP BY子句之前處理,不是嗎?在這種情況下,SQL Server查詢優化器是否知道在應用左右表之間的WHERE子句之前首先執行GROUP BY?令我感到驚訝的是,以這種方式編寫這個文件導致了正確的結果和更好的表現對引擎蓋下發生了什麼的解釋將非常感謝。
謝謝!
我還不能投票,但這是有幫助的,謝謝。 – SQLDM 2014-10-10 14:01:05