パーシャル・パーティション・ワイズ結合を使用可能にする最も簡単な方法は、sales
表をcust_id
でハッシュ・パーティション化することです。パーティションは、パーシャル・パーティション・ワイズ結合操作におけるパラレル化の最小グラニュルであるため、並列度の最大値はパーティションの数によって決定されます。
パーシャル・パーティション・ワイズ結合のパラレル実行を次の図に示します。ここでは、並列度とsales
のパーティション数はどちらも16です。この実行では、2つのセットの問合せサーバーが使用されます。セット1とラベル付けされたセットは、customers
表をパラレルでスキャンします。スキャン操作のパラレル化のグラニュルはブロックの範囲です。
セット1によって選択されたcustomers
表の行(この場合はすべての行)は、cust_id
をハッシュすることで、セット2の問合せサーバーに再分散されます。たとえば、sales
表のパーティションP1
の行と一致する可能性があるcustomers
表の行はすべて、セット2の問合せサーバー1に送られます。セット2の問合せサーバーが受け取った行は、sales
表にある対応するパーティションの行と結合されます。セット2の問合せサーバー1は、受け取ったcustomers
表のすべての行とsales
表のパーティションP1
を結合します。
次の例に、sales
表とcustomers
表のパーシャル・パーティション・ワイズ結合の実行計画を示します。
----------------------------------------------------------------------------------------------- | Id | Operation | Name | Pstart| Pstop |IN-OUT| PQ Distrib | ----------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | | | | | | 1 | PX COORDINATOR | | | | | | | 2 | PX SEND QC (RANDOM) | :TQ10002 | | | P->S | QC (RAND) | |* 3 | FILTER | | | | PCWC | | | 4 | HASH GROUP BY | | | | PCWP | | | 5 | PX RECEIVE | | | | PCWP | | | 6 | PX SEND HASH | :TQ10001 | | | P->P | HASH | | 7 | HASH GROUP BY | | | | PCWP | | |* 8 | HASH JOIN | | | | PCWP | | | 9 | PART JOIN FILTER CREATE | :BF0000 | | | PCWP | | | 10 | PX RECEIVE | | | | PCWP | | | 11 | PX SEND PARTITION (KEY) | :TQ10000 | | | P->P | PART (KEY) | | 12 | PX BLOCK ITERATOR | | | | PCWC | | | 13 | TABLE ACCESS FULL | CUSTOMERS | | | PCWP | | | 14 | PX PARTITION HASH JOIN-FILTER| |:BF0000|:BF0000| PCWC | | |* 15 | TABLE ACCESS FULL | SALES |:BF0000|:BF0000| PCWP | | ----------------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 3 - filter(COUNT(SYS_OP_CSR(SYS_OP_MSR(COUNT(*)),0))>100) 8 - access("S"."CUST_ID"="C"."CUST_ID") 15 - 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'))
PX
行ソースが存在するため、計画に表示されているように、この問合せはパラレルで実行されます。1つの表、SALES
表がパーティション化されています。PX PARTITION HASH
行ソースに、PX SEND PARTITION
によって結合を実行する別のスレーブ・セットに分散されたパーティション化されていない表CUSTOMERS
が含まれているため、このことを判別できます。
注意:
Rows
列、Cost (%CPU)
列、Time
列およびTQ
列は、この例の計画表の出力では削除されています。
注意:
この項の説明はハッシュ・パーティション化についてですが、レンジ、リストおよび時間隔のパーシャル・パーティション・ワイズ結合にも当てはまります。
フル・パーティション・ワイズ結合に関する考慮点は、次のようにパーシャル・パーティション・ワイズ結合にも適用されます。
並列度は、パーティションの数と同じでなくてもかまいません。図では、16の問合せサーバー2組で問合せが実行されています。ここでは、セット2の各問合せサーバーに1つのパーティションが割り当てられます。パーティションの数は常に並列度の倍数である必要があります。
MPPにおけるOracle RRAC環境では、リモートI/Oを回避するために、sales
表の各ハッシュ・パーティションが1つのノードのみに対してアフィニティを持つことが望ましいとされます。また、ボトルネックを回避し、システムで使用可能なすべてのCPUリソースを使用するために、パーティションをすべてのノードに分散させます。ノードの数よりパーティションの数が多い場合は、1つのノードで複数のパーティションを管理できます。
関連項目:
データ・アフィニティの詳細は、『Oracle Real Application Clusters管理およびデプロイメント・ガイド』を参照してください。