0Pricing
SQL Academy · レッスン

パーティション横断クエリの効率化

パーティションプルーニングの恩恵を受けるクエリを作成し、EXPLAINでプルーニングを確認します。

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

パーティションキーでフィルタリング

WHERE 句にパーティションキーが含まれている場合にのみ、プルーニングが機能します。

-- Prunes (uses date partitioning):
SELECT * FROM events WHERE ts >= '2024-03-01' AND ts < '2024-04-01';

-- No pruning — scans all partitions:
SELECT * FROM events WHERE user_id = 42;

複合プルーニング

プランナーは、複数レベルにパーティション分割されたテーブルでは、複数のキーに基づいてプルーニングできます。

SELECT * FROM events
WHERE ts >= '2024-03-01' AND ts < '2024-04-01'
  AND user_id = 42;
-- Prunes by date AND by hash partition.

EXPLAIN でプルーニングを確認

プランを確認して、プルーニングが実行されていることを確かめます。

EXPLAIN SELECT * FROM events WHERE ts >= '2024-03-01' AND ts < '2024-04-01';
-- Append
--   -> Seq Scan on events_2024_q1
-- Only Q1 partition shown; others pruned.

制約除外とパーティションプルーニングの違い

現在の PG では、デフォルトで高速な「パーティションプルーニング」が使用されます。以前の「制約除外」はより低速でした。enable_partition_pruning = on になっていることを確認してください。

実行時のプルーニング

パラメータ化クエリ(PREPARE)であっても、PG は実行時にプルーニングできます。

PREPARE p(timestamptz, timestamptz) AS
SELECT * FROM events WHERE ts >= $1 AND ts < $2;

EXECUTE p('2024-03-01', '2024-04-01');
-- Pruning happens at execute, not at parse.

パーティションをまたぐインデックス

インデックスはパーティションに引き継がれます。インデックス対象の列に対するクエリはすべてのパーティションで機能しますが、プランナーは各パーティションのインデックスをスキャンします。

パーティションをまたぐ集約

パーティションキーに対する GROUP BY が最も効果を得られます。それ以外の列に対する GROUP BY では、すべてのパーティションがスキャンされます。

パーティション単位の並列実行

PostgreSQL は、パーティションをまたぐスキャンを並列実行できます(PG 11 以降)。

SET max_parallel_workers_per_gather = 4;
EXPLAIN SELECT COUNT(*) FROM events;
-- Parallel Append over partitions.

パーティション分割されたテーブル間の結合

両方のパーティション分割テーブルが同じパーティションキーを共有している場合、「パーティション単位の結合」によって高速化できます。各パーティションが個別に結合されます。

SET enable_partitionwise_join = on;
-- Now PG can join events to event_metrics partition-by-partition.

よくある間違いを避ける

  • WHERE でパーティションキーに関数を適用しないでください。プルーニングが機能しなくなります
  • クエリにパーティションキーを含めるのを忘れないでください
  • 数千個の小さなパーティションに分割しないでください。プランニングのオーバーヘッドが支配的になります

適切なパーティション数

数千個ではなく、数十個から少なくとも数百個程度を目安にしてください。各パーティションにはプランニングのオーバーヘッドがあります。非常に細かい粒度が必要な場合は、サブパーティションを使用します。

パーティション単位のメンテナンス

VACUUM、ANALYZE、REINDEX はパーティション単位で実行され、並列実行も可能です。適切な範囲であれば、パーティション数が多いほど効果が積み重なります。

まとめ

パーティショニングは、パーティションキーでフィルタリングするクエリに効果を発揮します。

  • パーティションキーに対する WHERE → プルーニング
  • EXPLAIN で確認
  • 一致する結合ではパーティション単位の結合を有効化
  • 過剰なパーティション分割を避ける

クイックチェック

events が ts を基準に月単位でパーティション分割されています。どのクエリがパーティションプルーニングの恩恵を受けますか?

よくある質問

「パーティション横断クエリの効率化」レッスンは無料ですか?

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

「パーティション横断クエリの効率化」で何を学びますか?

パーティションプルーニングの恩恵を受けるクエリを作成し、EXPLAINでプルーニングを確認します。 ブラウザで直接実行するハンズオンコードでSQL Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

「パーティション横断クエリの効率化」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

  1. パーティショニングの理由:プルーニングとメンテナンス
  2. 範囲、リスト、ハッシュパーティショニング
  3. パーティションの切り離しと接続
  4. パーティション横断クエリの効率化
← SQL Academyに戻る