sql - union差異 - union all效能




UNION和UNION ALL有什麼區別? (14)

UNIONUNION ALL什麼區別?



不知道它關係到哪個數據庫

UNIONUNION ALL應該可以在所有SQL Server上工作。

你應該避免不必要的UNION他們是巨大的性能洩漏。 根據經驗法則,如果您不確定使用哪個,請使用UNION ALL


UNION刪除另一手中的重複記錄UNION ALL不會。 但是需要檢查將要處理的大量數據,並且列和數據類型必須相同。

因為工會在內部使用“不同的”行為來選擇行,因此它在時間和性能方面成本更高。 喜歡

select project_id from t_project
union
select project_id from t_project_contact  

這給了我2020年的記錄

在另一方面

select project_id from t_project
union all
select project_id from t_project_contact

給我超過17402行

在優先級角度上都具有相同的優先級。


UNION和UNION ALL用於組合兩個或更多查詢結果。

UNION命令從兩個表中選擇不同的和相關的信息,這將消除重複的行。

另一方面,UNION ALL命令從兩個表中選擇所有的值,它們顯示所有的行。


union用於從兩個表中選擇不同的值,其中union all用於選擇所有值,包括表中的重複值


(來自Microsoft SQL Server Book Online)

UNION [ALL]

指定將多個結果集組合併作為單個結果集返回。

所有

將所有行合併到結果中。 這包括重複。 如果未指定,則刪除重複的行。

UNION將花費太長時間,因為重複行發現像DISTINCT一樣適用於結果。

SELECT * FROM Table1
UNION
SELECT * FROM Table2

相當於:

SELECT DISTINCT * FROM (
    SELECT * FROM Table1
    UNION ALL
    SELECT * FROM Table2) DT

DISTINCT應用於結果的副作用是對結果進行排序操作

UNION ALL結果將顯示為結果上的任意順序。但UNION結果將顯示為應用於結果的ORDER BY 1, 2, 3, ..., n (n = column number of Tables) 。 當你沒有任何重複的行時,你可以看到這種副作用。


UNION刪除重複項,而UNION ALL則不刪除重複項。

為了刪除重複項,必須對結果集進行排序,這可能會影響UNION的性能,具體取決於要排序的數據量以及各種RDBMS參數的設置(對於使用WORKAREA_SIZE_POLICY=AUTO Oracle PGA_AGGREGATE_TARGETSORT_AREA_SIZESOR_AREA_RETAINED_SIZE如果WORKAREA_SIZE_POLICY=MANUAL )。

基本上,如果可以在內存中執行,排序會更快,但同樣適用於數據量的警告。

當然,如果你需要返回沒有重複的數據,那麼你必須使用UNION,這取決於你的數據來源。

我會評論第一篇文章,以評論“性能低得多”的評論,但沒有足夠的聲望(點數)來這樣做。


UNION將兩個結構上兼容的表格的內容合併成一個組合表格。

  • 區別:

UNIONUNION ALL之間的區別在於UNION UNION will省略重複記錄,而UNION ALL將包含重複記錄。

Union結果集按升序排序,而UNION ALL結果集未排序

UNION對其結果集執行DISTINCT ,因此它將消除任何重複的行。 UNION ALL不會刪除重複項,因此它比UNION更快。*

注意 UNION ALL的性能通常會比UNION更好,因為UNION要求服務器執行刪除任何重複項的額外工作。 所以,如果確定不會有重複,或重複不成問題,建議出於性能原因使用UNION ALL


假設你有兩個老師學生

這兩個都有4個不同名稱的列

Teacher - ID(int), Name(varchar(50)), Address(varchar(50)), PositionID(varchar(50))

Student- ID(int), Name(varchar(50)), Email(varchar(50)), PositionID(int)

您可以為具有相同列數的那兩個表應用UNION或UNION ALL。 但他們有不同的名稱或數據類型。

當您在2個表上應用UNION操作時,它會忽略所有重複條目(表中所有行的列值與另一個表相同)。 喜歡這個

SELECT * FROM Student
UNION
SELECT * FROM Teacher

結果將是

當您對2個表應用UNION ALL操作時,它將返回所有具有重複項的條目(如果兩個表中某行的任何列值之間存在任何差異)。 喜歡這個

SELECT * FROM Student
UNION ALL
SELECT * FROM Teacher

產量

性能:

顯然, UNION ALL性能比UNION更好,因為他們執行額外任務來刪除重複值。 您可以通過在MSSQL上ctrl + L來檢查執行估計時間


只需在這裡添加我的兩分錢:可以將UNION運算符理解為一個純粹的,面向SET的UNION - 例如集合A = {2,4,6,8},集合B = {1,2,3, 4},A聯盟B = {1,2,3,4,6,8}

在處理集合時,你不希望數字2和4出現兩次,因為一個元素或者不在一個集合中。

然而,在SQL的世界中,您可能希望將兩個集合中的所有元素集中在一個“包”({2,4,6,8,1,2,3,4})中。 為此,T-SQL提供了操作符UNION ALL


如果沒有ORDER BY ,則UNION ALL可能會將行帶回,而UNION會讓您一直等到查詢的最後,然後再給您一次全部結果集。 這可能會在超時情況下發生變化 - UNION ALL會保持連接不變,就像它一樣。

所以如果你有一個超時問題,而且沒有排序,重複也不是問題, UNION ALL可能相當有用。


您可以通過運行如下查詢來避免重複,並且運行速度比UNION DISTINCT快(實際上與UNION相同):

SELECT * FROM mytable WHERE a=X UNION ALL SELECT * FROM mytable WHERE b=Y AND a!=X

注意AND a!=X部分。 這比UNION快得多。


用維恩圖解理解是很好的。

這裡是link到源代碼。 有一個很好的描述。


用非常簡單的話來說,UNION和UNION ALL之間的區別在於UNION將省略重複記錄,而UNION ALL將包含重複記錄。





union-all