0Pricing
SQL Academy · レッスン

複数テーブル結合の性能チューニング

結合計画を読み、ヒントで結合順序を指定し、中間行数を減らして複数テーブルのクエリを高速に保ちます。

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

JOIN は行数を増加させる

A にフィルタに一致する行が1万件あり、B に A の各行あたり5件の一致がある場合、A JOIN B は5万行を生成します。各行に5件の一致がある C を追加すると、25万行になります。中間結果の行数がコストを左右します。

早くフィルタし、後で JOIN する

選択性の高い述語は、できるだけ早い段階で適用してください。

-- Slow — filters AFTER joining:
SELECT u.email FROM users u JOIN orders o ON o.user_id = u.id
WHERE u.country = 'US' AND o.total > 1000;

-- Same query, planner usually pushes filters down automatically.
-- For complex queries, force it with a CTE/subquery filter.

すべての JOIN 列にインデックスを付ける

JOIN の各側には、結合列のインデックスが必要です。PK には自動的にインデックスが作成されますが、子テーブルの FK には明示的なインデックスが必要です。

CREATE INDEX orders_user_id_idx ON orders(user_id);

列を減らしてメモリを削減する

必要な列だけを SELECT してください。幅の広い中間行は、ハッシュやソートのバッファを大きく消費します。

-- Wide:
SELECT * FROM users u JOIN orders o ON ...

-- Narrow:
SELECT u.id, u.email, o.id, o.total FROM users u JOIN orders o ON ...

スター型結合とスノーフレーク型

ファクトテーブルを複数の小さなディメンションテーブルと結合する構成は、分析でよく使われます。各ディメンションのキーにインデックスがあることを確認してください。

JOIN の順序が重要な場合

通常はプランナーが JOIN の順序を選択しますが、テーブルが多数(12個以上)あると探索を諦めることがあります。join_collapse_limit を調整するか、CTE として書き換えてください。

最適化の障壁としての CTE

PG 12 以降では、CTE はデフォルトでインライン化されます。マテリアライズを強制してプランナーの障壁にするには、WITH ... AS MATERIALIZED を使用します。小さな中間結果を一度だけ計算したい場合に便利です。

ハッシュ結合、マージ結合、ネストループの比較

プランナーは行数の推定に基づいて選択します。EXPLAIN ANALYZE を実行して、何が選択されたか、推定が正確だったかを確認してください。

EXPLAIN (ANALYZE, BUFFERS)
SELECT ... FROM big_a JOIN big_b ON ...;

不正確な推定は不適切な実行計画につながる

EXPLAIN ANALYZE の rows と actual rows が大きく異なる場合、統計情報が古くなっています。ANALYZE を実行し、複数列間の相関には拡張統計を使用してください。

ANALYZE orders;
CREATE STATISTICS orders_country_status (dependencies)
  ON country, status FROM orders;

インデックス列に関数を適用しない

インデックス付きの JOIN キーに関数を適用すると、インデックスが使えなくなります。式インデックスを追加するか、書き換えてください。

-- Bad (LOWER on indexed email kills the index):
ON LOWER(u.email) = LOWER(c.email)

-- Better — add a functional index:
CREATE INDEX users_email_lower ON users(LOWER(email));

負荷の高い JOIN にはマテリアライズドビュー

5つのテーブルを結合するクエリがダッシュボードに使われている場合は、その結果をマテリアライズして毎晩更新してください。データの鮮度と引き換えに速度を得られます。

実際のクエリを分析する

pg_stat_statements を使って、複数の JOIN を含むクエリのうち最も遅いものを見つけてください。実際に問題となっているクエリを最適化します。

まとめ

複数テーブルの JOIN の成否を左右するのは、次の要素です。

  • すべての JOIN 列にあるインデックス
  • プッシュダウンされた選択性の高い述語
  • 正確な統計情報(ANALYZE)
  • 必要最小限の列
  • 再利用のメリットが鮮度を上回る場合のマテリアライズ

クイックチェック

EXPLAIN ANALYZE で、推定が rows=1 なのに actual rows=500000 と表示されています。最も可能性の高い対処は何ですか?

よくある質問

「複数テーブル結合の性能チューニング」レッスンは無料ですか?

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

「複数テーブル結合の性能チューニング」で何を学びますか?

結合計画を読み、ヒントで結合順序を指定し、中間行数を減らして複数テーブルのクエリを高速に保ちます。 ブラウザで直接実行するハンズオンコードでSQL Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

「複数テーブル結合の性能チューニング」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

  1. CROSS JOINと直積
  2. ラテラル結合(LATERAL JOIN)
  3. アンチ結合とセミ結合(NOT EXISTS)
  4. 複数テーブル結合の性能チューニング
← SQL Academyに戻る