Oracle Databaseでは、パラレル時のみパーシャル・パーティション・ワイズ結合が実行できます。フル・パーティション・ワイズ結合と異なり、パーシャル・パーティション・ワイズ結合では、両方の表ではなく、一方の表のみを結合キーでパーティション化する必要があります。パーティション化された表は、参照表と呼ばれます。もう一方の表は、パーティション化してもしなくてもかまいません。パーシャル・パーティション・ワイズ結合は、フル・パーティション・ワイズ結合よりも一般的です。
パーシャル・パーティション・ワイズ結合を実行するために、データベースによって、参照表のパーティション化に基づいて、もう一方の表が動的にパーティション化または再パーティション化されます。もう一方の表が再パーティション化された後は、フル・パーティション・ワイズ結合と同様に実行されます。
次の例は、データ・ウェアハウスの一般的なシナリオでの、通話明細レコードの表cdrs
を示します。この表は、時間隔ハッシュ・パーティション化されています。
CREATE TABLE cdrs ( id NUMBER , cust_id NUMBER , from_number VARCHAR2(20) , to_number VARCHAR2(20) , date_of_call DATE , distance VARCHAR2(1) , call_duration_in_s NUMBER(4) ) PARTITION BY RANGE(date_of_call) INTERVAL (NUMTODSINTERVAL(1,'DAY')) SUBPARTITION BY HASH(cust_id) SUBPARTITIONS 16 (PARTITION p0 VALUES LESS THAN (TO_DATE('01-JAN-2005','dd-MON-yyyy'))) PARALLEL;
cdrs
表は、非パーティション表callers
とcust_id
列によって結合され、通話時間の長い顧客順に並べられます。
EXPLAIN PLAN FOR SELECT c.cust_id , c.cust_last_name , c.cust_first_name , AVG(call_duration_in_s) , COUNT(1) , DENSE_RANK() OVER (ORDER BY (AVG(call_duration_in_s) * COUNT(1)) DESC) ranking FROM callers c , cdrs cdr WHERE cdr.cust_id = c.cust_id AND cdr.date_of_call BETWEEN TO_DATE('01-JAN-2006','dd-MON-yyyy') AND TO_DATE('31-DEC-2006','dd-MON-yyyy') GROUP BY c.cust_id , c.cust_last_name , c.cust_first_name ORDER BY ranking;
この実行計画はパーシャル・パーティション・ワイズ結合を示しています。計画では、列Rows
、Bytes
、Cost (%CPU)
、Time
およびTQ
が削除されます。
-------------------------------------------------------------------------------------------- | Id | Operation | Name | Pstart| Pstop |IN-OUT| PQ Distrib | -------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | | | | | | 1 | WINDOW NOSORT | | | | | | | 2 | PX COORDINATOR | | | | | | | 3 | PX SEND QC (ORDER) | :TQ10002 | | | P->S | QC (ORDER) | | 4 | SORT ORDER BY | | | | PCWP | | | 5 | PX RECEIVE | | | | PCWP | | | 6 | PX SEND RANGE | :TQ10001 | | | P->P | RANGE | | 7 | HASH GROUP BY | | | | PCWP | | |* 8 | HASH JOIN | | | | PCWP | | | 9 | PART JOIN FILTER CREATE | :BF0000 | | | PCWP | | | 10 | BUFFER SORT | | | | PCWC | | | 11 | PX RECEIVE | | | | PCWP | | | 12 | PX SEND PARTITION (KEY) | :TQ10000 | | | S->P | PART (KEY) | | 13 | TABLE ACCESS FULL | CALLERS | | | | | | 14 | PX PARTITION RANGE ITERATOR| | 367 | 731 | PCWC | | | 15 | PX PARTITION HASH ALL | | 1 | 16 | PCWC | | |* 16 | TABLE ACCESS FULL | CDRS | 5857 | 11696 | PCWP | | -------------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 8 - access("CDR"."CUST_ID"="C"."CUST_ID") 16 - filter("CDR"."DATE_OF_CALL">=TO_DATE(' 2006-01-01 00:00:00', 'syyyy-mm-dd hh24:mi:ss') AND "CDR"."DATE_OF_CALL"<=TO_DATE(' 2006-12-31 00:00:00', 'syyyy-mm-dd hh24:mi:ss'))