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

PolarDB:パーティションごとの結合

最終更新日:May 27, 2024

は、パーティションごとの結合機能を提供し、パーティション間の無効な結合の数を減らし、結合クエリのパフォーマンスを向上させます。

概要

パーティション単位の結合機能は、大きな結合を、結合された2つのテーブルからのパーティションのペア間の小さな結合に分割します。 2つのパーティション間の結合を最適化するために使用されます。 パーティションキーを使用してパーティションを結合する場合は、パーティションごとの結合機能を使用して、パーティション間の無効な結合を減らし、結合クエリのパフォーマンスを向上させることができます。

image.png

使用上の注意

次のステートメントを実行して、パーティションごとの結合を有効にします。

enable_partitionwise_joinをonに設定します。

このセクションでは、パーティションごとの結合機能を理解するのに役立つ2つの例を示します。

次の例では、測定テーブルと販売テーブルを使用して、パーティションごとの結合機能を説明します。

テーブル測定の作成 (
    city_id int not null,
    logdate date not null,
    peaktemp int,
    unitsales int
) 範囲 (logdate) によるPARTITION;
CREATE TABLE measurement_y2023q1測定の部分
    ('2023-01-01 ') から ('2023-04-01') までの値。測定の部分TABLE measurement_y2023q2を作成する
    ('2023-04-01 ') から ('2023-07-01') までの値。CREATE TABLE measurement_y2023q3測定の部分
    ('2023-07-01 ') から ('2023-10-01') までの値。CREATE TABLE measurement_y2023q4測定の一部
    ('2023-10-01 ') から ('2024-04-01') までの値。
    
テーブルの販売を作成する (
    dept_no number,   
    part_no varchar2,
    country varchar2(20),
    date date,
    金額番号
) 範囲によるパーティー (日付);
CREATE TABLE sales_y2023q1売上の一部
    ('2023-01-01 ') から ('2023-04-01') までの値。CREATE TABLE sales_y2023q2売上の一部
    ('2023-04-01 ') から ('2023-07-01') までの値。CREATE TABLE sales_y2023q3売上の一部
    ('2023-07-01 ') から ('2023-10-01') までの値。CREATE TABLE sales_y2023q4売上の一部
    ('2023-10-01 ') から ('2024-04-01') までの値; 

前述のステートメントでは、

  • measurementテーブルは、それぞれ4つのパーティションに対応するmeasurement_y2023q1measurement_y2023q2measurement_y2023q3、およびmeasurement_y2023q4 2023を有する。

  • salesテーブルには、それぞれ2023の4つの四半期に対応するsales_y2023q1sales_y2023q2sales_y2023q3sales_y2023q4パーティションがあります。

measurementsalesの結合のSQLクエリ文を実行し、クエリプランを表示します。

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

パーティションごとの結合が無効になっている場合、測定販売は完全に結合され、次のクエリプランが使用されます。

クエリ計画
--------------------------------------------------------------------------------------------------
 集計 (コスト=871.75 .. 871.76行=1幅=8)
   -> マージ結合 (コスト=448.58 .. 812.79行=23587幅=32)
         マージCond :( a.date = b.logdate)
         -> 並べ替え (コスト=185.83 .. 191.03行=2080幅=40)
               ソートキー: a.date
               -> 追加 (コスト=0.00 .. 71.20行=2080幅=40)
                     -> Seq sales_y2023q1 aのスキャン (コスト=0.00 .. 15.20行=520幅=40)
                     -> Seq sales_y2023q2 a_1のスキャン (コスト=0.00 .. 15.20行=520幅=40)
                     -> Seq sales_y2023q3 a_2のスキャン (コスト=0.00 .. 15.20行=520幅=40)
                     -> Seq sales_y2023q4 a_3のスキャン (コスト=0.00 .. 15.20行=520幅=40)
         -> 並べ替え (コスト=262.75 .. 268.42行=2268幅=8)
               ソートキー: b.logdate
               -> 追加 (コスト=0.00 .. 136.34行=2268幅=8)
                     -> Seq measurement_y2023q1 bのスキャン (コスト=0.00 .. 31.25行=567幅=8)
                           フィルター :( unitsales > 10)
                     -> Seq measurement_y2023q2 b_1のスキャン (コスト=0.00 .. 31.25行=567幅=8)
                           フィルター :( unitsales > 10)
                     -> Seq measurement_y2023q3 b_2のスキャン (コスト=0.00 .. 31.25行=567幅=8)
                           フィルター :( unitsales > 10)
                     -> Seq measurement_y2023q4 b_3のスキャン (コスト=0.00 .. 31.25行=567幅=8)
                           フィルター :( unitsales > 10)
(21行) 

クエリプランは、測定販売の間の完全結合に関するデータをクエリするように設計されています。 この場合、無効な結合が存在します。 sales_y2023q1measurement_y2023q3の結合は空です。 これは、結合条件がsales_y2023q1measurement_y2023q3のパーティションキー間の等結合であるが、それらのパーティションキーが不一致であるためです。 クエリ結果は、sales_y2023q1measurement_y2023q1のパーティションキーが一致する場合にのみ返されます。

次に、次のステートメントを実行して、パーティションごとの結合を有効にします。

enable_partitionwise_joinをonに設定します。

measurementsalesの結合のSQLクエリ文を実行し、クエリプランを表示します。

、select a.* from sales a join measurement b on a.date = b.logdateここでb.unitsales > 10;
                                       クエリ計画
----------------------------------------------------------------------------------------
 追加 (コスト=21.70 .. 453.33行=5896幅=128)
   -> ハッシュ参加 (コスト=21.70 .. 105.96行=1474幅=128)
         ハッシュコード :( b.logdate = a.date)
         -> Seq measurement_y2023q1 bのスキャン (コスト=0.00 .. 31.25行=567幅=8)
               フィルター :( unitsales > 10)
         -> ハッシュ (コスト=15.20 .. 15.20行=520幅=128)
               -> Seq sales_y2023q1 aのスキャン (コスト=0.00 .. 15.20行=520幅=128)
   -> ハッシュ参加 (コスト=21.70 .. 105.96行=1474幅=128)
         ハッシュコンド: (b_1.logdate = a_1.date)
         -> Seq measurement_y2023q2 b_1のスキャン (コスト=0.00 .. 31.25行=567幅=8)
               フィルター :( unitsales > 10)
         -> ハッシュ (コスト=15.20 .. 15.20行=520幅=128)
               -> Seq sales_y2023q2 a_1のスキャン (コスト=0.00 .. 15.20行=520幅=128)
   -> ハッシュ参加 (コスト=21.70 .. 105.96行=1474幅=128)
         ハッシュコンド: (b_2.logdate = a_2.date)
         -> Seq measurement_y2023q3 b_2のスキャン (コスト=0.00 .. 31.25行=567幅=8)
               フィルター :( unitsales > 10)
         -> ハッシュ (コスト=15.20 .. 15.20行=520幅=128)
               -> Seq sales_y2023q3 a_2のスキャン (コスト=0.00 .. 15.20行=520幅=128)
   -> ハッシュ参加 (コスト=21.70 .. 105.96行=1474幅=128)
         ハッシュコンド :( b_3.logdate = a_3.date)
         -> Seq measurement_y2023q4 b_3のスキャン (コスト=0.00 .. 31.25行=567幅=8)
               フィルター :( unitsales > 10)
         -> ハッシュ (コスト=15.20 .. 15.20行=520幅=128)
               -> Seq sales_y2023q4 a_3のスキャン (コスト=0.00 .. 15.20行=520幅=128)
(25行) 

パーティションごとの結合を有効にすると、結合はsales_y2023q2measurement_y2023q2の間、sales_y2023q3measurement_y2023q3の間、およびsales_y2023q4measurement_y2023q4の間にのみ作成されます。 パーティション間の無効な結合が減少し、結合クエリのパフォーマンスが大幅に向上します。