UNION
との違いは何UNION ALL
ですか?
22 に答える
UNION
重複レコード (結果のすべての列が同じ) は削除されますが、削除されUNION ALL
ません。
UNION
の代わりにを使用するとパフォーマンスが低下しUNION ALL
ます。これは、データベース サーバーが重複行を削除するために追加の作業を行う必要があるためです。ただし、通常、重複行は必要ありません (特にレポートを作成する場合)。
重複を識別するには、レコードは互換性のあるタイプだけでなく、同等のタイプである必要があります。これは、SQL システムによって異なります。たとえば、システムはすべての長いテキスト フィールドを切り捨てて比較用の短いテキスト フィールドを作成したり (MS Jet)、バイナリ フィールドの比較を拒否したりします (ORACLE)。
UNION 例:
SELECT 'foo' AS bar UNION SELECT 'foo' AS bar
結果:
+-----+
| bar |
+-----+
| foo |
+-----+
1 row in set (0.00 sec)
UNION ALL の例:
SELECT 'foo' AS bar UNION ALL SELECT 'foo' AS bar
結果:
+-----+
| bar |
+-----+
| foo |
| foo |
+-----+
2 rows in set (0.00 sec)
UNION と UNION ALL はどちらも、2 つの異なる SQL の結果を連結します。重複を処理する方法が異なります。
UNION は結果セットに対して DISTINCT を実行し、重複行を排除します。
UNION ALL は重複を削除しないため、UNION よりも高速です。
注:このコマンドを使用するときは、選択したすべての列が同じデータ型である必要があります。
例: 2 つのテーブルがある場合、1) 従業員と 2) 顧客
- 従業員テーブル データ:
- 顧客テーブル データ:
- UNION の例 (すべての重複レコードを削除します):
- UNION ALL の例 (重複を排除するのではなく、レコードを連結するだけなので、UNION よりも高速です):
UNION
重複を削除しますが、削除UNION ALL
しません。
重複を削除するには、結果セットを並べ替える必要があります。これは、並べ替えるデータの量やさまざまなRDBMSパラメータの設定(Oracleの場合はまたはおよびif )によっては、UNIONのパフォーマンスに影響を与える可能性があります。PGA_AGGREGATE_TARGET
WORKAREA_SIZE_POLICY=AUTO
SORT_AREA_SIZE
SOR_AREA_RETAINED_SIZE
WORKAREA_SIZE_POLICY=MANUAL
基本的に、ソートはメモリ内で実行できる場合は高速ですが、データの量に関する同じ警告が適用されます。
もちろん、重複せずにデータを返す必要がある場合は、データのソースに応じてUNIONを使用する必要があります。
「パフォーマンスがはるかに低い」コメントを修飾するために最初の投稿にコメントしたと思いますが、そうするための評判(ポイント)が不十分です。
ORACLE では、UNION は BLOB (または CLOB) 列タイプをサポートしていませんが、UNION ALL はサポートしています。
UNION と UNION ALL の基本的な違いは、ユニオン操作では重複した行が結果セットから削除されますが、ユニオン オールでは結合後にすべての行が返されることです。
http://zengin.wordpress.com/2007/07/31/union-vs-union-all/より
UNION
コマンドは
、コマンドUNION
と同様に、2 つのテーブルから関連する情報を選択するために使用されますJOIN
。ただし、UNION
コマンドを使用する場合、選択したすべての列は同じデータ型である必要があります。ではUNION
、個別の値のみが選択されます。
UNION ALL
このUNION ALL
コマンドは、すべての値を選択するUNION
点を除いて、コマンドと同じです。UNION ALL
との違いは、Union
重複する行を排除しないことです。代わりに、クエリの詳細に適合するすべてのテーブルからすべての行を取得し、それらをテーブルに結合します。Union all
Union all
UNION
ステートメントはSELECT DISTINCT
、結果セットに対して効果的に実行します。返されるすべてのレコードがユニオンから一意であることがわかっている場合は、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 よりもはるかに高速です。
ここでの議論に私の 2 セントを追加するだけです:UNION
演算子を純粋な SET 指向の UNION として理解することができます - たとえば、set A={2,4,6,8}、set B={1,2,3,4 }、UNION B = {1,2,3,4,6,8}
セットを扱う場合、要素がセット内にあるかどうかに関係なく、数字 2 と 4 が 2 回出現することは望ましくありません。
ただし、SQL の世界では、2 つのセットのすべての要素を 1 つの「バッグ」{2,4,6,8,1,2,3,4} にまとめて表示したい場合があります。そして、この目的のために、T-SQL は operator を提供しますUNION ALL
。
どのデータベースが重要か分からない
UNION
UNION ALL
すべての SQL Server で動作するはずです。
不要な s を避ける必要がありUNION
ます。これらは大きなパフォーマンス リークです。経験則として、UNION ALL
どちらを使用すればよいかわからない場合に使用してください。
(Microsoft SQL Server Book Online より)
ユニオン[全て]
複数の結果セットを結合して、1 つの結果セットとして返すことを指定します。
全て
すべての行を結果に組み込みます。これには重複が含まれます。指定しない場合、重複する行は削除されます。
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 は 2 つのテーブルから個別の値を選択するために使用され、union all はテーブルから重複を含むすべての値を選択するために使用されます。
例を追加します。
UNION、distinctとマージしています->比較が必要なため、遅くなります(Oracle SQL開発者でクエリを選択し、F10を押してコスト分析を表示します)。
UNION ALL、区別なしでマージしています --> より高速です。
SELECT to_date(sysdate, 'yyyy-mm-dd') FROM dual
UNION
SELECT to_date(sysdate, 'yyyy-mm-dd') FROM dual;
と
SELECT to_date(sysdate, 'yyyy-mm-dd') FROM dual
UNION ALL
SELECT to_date(sysdate, 'yyyy-mm-dd') FROM dual;
UNION
構造的に互換性のある 2 つのテーブルの内容を 1 つの結合テーブルにマージします。
- 違い:
との違いはUNION
、重複レコードUNION ALL
をUNION will
除外するのに対しUNION ALL
、重複レコードを含めることです。
Union
結果セットは昇順でソートされますが、結果セットはソートされUNION ALL
ません
UNION
結果セットに対して a を実行しDISTINCT
て、重複行を排除します。一方、重複は削除されないため、 .*UNION ALL
よりも高速ですUNION
注: のパフォーマンスUNION ALL
は通常、 よりも優れていますUNION
。これUNION
は、サーバーが重複を削除する追加作業を行う必要があるためです。そのため、重複がないことが確実な場合、または重複が問題にならない場合はUNION ALL
、パフォーマンス上の理由から を使用することをお勧めします。
もう1つ追加したいことがあります-
Union :- 結果セットは昇順でソートされます。
Union All :- 結果セットはソートされません。2 つのクエリ出力が追加されるだけです。
がない場合ORDER BY
、 aUNION ALL
はそのまま行を戻す可能性がありますが、 aUNION
を使用すると、結果セット全体を一度に取得する前に、クエリの最後まで待機する必要があります。これは、タイムアウトの状況で違いを生む可能性がありUNION ALL
ます。いわば、接続を維持します。
したがって、タイムアウトの問題があり、並べ替えがなく、重複が問題にならないUNION ALL
場合は、かなり役立つ場合があります。
UNION および UNION ALL は、2 つ以上のクエリ結果を結合するために使用されます。
UNION コマンドは、重複する行を排除する 2 つのテーブルから個別の関連情報を選択します。
一方、UNION ALL コマンドは両方のテーブルからすべての値を選択し、すべての行を表示します。