すべてのプロダクト
Search
ドキュメントセンター

PolarDB:パーティションワイズ結合

最終更新日:Dec 27, 2025

PolarDB for PostgreSQL と は、パーティションワイズ結合機能をサポートしています。この機能は、パーティション間の無効な結合を減らすことで、結合クエリのパフォーマンスを向上させます。

概要

パーティションワイズ結合は、2 つのパーティションテーブル間の結合を最適化します。これらのテーブルをパーティションキーで結合すると、この機能はパーティション間の無効な結合を排除し、クエリパフォーマンスを向上させます。

image.png

使用方法

次の文を実行して、パーティションワイズ結合機能を有効にします。

set enable_partitionwise_join to on;

以下の 2 つの例で、パーティションワイズ結合について詳しく説明します。

この例では、measurementsales の 2 つのテーブルを使用します。

CREATE TABLE measurement(
    city_id         int not null,
    logdate         date not null,
    peaktemp        int,
    unitsales       int
) PARTITION BY RANGE (logdate);
CREATE TABLE measurement_y2023q1 PARTITION OF measurement
    FOR VALUES FROM ('2023-01-01') TO ('2023-04-01');
CREATE TABLE measurement_y2023q2 PARTITION OF measurement
    FOR VALUES FROM ('2023-04-01') TO ('2023-07-01');
CREATE TABLE measurement_y2023q3 PARTITION OF measurement
    FOR VALUES FROM ('2023-07-01') TO ('2023-10-01');
CREATE TABLE measurement_y2023q4 PARTITION OF measurement
    FOR VALUES FROM ('2023-10-01') TO ('2024-04-01');
    
CREATE TABLE sales (
    dept_no     integer,
    part_no     varchar(2),
    country     varchar(20),
    date        date,
    amount      decimal
) PARTITION BY RANGE (date);
CREATE TABLE sales_y2023q1 PARTITION OF sales
    FOR VALUES FROM ('2023-01-01') TO ('2023-04-01');
CREATE TABLE sales_y2023q2 PARTITION OF sales
    FOR VALUES FROM ('2023-04-01') TO ('2023-07-01');
CREATE TABLE sales_y2023q3 PARTITION OF sales
    FOR VALUES FROM ('2023-07-01') TO ('2023-10-01');
CREATE TABLE sales_y2023q4 PARTITION OF sales
    FOR VALUES FROM ('2023-10-01') TO ('2024-04-01');

これらの文は、次のことを示しています。

  • measurement テーブルには、measurement_y2023q1measurement_y2023q2measurement_y2023q3measurement_y2023q4 の 4 つのパーティションがあります。これらのパーティションは 2023 年の 4 つの四半期に対応しています。

  • sales テーブルにも、sales_y2023q1sales_y2023q2sales_y2023q3sales_y2023q4 の 4 つのパーティションがあります。これらのパーティションも 2023 年の 4 つの四半期に対応しています。

次に、measurement テーブルと sales テーブルで結合クエリを実行し、そのクエリプランを表示します。

explain select a.* from sales a join measurement b on a.date = b.logdate where b.unitsales > 10;

パーティションワイズ結合機能が無効になっている場合、measurement テーブルと sales テーブルは全体として結合されます。クエリプランは次のとおりです。

                                            QUERY PLAN                                            
--------------------------------------------------------------------------------------------------
 Aggregate  (cost=871.75..871.76 rows=1 width=8)
   ->  Merge Join  (cost=448.58..812.79 rows=23587 width=32)
         Merge Cond: (a.date = b.logdate)
         ->  Sort  (cost=185.83..191.03 rows=2080 width=40)
               Sort Key: a.date
               ->  Append  (cost=0.00..71.20 rows=2080 width=40)
                     ->  Seq Scan on sales_y2023q1 a  (cost=0.00..15.20 rows=520 width=40)
                     ->  Seq Scan on sales_y2023q2 a_1  (cost=0.00..15.20 rows=520 width=40)
                     ->  Seq Scan on sales_y2023q3 a_2  (cost=0.00..15.20 rows=520 width=40)
                     ->  Seq Scan on sales_y2023q4 a_3  (cost=0.00..15.20 rows=520 width=40)
         ->  Sort  (cost=262.75..268.42 rows=2268 width=8)
               Sort Key: b.logdate
               ->  Append  (cost=0.00..136.34 rows=2268 width=8)
                     ->  Seq Scan on measurement_y2023q1 b  (cost=0.00..31.25 rows=567 width=8)
                           Filter: (unitsales > 10)
                     ->  Seq Scan on measurement_y2023q2 b_1  (cost=0.00..31.25 rows=567 width=8)
                           Filter: (unitsales > 10)
                     ->  Seq Scan on measurement_y2023q3 b_2  (cost=0.00..31.25 rows=567 width=8)
                           Filter: (unitsales > 10)
                     ->  Seq Scan on measurement_y2023q4 b_3  (cost=0.00..31.25 rows=567 width=8)
                           Filter: (unitsales > 10)
(21 rows)

ご覧のとおり、クエリプランは measurement テーブルと sales テーブルのすべてのデータに対する結合を示しています。しかし、これにより無効な結合が生成されます。たとえば、sales_y2023q1measurement_y2023q3 の間の結合は常に空になります。これは、結合条件においてパーティションキーが等しいことが要求されるのに対し、sales_y2023q1measurement_y2023q3 のパーティションキーは等しくないためです。結合は、sales_y2023q1measurement_y2023q1 のように、一致するパーティションキーを持つパーティション同士が結合された場合にのみ、結果を返します。

パーティションワイズ結合機能が有効になっている場合:

set enable_partitionwise_join to on;

次に、measurement テーブルと sales テーブルで同じ結合クエリを実行します。クエリプランは次のとおりです。

explain select a.* from sales a join measurement b on a.date = b.logdate where b.unitsales > 10;
                                       QUERY PLAN                                       
----------------------------------------------------------------------------------------
 Append  (cost=21.70..453.33 rows=5896 width=128)
   ->  Hash Join  (cost=21.70..105.96 rows=1474 width=128)
         Hash Cond: (b.logdate = a.date)
         ->  Seq Scan on measurement_y2023q1 b  (cost=0.00..31.25 rows=567 width=8)
               Filter: (unitsales > 10)
         ->  Hash  (cost=15.20..15.20 rows=520 width=128)
               ->  Seq Scan on sales_y2023q1 a  (cost=0.00..15.20 rows=520 width=128)
   ->  Hash Join  (cost=21.70..105.96 rows=1474 width=128)
         Hash Cond: (b_1.logdate = a_1.date)
         ->  Seq Scan on measurement_y2023q2 b_1  (cost=0.00..31.25 rows=567 width=8)
               Filter: (unitsales > 10)
         ->  Hash  (cost=15.20..15.20 rows=520 width=128)
               ->  Seq Scan on sales_y2023q2 a_1  (cost=0.00..15.20 rows=520 width=128)
   ->  Hash Join  (cost=21.70..105.96 rows=1474 width=128)
         Hash Cond: (b_2.logdate = a_2.date)
         ->  Seq Scan on measurement_y2023q3 b_2  (cost=0.00..31.25 rows=567 width=8)
               Filter: (unitsales > 10)
         ->  Hash  (cost=15.20..15.20 rows=520 width=128)
               ->  Seq Scan on sales_y2023q3 a_2  (cost=0.00..15.20 rows=520 width=128)
   ->  Hash Join  (cost=21.70..105.96 rows=1474 width=128)
         Hash Cond: (b_3.logdate = a_3.date)
         ->  Seq Scan on measurement_y2023q4 b_3  (cost=0.00..31.25 rows=567 width=8)
               Filter: (unitsales > 10)
         ->  Hash  (cost=15.20..15.20 rows=520 width=128)
               ->  Seq Scan on sales_y2023q4 a_3  (cost=0.00..15.20 rows=520 width=128)
(25 rows)

パーティションワイズ結合を有効にすると、その最適化は明確です。データベースは、sales_y2023q2measurement_y2023q2sales_y2023q3measurement_y2023q3、および sales_y2023q4measurement_y2023q4 のように、一致するパーティションのみを結合します。このプロセスは、パーティション間の無効な結合数を大幅に削減し、結合クエリのパフォーマンスを大幅に向上させます。