UNION ve UNION ALL arasındaki fark nedir?


Yanıtlar:


1734

UNIONyinelenen kayıtları kaldırır (sonuçlardaki tüm sütunlar aynı olduğunda) UNION ALL.

Kullanırken UNIONyerine bir performans isabeti varUNION ALLVeritabanı sunucusunun yinelenen satırları kaldırmak için ek iş yapması gerektiğinden, , ancak genellikle yinelenenleri (özellikle raporlar geliştirirken) istemezsiniz.

UNION Örneği:

SELECT 'foo' AS bar UNION SELECT 'foo' AS bar

Sonuç:

+-----+
| bar |
+-----+
| foo |
+-----+
1 row in set (0.00 sec)

UNION ALL örneği:

SELECT 'foo' AS bar UNION ALL SELECT 'foo' AS bar

Sonuç:

+-----+
| bar |
+-----+
| foo |
| foo |
+-----+
2 rows in set (0.00 sec)

179
Bunun anlamı, sendikanın kopyalar için sonucu taraması gerektiği için çok daha az performans göstermesidir
Matthew Watson

19
BİRLİK TÜMÜ, özellikle de farklı türlerin eksikliği nedeniyle, daha performanslı olacaktır. Genel pratiğim, özellikle çoğaltmak istemedikçe UNION ALL'u kullanmaktır.
Adam Caviness

6
Sadece burada çok iyi yorumlar / cevaplar olduğunu fark ettim, bu yüzden wiki bayrağını açtım ve performans hakkında bir not ekledim ...
Jim Harte

250
İnternet gibi ağın bir darboğaz olduğu gerçek dünyada UNION ALL, UNION'dan daha yavaş olabilir. Birçok yinelenen satırı aktarmanın maliyeti, sorgu yürütme süresi avantajını aşabilir. Bu durum duruma göre analiz edilmelidir.
Charles Burns

23
@AdamCaviness Yorumunuz pek mantıklı değil.
kojow7

285

Hem UNION hem de UNION ALL, iki farklı SQL'in sonucunu birleştirir. Kopyaları ele alma biçimleri farklıdır.

  • UNION, sonuç kümesinde yinelenen satırları ortadan kaldırarak bir DISTINCT gerçekleştirir.

  • UNION ALL kopyaları kaldırmaz ve bu nedenle UNION'dan daha hızlıdır.

Not: Bu komutları kullanırken, seçilen tüm sütunların aynı veri türünde olması gerekir.

Örnek: İki tablomuz varsa, 1) Çalışan ve 2) Müşteri

  1. Çalışan tablosu verileri:

resim açıklamasını buraya girin

  1. Müşteri tablosu verileri:

resim açıklamasını buraya girin

  1. BİRLİĞİ Örneği (Yinelenen tüm kayıtları kaldırır):

resim açıklamasını buraya girin

  1. UNION ALL Örnek (Sadece kayıtları birleştirir, kopyaları ortadan kaldırmaz, bu nedenle UNION'dan daha hızlıdır):

resim açıklamasını buraya girin


3
"seçilen tüm sütunların aynı veri türünde olması gerekir" - aslında, işler o kadar da katı değildir (ilişkisel model açısından iyi bir şey değildir!). SQL standardı, ilgili sütun tanımlayıcısının ad dışında aynı olması gerektiğini söylüyor .
oneday5

47

UNIONyinelemeleri kaldırır, oysa kaldırmaz UNION ALL.

Çıkartmak için sonuç kümesi sıralanmış gerekir kopyalar ve bu ise edebilir BİRLİĞİ performansı üzerinde etkisi olan, verilerin hacmine bağlı olarak sıralanmakta olan ve (Oracle için çeşitli RDBMS parametrelerinin ayarları PGA_AGGREGATE_TARGETile WORKAREA_SIZE_POLICY=AUTOya SORT_AREA_SIZEve SOR_AREA_RETAINED_SIZEeğer WORKAREA_SIZE_POLICY=MANUAL).

Temel olarak, bellekte gerçekleştirilebiliyorsa sıralama daha hızlıdır, ancak veri hacmi hakkında aynı uyarı geçerlidir.

Eğer yineleme olmadan iade veriye ihtiyaç Tabii ki, o zaman gerekir verilerinizin kaynağına bağlı olarak, UNION.

Ben "çok daha az performans" yorum hak kazanmak için ilk yazı yorum olurdu, ama bunu yapmak için (itibar) yetersiz var.


1
"Yinelenenleri kaldırmak için sonuç kümesinin sıralanması gerekir" - belki aklınızda belirli bir satıcınız vardır ancak soruda satıcıya özgü etiketler yoktur. Olsa bile, kopyaların sıralamadan kaldırılamayacağını kanıtlayabilir misiniz?
oneday5

2
Farklı, sonuçları "örtülü olarak" sıralar, çünkü yinelenenleri kaldırmak sıralı bir kümede daha hızlıdır. bu, döndürülen sonuç kümesinin aslında bu şekilde sıralandığı anlamına gelmez, ancak çoğu durumda farklı (ve dolayısıyla UNION) sonuç kümesini dahili olarak sıralar.
DevilSuichiro



13

Aşağıdaki gibi bir sorgu çalıştırarak yinelemeleri önleyebilir ve yine de UNION DISTINCT'den (aslında UNION ile aynıdır) çok daha hızlı çalışabilirsiniz:

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

Parçaya dikkat edin AND a!=X. Bu sendikadan çok daha hızlı.


4
Bu, satırları atlar ve bu nedenle bir NULL değerleri içeriyorsa beklenen sonucu veremez. Ayrıca, yine de aynı sonucu döndürmez UNION- UNIONayrıca alt sorguların döndürdüğü yinelemeleri kaldırır, oysa yaklaşımınız bunu yapmaz.
Frank Schmitt

@FrankSchmitt - bu cevap için teşekkürler; alt sorgular hakkında bu biraz tam olarak bilmek istedim!
Doradus

11

Buradaki tartışmaya iki sentimi eklemek için: UNION operatörü saf, SET odaklı bir UNION olarak - örneğin set A = {2,4,6,8}, set B = {1,2,3,4 }, BİRLİK B = {1,2,3,4,6,8}

Setleri ile uğraşırken, sayıların 2 ve 4 bir unsuru ya kadar iki kez görünen istemem olduğu veya olmadığı bir sette.

Bununla birlikte, SQL dünyasında, iki setteki tüm öğeleri bir "torbada" birlikte görmek isteyebilirsiniz {2,4,6,8,1,2,3,4}. Ve bu amaçla T-SQL operatöre teklif verir UNION ALL.


2
Nitpick: UNION ALLT-SQL tarafından " sunulmuyor ". UNION ALLANSI SQL standardının bir parçasıdır ve MS SQL Server'a özgü değildir.
Frank Schmitt

1
'Nitpick' yorumu TSQL'de "Union All" u kullanamayacağınız anlamına gelebilir, ancak kullanabilirsiniz. Elbette, yorum bunu söylemez , ancak okuyan biri onu çıkarabilir.
JosephDoggie

10

UNION komut çok gibi, iki tablo ilgili bilgi seçmek için kullanılır komutu. Ancak, komutu kullanırken, seçilen tüm sütunların aynı veri türünde olması gerekir. İle yalnızca farklı değerler seçilir.
UNIONJOINUNIONUNION

UNION ALL komut eşittir olması dışında, komuta
UNION ALLUNIONUNION ALL seçer tüm değerler.

Arasındaki fark UnionveUnion all olmasıdır Union allyerine bu sadece bir tabloya sorgu özelliklerini ve biçerdöverler onları uydurma tüm tablolardan tüm satırları çeker, yinelenen satırları ortadan kaldırmaz.

Bir UNIONdeyim SELECT DISTINCT, sonuç kümesinde etkin bir şekilde a yapar . Döndürülen tüm kayıtların birliğinizden benzersiz olduğunu biliyorsanız UNION ALL, bunun yerine kullanın, daha hızlı sonuç verir.


8

Hangi veritabanının önemli olduğundan emin değilim

UNIONve UNION ALLtüm SQL sunucularında çalışmalıdır.

UNIONBüyük performans sızıntısı olan gereksizlerden kaçınmalısınız . Temel kural olarak UNION ALLhangisini kullanacağınızdan emin değilseniz kullanın.


Bu soruda SQL Server etiketi yok. Her zamanki en iyi performansı nedeniyle kopyaları döndüren seçenek yanlış tavsiye olduğunu düşünüyorum.
oneday5

1
@onedayO zaman tüm OPB (örneğin MySQL, PostGreSQL, Oracle, SQL Server) ile eşanlamlı olarak OP "SQL Sunucuları" ifadesini kullandığını tahmin. İfadeler talihsiz olsa da (ve tabii ki yanılmış olabilirim).
Frank Schmitt

@FrankSchmitt: Listelediğiniz ürünlerin hiçbiri gerçekten RDBMS değil :)
onedayO zamanlar

1
@ detaylar ne zaman özen gösterilmeli? En azından en.wikipedia.org/wiki/Relational_database_management_system benimle aynı fikirde gibi görünüyor - açıkça Microsoft SQL Server, Oracle Database ve MySQL'den bahsediyor. Yoksa Oracle ve Oracle Database arasındaki fark hakkında nitpicky misin?
Frank Schmitt

8

UNION - ayrı kayıtlara neden

olurken

UNION ALL - kopyalar dahil tüm kayıtlarla sonuçlanır.

Her ikisi de engelleme operatörleri ve bu yüzden şahsen JOINS'i Engelleme Operatörleri (UNION, INTERSECT, UNION ALL vb.)

Sendika işleminin Birlik işlemine kıyasla neden düşük performans gösterdiğini göstermek için aşağıdaki örnek.

CREATE TABLE #T1 (data VARCHAR(10))

INSERT INTO #T1
SELECT 'abc'
UNION ALL
SELECT 'bcd'
UNION ALL
SELECT 'cde'
UNION ALL
SELECT 'def'
UNION ALL
SELECT 'efg'


CREATE TABLE #T2 (data VARCHAR(10))

INSERT INTO #T2
SELECT 'abc'
UNION ALL
SELECT 'cde'
UNION ALL
SELECT 'efg'

resim açıklamasını buraya girin

UNION ALL ve UNION operasyonlarının sonuçları aşağıdadır.

resim açıklamasını buraya girin

Bir UNION ifadesi, sonuç kümesinde etkili bir SELECT DISTINCT yapar. Döndürülen tüm kayıtların birliğinizden benzersiz olduğunu biliyorsanız, bunun yerine UNION ALL'u kullanın, daha hızlı sonuç verir.

UNION kullanılması , Yürütme Planında Farklı Sıralama işlemleriyle sonuçlanır . Bu beyanı ispatlayan kanıt aşağıda gösterilmiştir:

resim açıklamasını buraya girin


3
Bu yanıttaki her şey zaten söylenmişti, çok fazla kafa karıştırıcı (farklı şeyler yaptıkları zaman sendikalara katılmayı önermek, bununla ne kastettiğinizi veya hangi veritabanı sunucuları için geçerli olduğunu açıklamaksızın bir sebep olarak "engelleme") veya çok yanıltıcıdır (sizin ekran görüntüsünde sizin yüzdeleri gerçek fiili kullanım için geçerli değildir UNION/ ' UNION ALL).

Engelleme Operatörleri TSQL'de iyi bilinen operatörlerdir. Engelleme operatörlerinin yaptığı her şey Joins tarafından sağlanabilir ancak tam tersi olamaz. Birliğin neden sendikadan daha iyi performans gösterdiğini ve aynı zamanda yürütme planında tam olarak nerede olduğunu göstermek için farklı Sıralama işlemi resimde daire içine alınmıştır. Yüzdelerle oynamak için T1 ve T2 tablolarına daha fazla veri eklemekten çekinmeyin!
DBA

Teknik unionolarak joins ve bazı gerçekten kötü cases kombinasyonunu kullanarak sonuçları üretebilirsiniz , ancak bu darn-near sorgusunu okumak ve korumak imkansız hale getirir ve benim deneyimime göre de performans için korkunç. Karşılaştır: select foo.bar from foo union select fizz.buzz from fizzkarşıselect case when foo.bar is null then fizz.buzz else foo.bar end from foo join fizz where foo.bar is null or fizz.buzz is null
Devin Lamothe

@DBA Yanıtınız yalnızca MS SQL Server kullanıcıları için geçerlidir. OP kullandıkları RDBMS'den hiç bahsetmedi - MySQL, PostgreSQL, Oracle, SQLite, ... kullanıyor olabilirler
Frank Schmitt

6

birleşim iki tablodan farklı değerler seçmek için kullanılır, burada birleşim tümü tablolardan yinelemeler dahil tüm değerleri seçmek için kullanılır


6

Bir Venn diyagramı ile anlamak iyidir.

İşte kaynağın bağlantısı . İyi bir açıklama var.

resim açıklamasını buraya girin


5
İkinci resminiz, ikisinin olmadıkları zaman birbirini dışlayan olduklarını gösteriyor. Resim birinciyle aynı görünmelidir, ancak 'kavşak elips' ()ikinci kez gösterilmelidir. Aslında, ikinci düşüncede, union allsonuç bir küme olmadığından, bir Venn diyagramı kullanarak bunu çizmeye çalışmamalısınız!
oneday2

5

(Microsoft SQL Server Book Online'dan)

BİRLİĞİ [TÜMÜ]

Birden çok sonuç kümesinin tek bir sonuç kümesi olarak birleştirileceğini ve döndürüleceğini belirtir.

HERŞEY

Tüm satırları sonuçlara dahil eder. Buna kopyalar da dahildir. Belirtilmezse, yinelenen satırlar kaldırılır.

UNIONDISTINCTsonuçlara benzer bir yinelenen satır uygulandığında çok uzun sürecektir .

SELECT * FROM Table1
UNION
SELECT * FROM Table2

şuna eşdeğerdir:

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

DISTINCTSonuçların uygulanmasının bir yan etkisi, sonuçlar üzerinde bir sıralama işlemidir .

UNION ALLsonuçlar sonuçlarda keyfi sıra ile gösterilir, ancak UNIONsonuçlar sonuçlara ORDER BY 1, 2, 3, ..., n (n = column number of Tables)uygulanmış olarak gösterilir . Yinelenen bir satırınız olmadığında bu yan etkiyi görebilirsiniz.


5

Bir örnek ekliyorum,

BİRLİĞİ , farklı -> yavaşla birleşiyor, çünkü karşılaştırması gerekiyor (Oracle SQL geliştiricisinde, sorgu seçin, maliyet analizini görmek için F10 tuşuna basın).

BİRLİĞİ TÜMÜ , belirgin bir şekilde birleşmeden -> daha hızlı.

SELECT to_date(sysdate, 'yyyy-mm-dd') FROM dual
UNION
SELECT to_date(sysdate, 'yyyy-mm-dd') FROM dual;

ve

SELECT to_date(sysdate, 'yyyy-mm-dd') FROM dual
UNION ALL
SELECT to_date(sysdate, 'yyyy-mm-dd') FROM dual;

2

UNION iki yapısal olarak uyumlu tablonun içeriğini tek bir kombine tabloda birleştirir.

  • Fark:

Arasındaki fark UNIONve UNION ALLolmasıdır UNION willoysa omit yinelenen kayıtları UNION ALLyinelenen kayıtları içerecektir.

UnionSonuç kümesi artan sırada sıralanırken UNION ALLSonuç kümesi sıralanmaz

UNIONDISTINCTSonuç kümesinde a gerçekleştirir, böylece yinelenen satırları ortadan kaldırır. Oysa UNION ALLyinelenenleri kaldırmaz ve bu nedenle daha hızlıdır UNION. *

Not : performansı UNION ALLgenellikle daha iyi olacak UNIONçünkü, UNIONyinelemeleri kaldırma ek işi yapmak için sunucu gerektirir. Bu nedenle, kopyaların olmayacağından emin olunan veya kopyaların sorun olmadığı UNION ALLdurumlarda, performans nedenleriyle kullanılması önerilir.


1
"Birlik Sonuç kümesi artan düzende sıralanır" - olmadığı sürece ORDER BY, sıralanan sonuçlar garanti edilmez. Belki aklınızda belirli bir SQL satıcısı var (o zaman bile, tam olarak ne oluyor ...?) Ama bu sorunun hiçbir satıcısı = belirli etiketi yok.
oneday5

"İki yapısal uyumlu tablolar içeriğini birleştirir" - Sana :) gerçekten iyi bu bölümü ifade ettik düşünüyorum
onedaywhen

2

Diyelim ki iki masanız var Öğretmen ve Öğrenci

Her ikisinde de böyle farklı bir Ad ile 4 Sütun var

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

resim açıklamasını buraya girin

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

resim açıklamasını buraya girin

Aynı sayıda sütuna sahip bu iki tabloya UNION veya UNION ALL uygulayabilirsiniz. Ancak farklı ad veya veri türlerine sahiptirler.

UNION2 tabloya işlem uyguladığınızda , tüm yinelenen girdileri ihmal eder (tablodaki satırın tüm sütun değerleri başka bir tablo ile aynıdır). Bunun gibi

SELECT * FROM Student
UNION
SELECT * FROM Teacher

sonuç olacak

resim açıklamasını buraya girin

Başvurduğunuzda UNION ALL 2 tabloya , yinelenen tüm girdileri döndürür (2 tabloda bir satırın herhangi bir sütun değeri arasında herhangi bir fark varsa). Bunun gibi

SELECT * FROM Student
UNION ALL
SELECT * FROM Teacher

Çıktı resim açıklamasını buraya girin

Verim:

Açıkçası UNION ALL performansı, yinelenen değerleri kaldırmak için ek görev yaptıkları için UNION'dan daha iyidir . Sen o kontrol edebilirsiniz Zaman Tahmini Yürütme basın tarafından ctrl + L at MSSQL


Gerçekten mi? Dört sıralı bir sonuç için mi ?! Bunun, UNIONniyet vermek için kullanmak istediğiniz bir senaryo olduğunu düşünürüm (örneğin, kopya yok) çünkü UNION ALLmutlak olarak herhangi bir gerçek yaşam performansı kazancı vermesi olası değildir.
oneday5

2

Çok basit bir ifadeyle, UNION ve UNION ALL arasındaki fark, UNION'un yinelenen kayıtları atlaması ve UNION ALL'un yinelenen kayıtları içermesidir.


1

Eklemek istediğim bir şey daha var.

Birlik : - Sonuç kümesi artan düzende sıralanır.

Tümünü Birleştir: - Sonuç kümesi sıralanmamış. iki Sorgu çıktısı eklenir.


Doğru ! BİRLİĞİ iki alt sonucun sırasını değiştirebilir.
gracchus

6
Bu yanlış. Bir UNIONirade DEĞİL artan düzende sıralamak sonucu. Bir sonuçta kullanmadan gördüğünüz herhangi bir sipariş order bysaf tesadüf. DBMS, kopyaları kaldırmak için etkili olduğunu düşündüğü herhangi bir stratejiyi kullanmakta serbesttir. Bu sıralama olabilir , ancak bir karma algoritma veya tamamen farklı bir şey olabilir - ve strateji satır sayısı ile değişecektir. Bir uniono görünür 100 satırlarla sıralanmış 100.000 satırlarla olmayabilir
a_horse_with_no_name

2
Sorgu üzerinde ORDER BY deyimi olmadan, RDBMS herhangi bir sırayla satırları döndürmek için ücretsizdir . Bir UNION işleminden elde edilen sonuç kümesinin "artan sırada" döndürüldüğü gözlemi, yalnızca veritabanı tarafından gerçekleştirilen "benzersiz bir tür" işleminin bir yan ürünüdür . Gözlenen davranış garanti edilmez . Bu yüzden ona güvenme. Spesifikasyon satırları belirli bir sırayla döndürecekse, uygun bir ORDER BYcümle ekleyin .
spencer7593

1

Union Vs Union ALL In Sql Arasındaki Fark

SQL'de Birlik Nedir?

UNION operatörü, iki veya daha fazla veri kümesinin sonuç kümesini birleştirmek için kullanılır.

Each SELECT statement within UNION must have the same number of columns
The columns must also have similar data types
The columns in each SELECT statement must also be in the same order

Union Vs Union Örnekli


1

Önemli! Oracle ve Mysql arasındaki fark: diyelim ki t1 t2 aralarında yinelenen satırlar yok, ancak tek tek yinelenen satırlar var. Örnek: t1'in 2017'den satışları ve 2018'den t2'si var

SELECT T1.YEAR, T1.PRODUCT FROM T1

UNION ALL

SELECT T2.YEAR, T2.PRODUCT FROM T2

ORACLE UNION TÜMÜNDE her iki tablodaki tüm satırları getirir. Aynı şey MySQL'de de gerçekleşecek.

Ancak:

SELECT T1.YEAR, T1.PRODUCT FROM T1

UNION

SELECT T2.YEAR, T2.PRODUCT FROM T2

In ORACLE t1 ve t2 arasında yinelenen değerler olduğundan, UNION iki tablodan tüm satırları getirir. Diğer taraftan MySQL tablo t2 içinde orada da tablo t1 içinde yinelenen satırlar olabilir ve çünkü resultset az satır olacak!


0

UNION diğer yandan yinelenen kayıtları kaldırır. Ancak, işlenecek veri yığınını kontrol etmek gerekir ve sütun ile veri türü aynı olmalıdır.

sendika, satırları seçmek için dahili olarak "farklı" davranış kullandığından, zaman ve performans açısından daha maliyetlidir. sevmek

select project_id from t_project
union
select project_id from t_project_contact  

bu bana 2020 kayıtları veriyor

diğer yandan

select project_id from t_project
union all
select project_id from t_project_contact

bana 17402'den fazla satır veriyor

öncelik perspektifinde her ikisi de aynı önceliğe sahiptir.


0

Eğer yoksa ORDER BY, a UNION ALLsatırları gittikçe geri getirebilir, oysa bir UNIONkerede tüm sonucu vermeden önce sorgunun sonuna kadar beklemenizi sağlar. Bu, zaman aşımı durumunda bir fark yaratabilir - a UNION ALL, bağlantıyı olduğu gibi canlı tutar.

Bu nedenle, bir mola sorununuz varsa ve sıralama yoksa ve kopyalar bir sorun değilse, UNION ALLoldukça yararlı olabilir.


Ancak ilk sonuç yığınınız birçok kez çoğaltılabilir: bu ne kadar yararlı ?!
oneday5

0

UNION ve UNION ALL, iki veya daha fazla sorgu sonucunu birleştirmek için kullanılır.

UNION komutu iki tablodan farklı ve ilişkili bilgileri seçerek yinelenen satırları ortadan kaldırır.

Öte yandan, UNION ALL komutu her iki tablodan da tüm satırları görüntüleyen tüm değerleri seçer.


0

Alışkanlık olarak, daima UNION ALL kullanın . Son derece dağınık olabilecek kopyaları ortadan kaldırmanız gerektiğinde ve burada diğer yorumlarda okuyabileceğiniz özel durumlarda yalnızca UNION kullanın.


0

UNION ALLayrıca daha fazla veri türü üzerinde de çalışır. Örneğin, uzamsal veri türlerini birleştirmeye çalışırken. Örneğin:

select a.SHAPE from tableA a
union
select b.SHAPE from tableB b

fırlatacak

The data type geometry cannot be used as an operand to the UNION, INTERSECT or EXCEPT operators because it is not comparable.

Ancak union allolmayacak.


-1

Tek fark şudur:

"UNION" yinelenen satırları kaldırır.

"UNION ALL" yinelenen satırları kaldırmaz.


13
Bu, kabul edilen cevaba kıyasla nasıl değer katar?
Nick

@Nick Kısa cevap.
Mostafa Vatanpour

Bu verileri almak için kabul edilen cevabın önemli bir bölümünü okumak zorunda kalırsanız daha kısa bir avantaj olabilir. Ancak bu durumda, kabul edilen cevap tüm bu bilgileri ilk cümlede içerir ve bundan sonra farkın etkilerini ayrıntılı olarak tartışmaya devam eder.
dmckee --- eski moderatör kedi yavrusu
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.