0Pricing
SQL Academy · レッスン

UNION ALLとUNION(重複排除のコスト)

UNIONが行う重複排除の処理を理解し、重複がないと分かっている場合にUNION ALLが高速な理由を学びます。

「UNION ALLとUNION(重複排除のコスト)」はCoddyKit上の無料SQL Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSQL Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 SQL Academyコースには全4レッスンが含まれています。

違い

  • UNION — 結合し、重複を除去します
  • UNION ALL — 結合し、すべての行を保持します

UNION ALLのほうが高速

重複排除には、ソートまたはハッシュが必要でコストがかかります。UNION ALLはその処理を完全に省略します。重複が発生しないと分かっている場合は、必ずUNION ALLを選択してください。

例:各集合が互いに重ならない場合

有効な注文とアーカイブ済みの注文は重複しないため、UNION ALLを使用します。

SELECT * FROM active_orders
UNION ALL
SELECT * FROM archived_orders;

例:重複が重要な場合

同じ行が繰り返される可能性のある注文イベントの一覧を結合する場合、各発生を実際に1件ずつ数えたいことがあります。その場合はUNION ALLを使用します。

SELECT order_id FROM email_events
UNION ALL
SELECT order_id FROM push_events;

例:重複を除去したい場合

2つのニュースレター配信リストに同じメールアドレスが含まれている場合、メールアドレスごとに一意の1行だけを取得します。

SELECT email FROM list_a
UNION
SELECT email FROM list_b;

異なるデータソースとのUNION ALL

すべてのレポートを表示するフィード用に、メトリクステーブルを積み重ねます。

SELECT 'login' AS event, ts, user_id FROM logins
UNION ALL
SELECT 'signup',          ts, user_id FROM signups
UNION ALL
SELECT 'purchase',        ts, user_id FROM purchases
ORDER BY ts DESC LIMIT 100;

各サブSELECT内の順序

多くのデータベースでは、UNION/UNION ALLの個々のサブSELECT内にあるORDER BYを無視します(サブSELECTを囲んでいる場合を除きます)。ORDER BYは最後に適用してください。

SELECT ... FROM a
UNION ALL
SELECT ... FROM b
ORDER BY ts DESC;

各集合へのLIMIT

両側を括弧で囲むと、それぞれに独立してLIMITを適用できます。

(SELECT id FROM new_orders ORDER BY created_at DESC LIMIT 10)
UNION ALL
(SELECT id FROM old_orders ORDER BY created_at DESC LIMIT 10);

プランナーがUNIONを最適化する場合

プランナーが両側の集合が重ならないこと(たとえば、相互排他的なWHEREフィルター)を証明できる場合、内部的にUNIONをUNION ALLとして実行することがあります。ただし、それを前提にしないでください。明示的に指定しましょう。

UNION と OR の比較

同じインデックスを効率的に使えない OR 条件では、別々にインデックスを使う2つのクエリを UNION ALL で結合したほうが高速になることがあります。

-- Slow OR (may not use either index):
SELECT * FROM users WHERE city = 'NYC' OR country = 'DE';

-- Sometimes faster:
SELECT * FROM users WHERE city = 'NYC'
UNION
SELECT * FROM users WHERE country = 'DE';

列の順序に注意

集合演算子は名前ではなく位置で対応付けます。SELECT a, b FROM t1 UNION ALL SELECT b, a FROM t2 のようにすると意味が入れ替わるため、注意してください。

まとめ

パフォーマンスを優先する場合は UNION ALL をデフォルトとし、重複排除が本当に必要な場合だけ UNION を使用してください。

クイックチェック

より高速な UNION ALL に UNION を置き換えられるのは、どのような場合ですか?

よくある質問

「UNION ALLとUNION(重複排除のコスト)」レッスンは無料ですか?

はい。「UNION ALLとUNION(重複排除のコスト)」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、SQL Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 SQL Academyコースには全4レッスンが含まれています。

「UNION ALLとUNION(重複排除のコスト)」で何を学びますか?

UNIONが行う重複排除の処理を理解し、重複がないと分かっている場合にUNION ALLが高速な理由を学びます。 ブラウザで直接実行するハンズオンコードでSQL Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

SQL Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのSQL Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「UNION ALLとUNION(重複排除のコスト)」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このSQL Academyレッスンでコードを書いて実行できますか?

はい。すべてのSQL Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. UNION、INTERSECT、EXCEPT
  2. UNION ALLとUNION(重複排除のコスト)
  3. CASE式とピボットクエリ
  4. クロス集計パターン(PostgreSQL crosstab())
← SQL Academyに戻る