は、パーティションごとの結合機能を提供し、パーティション間の無効な結合の数を減らし、結合クエリのパフォーマンスを向上させます。
概要
パーティション単位の結合機能は、大きな結合を、結合された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_y2023q4
2023を有する。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
の間にのみ作成されます。 パーティション間の無効な結合が減少し、結合クエリのパフォーマンスが大幅に向上します。