この方法は、単一レベル-単一レベル方法の一種です。このシナリオでは、1つの表(通常は大きい方の表)が2つのディメンションでコンポジット・パーティション化され、サブパーティション・キーとして結合列が使用されます。この例ではsales
表が、履歴データを格納する表の一般的な例です。レンジ・パーティション化は、履歴情報を格納する表に対して、通常最初に行うパーティション化方法です。
たとえば、sales
表を列time_id
の範囲によって8個のパーティションにパーティション化するとします。また、2年分のデータがあり、各パーティションは四半期を表します。レンジ・パーティション化のかわりに、コンポジット・パーティション化を使用して、time_id
でのパーティション化を維持しながらフル・パーティション・ワイズ結合を有効にすることができます。たとえば、sales
表をtime_id
の範囲でパーティション化し、各パーティションを16個のサブパーティションを使用してcust_id
のハッシュでサブパーティション化します(サブパーティションの合計は128個)。customers
表は、16パーティションでのハッシュ・パーティション化を使用できます。
ここで説明した方法を使用すると、フル・パーティション・ワイズ結合は、単一レベル-単一レベルのハッシュ-ハッシュ方法と同様に動作します。また、結合も、両方の表のハッシュ・パーティションの組の間で、16の小規模な結合に分割されます。違いは、sales
表の各ハッシュ・パーティションが、各レンジ・パーティションから1つずつ、8つのサブパーティションの集合で構成されているということです。
図3-2は、sales
表でハッシュ・パーティション化がどのように実現されるかを示します。各セルがサブパーティションを表します。全体で8個のレンジ・パーティションがあり、各行は1つのレンジ・パーティションに対応します。各レンジ・パーティションには16個のサブパーティションがあります。全体で16個のハッシュ・パーティションがあり、各列は1つのハッシュ・パーティションに対応します。各ハッシュ・パーティションには8個のサブパーティションがあります。ハッシュ・パーティションを定義できるのは、すべてのパーティションに同数のサブパーティション(ここでは16個)がある場合のみです。
ハッシュ・パーティションはコンポジット表では暗黙的に扱われます。ただし、データ・ディクショナリには記録されず、レンジ・パーティションやリスト・パーティションのようにDDLコマンドを使用して処理することはできません。
次の例では、sales
表のフル・パーティション・ワイズ結合の実行計画が示されます。この表は、time_id
についてレンジ・パーティション化され、cust_id
についてハッシュでサブパーティション化されています。
---------------------------------------------------------------------------------------------- | Id | Operation | Name | Pstart| Pstop |IN-OUT| PQ Distrib | ---------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | | | | | | 1 | PX COORDINATOR | | | | | | | 2 | PX SEND QC (RANDOM) | :TQ10001 | | | P->S | QC (RAND) | |* 3 | FILTER | | | | PCWC | | | 4 | HASH GROUP BY | | | | PCWP | | | 5 | PX RECEIVE | | | | PCWP | | | 6 | PX SEND HASH | :TQ10000 | | | P->P | HASH | | 7 | HASH GROUP BY | | | | PCWP | | | 8 | PX PARTITION HASH ALL | | 1 | 16 | PCWC | | |* 9 | HASH JOIN | | | | PCWP | | | 10 | TABLE ACCESS FULL | CUSTOMERS | 1 | 16 | PCWP | | | 11 | PX PARTITION RANGE ITERATOR| | 8 | 9 | PCWC | | |* 12 | TABLE ACCESS FULL | SALES | 113 | 144 | PCWP | | ---------------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 3 - filter(COUNT(SYS_OP_CSR(SYS_OP_MSR(COUNT(*)),0))>100) 9 - access("S"."CUST_ID"="C"."CUST_ID") 12 - filter("S"."TIME_ID"<=TO_DATE(' 1999-10-01 00:00:00', 'syyyy-mm-dd hh24:mi:ss') AND "S"."TIME_ID">=TO_DATE(' 1999-07-01 00:00:00', 'syyyy-mm-dd hh24:mi:ss'))
注意:
Rows
列、Cost (%CPU)
列、Time
列およびTQ
列は、この例の計画表の出力では削除されています。
コンポジット-単一レベルのパーティション化が効率的なのは、あるディメンションではプルーニングを行い、別のディメンションではフル・パーティション・ワイズ結合を行えるためです。前述の問合せの例では、1999年の第3四半期に相当するサブパーティション(図3-2の3番目の行)のみをスキャンして、プルーニングが実現されます。Oracleによって、フル・パーティション・ワイズ結合が使用され、これらのサブパーティションがcustomer表と結合されます。
単一レベル-単一レベルのパーティション・ワイズ結合のすべての特性は、コンポジット-単一レベルのパーティション・ワイズ結合にも該当します。特に、この例では、2つの方法は次の2つの点で共通しています。
この場合のフル・パーティション・ワイズ結合の並列度は、16を超えることはありません。sales
表に128のサブパーティションがあっても、ハッシュ・パーティションは16のみであるためです。
パーティションはサブパーティションの集合です。たとえば、図3-2では、sales
表のハッシュ・パーティション9(楕円で囲まれた8つのサブパーティション)をcustomers
表のハッシュ・パーティション9と同じノードに格納します。