パーティション横断クエリの効率化
パーティションプルーニングの恩恵を受けるクエリを作成し、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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- パーティショニングの理由:プルーニングとメンテナンス
- 範囲、リスト、ハッシュパーティショニング
- パーティションの切り離しと接続
- パーティション横断クエリの効率化