2016-01-29 76 views
2

SQL在這兩個語句之間的性能有差異嗎?SQL Server查詢:Union vs Distinct union所有性能

SELECT distinct 'A' as TableName, Col1, Col2, Col3 FROM A 
UNION ALL 
SELECT distinct 'B' as TableName, Col1, Col2, Col3 from B 

SELECT 'A' as TableName, Col1, Col2, Col3 FROM A 
UNION 
SELECT 'B' as TableName, Col1, Col2, Col3 from B 

這一點,類似的問題,如UNION vs DISTINCT in performance的是,我可以確認的時間提前了單獨的表我使用不會有任何之間的重複記錄之間的區別他們,只在個別表內。

執行計劃對我來說看起來是一樣的,因爲它在連接之前對各個表進行排序。但是,如果我從它們中移除標量,則UNION ALL的計劃基本保持不變,但UNION在變體之前更改爲並置。我會將大約20個表連接在一起,並且不清楚是否執行20個單獨的DISTINCT比最後執行一個大的DISTINCT快,因爲我仍然可以確認這些表不會共享它們之間的任何重複(僅在相同表)。

+0

將兩個查詢放在一個會話中,激活執行計劃並執行。比較實際執行計劃中的百分比 – DimaSUN

+0

這是我所做的,但我當時只有幾千條記錄 - 不足以測試實際總執行時間的差異,更不用說調整行數,列數,列的數據類型等,以獲得一般答案。正如我所說,我執行的執行計劃看起來是一樣的。即使不是,一個下降,另一個上升並不意味着總執行時間。 – WakeflyCBass

回答

2

DISTINCT不一定按排序實現,也可以通過哈希來實現。

這兩個都是耗費內存的操作,減少數據大小以減少需要的內存量,這對於併發性是有利的。

排序的算法複雜度爲n log n,這意味着所需工作隨着n的增長而增長linearitmically。在此基礎上,排序10個較小的尺寸集合s通常應該快於排序一個更大的尺寸集合10*s

0

讓我們不要談論SQL一分鐘。

案例1:說,有一個100個數字的列表。

List: 1,2,3,4,....60 and then 61 repeats 40 times. 

該列表不安排,你不知道這一點在手。現在您正試圖從100個號碼的列表中搜索唯一值,然後對它們進行排序。

案例2:正如您所說,有兩個列表中沒有重複記錄。

List 1: 1,2,3,4,....60 
List 2: 61,61,61,61... 40 times 

它滿足您提到的條件。同樣,列出一個數字的順序是隨機的。但是,現在您正在搜索的獨特價值,從,而不是更大的一組100號,並從那裏你會得到61

來到SQL另一個列表列表中,這一切都取決於規模你在每個表格中的數據,可能還有其他一些因素。

我接受它不是一個完整的答案,仍然希望這有助於。