PolarDB for PostgreSQL (Compatible with Oracle) でサポートされているパーティションごとの結合機能により、結合操作を含むクエリの実行中に不要な結合を大幅に減らすことができます。
概要
partion-wise join機能は、不要な結合によるオーバーヘッドを減らすことで、パーティション分割されたテーブル間のクエリのパフォーマンスを向上させます。

使用上の注意
次のステートメントを実行すると、パーティションごとの結合を有効にできます。
SET enable_partitionwise_joinにON;例
この例では、2つのテーブルが使用される。 1つはmeasurement、もう1つはsalesという名前です。
テーブル測定の作成 (
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テーブルには、measurement_y2023q1、measurement_y2023q2、measurement_y2023q3、measurement_y2023q4の4つのパーティションがあり、それぞれに対応するクォーターのデータが2023で格納されています。salesテーブルには、sales_y2023q1、sales_y2023q2、sales_y2023q3、sales_y2023q4の4つのパーティションもあり、それぞれに対応する四半期のデータが2023で含まれています。
次のステートメントを実行して、measurementとsalesが結合されているクエリの実行計画を表示します。
説明するSELECT a.* FROM sales a JOIN測定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_y2023q1とmeasurement_y2023q3の結合は、パーティションキーの値が同じで、sales_y2023q1とmeasurement_y2023q3のパーティションキーが異なるという接続条件であるため、空にしかできません。
パーティションごとの結合機能を有効にします。
SET enable_partitionwise_joinにON;パーティションごとの結合が有効になっている場合、クエリの実行プランは次のようになります。
、SELECT aについて説明します。* 販売からJOIN測定b ON a.date = b.logdate WHERE 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_y2023q2、sales_y2023q3、およびsales_y2023q4は、それぞれmeasurement_y2023q2、measurement_y2023q3、およびmeasurement_y2023q4と結合するだけで済みます。