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

使用上の注意
次のステートメントを実行して、パーティションごとの結合を有効にします。
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_y2023q1、measurement_y2023q2、measurement_y2023q3、およびmeasurement_y2023q42023を有する。salesテーブルには、それぞれ2023の4つの四半期に対応するsales_y2023q1、sales_y2023q2、sales_y2023q3、sales_y2023q4パーティションがあります。
measurementとsalesの結合の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_y2023q1とmeasurement_y2023q3の結合は空です。 これは、結合条件がsales_y2023q1とmeasurement_y2023q3のパーティションキー間の等結合であるが、それらのパーティションキーが不一致であるためです。 クエリ結果は、sales_y2023q1とmeasurement_y2023q1のパーティションキーが一致する場合にのみ返されます。
次に、次のステートメントを実行して、パーティションごとの結合を有効にします。
enable_partitionwise_joinをonに設定します。measurementとsalesの結合の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_y2023q2とmeasurement_y2023q2の間、sales_y2023q3とmeasurement_y2023q3の間、およびsales_y2023q4とmeasurement_y2023q4の間にのみ作成されます。 パーティション間の無効な結合が減少し、結合クエリのパフォーマンスが大幅に向上します。