2014-02-06 76 views
3

我正面臨着一個在臨時空間&查詢性能之間的折衷問題。Oracle SQL消耗巨大的臨時空間

我的情況是這樣的:我有一個巨大的事務表(跨25個分區200億條記錄)和一個有7條記錄的小型公制查詢表。我需要處理每個度量記錄的每個交易記錄。基本上輸出將是7 * 200億記錄。該輸出必須根據5-6列進行彙總。

我已經考慮了兩種選擇:

  1. 交叉連接這兩個表,並使用「案時,」指定處理邏輯WRT公制和「分組依據」操作做。

  2. 對於每個度量標識和「UNION ALL」結果有7個不同的查詢。

#1正在消耗大約250 GB的巨大臨時空間,#2運行大約230分鐘。

有沒有辦法,我可以優化其中的一個選項?我需要在60分鐘內完成此查詢。

添加查詢

@大衛查詢粘貼下面

WITH IDQ_LKP AS 
    (SELECT '703' AS METRIC_ID,'desc1' AS EN_METRIC_1_NM 
    FROM DUAL 
    UNION ALL 
    SELECT '702' AS METRIC_ID,'desc1' AS EN_METRIC_1_NM 
    FROM DUAL 
    UNION ALL 
    SELECT '704' AS METRIC_ID,'% desc1' AS EN_METRIC_1_NM 
    FROM DUAL 
    UNION ALL 
    SELECT '705' AS METRIC_ID,'desc2' AS EN_METRIC_1_NM 
    FROM DUAL 
    UNION ALL 
    SELECT '706' AS METRIC_ID,'desc3' AS EN_METRIC_1_NM 
    FROM DUAL 
    UNION ALL 
    SELECT '707' AS METRIC_ID,'desc5' AS EN_METRIC_1_NM 
    FROM DUAL 
    UNION ALL 
    SELECT '701' AS METRIC_ID,'desc4' AS EN_METRIC_1_NM 
    FROM DUAL) 
SELECT /*+ parallel(16) USE_HASH_AGGREGATION */ col1 , 
     col2 , 
     'Monthly Snapshots' AS Time_Rollup , col3 , date_pk , colr , col5 , colr_DESC , col5_DESC , metric_id , EN_METRIC_1_NM , sum (
    CASE 
    WHEN (metric_id='704' 
     AND record_identifier=17) 
     OR (metric_id='705' 
     AND record_identifier=123) 
     OR (metric_id='706' 
     AND record_identifier=43) 
     OR (metric_id='707' 
     AND record_identifier=34) THEN 
    nvl (record_count,0) 
    WHEN metric_id NOT IN ('704','705','706','707') THEN 
    NULL 
    ELSE 0 
    END) AS METRIC_1_CY , NULL AS METRIC_1_LY , sum (
    CASE 
    WHEN (metric_id='703' 
     AND record_identifier=17) 
     OR (metric_id='705' 
     AND record_identifier=777) 
     OR (metric_id='702' 
     AND record_identifier=123) 
     OR (metric_id='704' 
     AND record_identifier=17) 
     OR (metric_id='706' 
     AND record_identifier=99999997) 
     OR (metric_id='707' 
     AND record_identifier=99999996) THEN 
    nvl (record_count,0) 
    WHEN metric_id NOT IN ('702','703','704','705','706','707') THEN 
    NULL 
    ELSE 0 
    END) AS METRIC_2_CY , NULL AS METRIC_2_LY , NULL AS METRIC_3_CY , NULL AS METRIC_3_LY 
FROM TXN,LKP 
WHERE col1=2 
GROUP BY col1 , col2 , col3 , date_pk , colr , col5 , colr_DESC , col5_DESC, metric_id , EN_METRIC_1_NM 

嗨,

我仍然看到252 GB需要臨時空間在解釋計劃...

------------------------------------------------------------------------------------------------------------------------------------------------- 
| Id | Operation      | Name      | Rows | Bytes |TempSpc| Cost | Pstart| Pstop | TQ |IN-OUT| PQ Distrib | 
------------------------------------------------------------------------------------------------------------------------------------------------- 
| 0 | SELECT STATEMENT    |       |  |  |  | 17M|  |  |  |  |   | 
| 1 | PX COORDINATOR    |       |  |  |  |  |  |  |  |  |   | 
| 2 | PX SEND QC (RANDOM)   | :TQ10003     | 1894M| 217G|  | 17M|  |  | Q1,03 | P->S | QC (RAND) | 
| 3 | HASH GROUP BY    |       | 1894M| 217G| 262G| 17M|  |  | Q1,03 | PCWP |   | 
| 4 |  PX RECEIVE     |       | 1894M| 217G|  | 17M|  |  | Q1,03 | PCWP |   | 
| 5 |  PX SEND HASH    | :TQ10002     | 1894M| 217G|  | 17M|  |  | Q1,02 | P->P | HASH  | 
| 6 |  HASH GROUP BY   |       | 1894M| 217G| 262G| 17M|  |  | Q1,02 | PCWP |   | 
| 7 |  MERGE JOIN CARTESIAN |       | 1894M| 217G|  | 149K|  |  | Q1,02 | PCWP |   | 
| 8 |   BUFFER SORT   |       |  |  |  |  |  |  | Q1,02 | PCWC |   | 
| 9 |   PX RECEIVE   |       |  7 | 154 |  | 14 |  |  | Q1,02 | PCWP |   | 
| 10 |   PX SEND BROADCAST | :TQ10000     |  7 | 154 |  | 14 |  |  |  | S->P | BROADCAST | 
| 11 |   VIEW    |       |  7 | 154 |  | 14 |  |  |  |  |   | 
| 12 |    UNION-ALL   |       |  |  |  |  |  |  |  |  |   | 
| 13 |    FAST DUAL   |       |  1 |  |  |  2 |  |  |  |  |   | 
| 14 |    FAST DUAL   |       |  1 |  |  |  2 |  |  |  |  |   | 
| 15 |    FAST DUAL   |       |  1 |  |  |  2 |  |  |  |  |   | 
| 16 |    FAST DUAL   |       |  1 |  |  |  2 |  |  |  |  |   | 
| 17 |    FAST DUAL   |       |  1 |  |  |  2 |  |  |  |  |   | 
| 18 |    FAST DUAL   |       |  1 |  |  |  2 |  |  |  |  |   | 
| 19 |    FAST DUAL   |       |  1 |  |  |  2 |  |  |  |  |   | 
| 20 |   BUFFER SORT   |       | 270M| 25G|  | 17M|  |  | Q1,02 | PCWP |   | 
| 21 |   VIEW     |       | 270M| 25G|  |  |  |  | Q1,02 | PCWP |   | 
| 22 |   HASH GROUP BY  |       | 270M| 22G| 29G| 115K|  |  | Q1,02 | PCWP |   | 
| 23 |   PX RECEIVE   |       | 270M| 22G|  | 843 |  |  | Q1,02 | PCWP |   | 
| 24 |    PX SEND HASH  | :TQ10001     | 270M| 22G|  | 843 |  |  | Q1,01 | P->P | HASH  | 
| 25 |    PX BLOCK ITERATOR |       | 270M| 22G|  | 843 | 28 | 55 | Q1,01 | PCWC |   | 
|* 26 |    TABLE ACCESS FULL| TXN      | 270M| 22G|  | 843 | 28 | 55 | Q1,01 | PCWP |   | 
--------------------------------------------------------------------------------------------------------- 

它正在運行...我懷疑它可能陷入同樣的​​問題....

計劃「UNION ALL」的方法..

------------------------------------------------------------------------------------------------------------------------------------------- 
| Id | Operation    | Name      | Rows | Bytes |TempSpc| Cost | Pstart| Pstop | TQ |IN-OUT| PQ Distrib | 
------------------------------------------------------------------------------------------------------------------------------------------- 
| 0 | SELECT STATEMENT   |       |  |  |  | 774K|  |  |  |  |   | 
| 1 | UNION-ALL    |       |  |  |  |  |  |  |  |  |   | 
| 2 | PX COORDINATOR   |       |  |  |  |  |  |  |  |  |   | 
| 3 | PX SEND QC (RANDOM) | :TQ10001     | 270M| 18G|  | 100K|  |  | Q1,01 | P->S | QC (RAND) | 
| 4 |  HASH GROUP BY  |       | 270M| 18G| 24G| 100K|  |  | Q1,01 | PCWP |   | 
| 5 |  PX RECEIVE   |       | 270M| 18G|  | 843 |  |  | Q1,01 | PCWP |   | 
| 6 |  PX SEND HASH  | :TQ10000     | 270M| 18G|  | 843 |  |  | Q1,00 | P->P | HASH  | 
| 7 |  PX BLOCK ITERATOR |       | 270M| 18G|  | 843 | 28 | 55 | Q1,00 | PCWC |   | 
|* 8 |   TABLE ACCESS FULL| TXN      | 270M| 18G|  | 843 | 28 | 55 | Q1,00 | PCWP |   | 
| 9 | PX COORDINATOR   |       |  |  |  |  |  |  |  |  |   | 
| 10 | PX SEND QC (RANDOM) | :TQ20001     | 270M| 21G|  | 112K|  |  | Q2,01 | P->S | QC (RAND) | 
| 11 |  HASH GROUP BY  |       | 270M| 21G| 28G| 112K|  |  | Q2,01 | PCWP |   | 
| 12 |  PX RECEIVE   |       | 270M| 21G|  | 843 |  |  | Q2,01 | PCWP |   | 
| 13 |  PX SEND HASH  | :TQ20000     | 270M| 21G|  | 843 |  |  | Q2,00 | P->P | HASH  | 
| 14 |  PX BLOCK ITERATOR |       | 270M| 21G|  | 843 | 28 | 55 | Q2,00 | PCWC |   | 
|* 15 |   TABLE ACCESS FULL| TXN      | 270M| 21G|  | 843 | 28 | 55 | Q2,00 | PCWP |   | 
| 16 | PX COORDINATOR   |       |  |  |  |  |  |  |  |  |   | 
| 17 | PX SEND QC (RANDOM) | :TQ30001     | 270M| 21G|  | 112K|  |  | Q3,01 | P->S | QC (RAND) | 
| 18 |  HASH GROUP BY  |       | 270M| 21G| 28G| 112K|  |  | Q3,01 | PCWP |   | 
| 19 |  PX RECEIVE   |       | 270M| 21G|  | 843 |  |  | Q3,01 | PCWP |   | 
| 20 |  PX SEND HASH  | :TQ30000     | 270M| 21G|  | 843 |  |  | Q3,00 | P->P | HASH  | 
| 21 |  PX BLOCK ITERATOR |       | 270M| 21G|  | 843 | 28 | 55 | Q3,00 | PCWC |   | 
|* 22 |   TABLE ACCESS FULL| TXN      | 270M| 21G|  | 843 | 28 | 55 | Q3,00 | PCWP |   | 
| 23 | PX COORDINATOR   |       |  |  |  |  |  |  |  |  |   | 
| 24 | PX SEND QC (RANDOM) | :TQ40001     | 270M| 21G|  | 112K|  |  | Q4,01 | P->S | QC (RAND) | 
| 25 |  HASH GROUP BY  |       | 270M| 21G| 28G| 112K|  |  | Q4,01 | PCWP |   | 
| 26 |  PX RECEIVE   |       | 270M| 21G|  | 843 |  |  | Q4,01 | PCWP |   | 
| 27 |  PX SEND HASH  | :TQ40000     | 270M| 21G|  | 843 |  |  | Q4,00 | P->P | HASH  | 
| 28 |  PX BLOCK ITERATOR |       | 270M| 21G|  | 843 | 28 | 55 | Q4,00 | PCWC |   | 
|* 29 |   TABLE ACCESS FULL| TXN      | 270M| 21G|  | 843 | 28 | 55 | Q4,00 | PCWP |   | 
| 30 | PX COORDINATOR   |       |  |  |  |  |  |  |  |  |   | 
| 31 | PX SEND QC (RANDOM) | :TQ50001     | 270M| 21G|  | 112K|  |  | Q5,01 | P->S | QC (RAND) | 
| 32 |  HASH GROUP BY  |       | 270M| 21G| 28G| 112K|  |  | Q5,01 | PCWP |   | 
| 33 |  PX RECEIVE   |       | 270M| 21G|  | 843 |  |  | Q5,01 | PCWP |   | 
| 34 |  PX SEND HASH  | :TQ50000     | 270M| 21G|  | 843 |  |  | Q5,00 | P->P | HASH  | 
| 35 |  PX BLOCK ITERATOR |       | 270M| 21G|  | 843 | 28 | 55 | Q5,00 | PCWC |   | 
|* 36 |   TABLE ACCESS FULL| TXN      | 270M| 21G|  | 843 | 28 | 55 | Q5,00 | PCWP |   | 
| 37 | PX COORDINATOR   |       |  |  |  |  |  |  |  |  |   | 
| 38 | PX SEND QC (RANDOM) | :TQ60001     | 270M| 21G|  | 112K|  |  | Q6,01 | P->S | QC (RAND) | 
| 39 |  HASH GROUP BY  |       | 270M| 21G| 28G| 112K|  |  | Q6,01 | PCWP |   | 
| 40 |  PX RECEIVE   |       | 270M| 21G|  | 843 |  |  | Q6,01 | PCWP |   | 
| 41 |  PX SEND HASH  | :TQ60000     | 270M| 21G|  | 843 |  |  | Q6,00 | P->P | HASH  | 
| 42 |  PX BLOCK ITERATOR |       | 270M| 21G|  | 843 | 28 | 55 | Q6,00 | PCWC |   | 
|* 43 |   TABLE ACCESS FULL| TXN      | 270M| 21G|  | 843 | 28 | 55 | Q6,00 | PCWP |   | 
| 44 | PX COORDINATOR   |       |  |  |  |  |  |  |  |  |   | 
| 45 | PX SEND QC (RANDOM) | :TQ70001     | 270M| 21G|  | 112K|  |  | Q7,01 | P->S | QC (RAND) | 
| 46 |  SORT GROUP BY  |       | 270M| 21G| 28G| 112K|  |  | Q7,01 | PCWP |   | 
| 47 |  PX RECEIVE   |       | 270M| 21G|  | 843 |  |  | Q7,01 | PCWP |   | 
| 48 |  PX SEND HASH  | :TQ70000     | 270M| 21G|  | 843 |  |  | Q7,00 | P->P | HASH  | 
| 49 |  PX BLOCK ITERATOR |       | 270M| 21G|  | 843 | 28 | 55 | Q7,00 | PCWC |   | 
|* 50 |   TABLE ACCESS FULL| TXN      | 270M| 21G|  | 843 | 28 | 55 | Q7,00 | PCWP |   | 
------------------------------------------------------------------------------------------------------------------------------------------- 
+1

在230分鐘的運行時間裏,讀寫臨時空間的時間是多少?桌子本身佔用了多少空間?表的分區鍵列是分組列之一嗎?排序是最優的,單通還是多通?預計分組操作總共需要多少行? –

+0

在執行度量表連接之前是否有機會聚合事務表? –

+0

桌子本身佔用了多少空間? 18 GB是表格的分區鍵也用於聚合,分組後 - 我預計接近70億條記錄......我如何發現排序是否最優? – user3279189

回答

0

看起來你可以做選擇兩個運行的七個獨立的查詢在全球不同的CPU並行。也許建立某種觀點來解決結合的需要?

+0

它已經並行運行...它的提取工作..so查看將不會的幫助 – user3279189

+0

是的,我在提交後看到了Oracle標籤。想想您的硬件可能只有7個線程。 – unigeek

1

只看該查詢,我會考慮嘗試一種方法是從實施該方法改變:

  1. 加入大表到小表
  2. 計算度量值
  3. 聚集到要求的水平

...這個...

  1. 將大表聚合到所需級別(如果可能,應用過濾器以刪除不需要的行)。
  2. 加入到小桌子
  3. 計算指標
  4. 可能骨料再次

這應該需要更小的臨時數據集。

+0

謝謝,我會嘗試相同的和恢復..... – user3279189

+1

得到兩種方法的解釋計劃 –

+0

我已經粘貼了新方法的解釋,請看看並建議...在此先感謝... – user3279189

1

我的評論對你的要求有點前所未聞。再說一次:爲了避免巨大的中間數據,請事先減少。請嘗試以下。首先將大表預先聚合,然後交叉連接,然後重新聚合。這減少了笛卡爾產品中的中間數據。這可能會解決您的問題。

select 
    col1, col2, 'Monthly Snapshots' AS Time_Rollup, col3, date_pk, colr, col5, colr_DESC, col5_DESC, metric_id, en_metric_1_nm 
    , sum 
    (
    case 
    when (metric_id='704' and record_identifier=17) 
    or (metric_id='705' and record_identifier=123) 
    or (metric_id='706' and record_identifier=43) 
    or (metric_id='707' and record_identifier=34) then 
     sum_record_count 
    when metric_id not in ('704','705','706','707') then 
     null 
    else 
     0 
    end 
) as metric_1_cy 
    , null as metric_1_ly 
    , sum 
    (
    case 
    when (metric_id='703' and record_identifier=17) 
    or (metric_id='705' and record_identifier=777) 
    or (metric_id='702' and record_identifier=123) 
    or (metric_id='704' and record_identifier=17) 
    or (metric_id='706' and record_identifier=99999997) 
    or (metric_id='707' and record_identifier=99999996) then 
     sum_record_count 
    when metric_id not in ('702','703','704','705','706','707') then 
     null 
    else 
     0 
    end 
) as metric_2_cy 
    , null as metric_2_ly 
    , null as metric_3_cy 
    , null as metric_3_ly 
from 
(
    select col1, col2, col3, date_pk, colr, col5, colr_desc, col5_desc, record_identifier, 
    sum(nvl(record_count,0)) as sum_record_count 
    from txn 
    where col1=2 
    group by col1, col2, col3, date_pk, colr, col5, colr_desc, col5_desc, record_identifier 
) pre_aggregate 
cross join 
(
    select '703' as metric_id,'desc1' as en_metric_1_nm from dual 
    union all 
    select '702' as metric_id,'desc1' as en_metric_1_nm from dual 
    ... 
) lkp 
group by col1, col2, col3, date_pk, colr, col5, colr_DESC, col5_DESC, metric_id, en_metric_1_nm; 
+0

謝謝......我現在正在測試它......我將回復 – user3279189

+0

我是新來的這個論壇,有沒有一種方法可以格式化並粘貼查詢/計劃? – user3279189

+0

我試過這個,因爲它佔用了超過150GB的臨時空間而失敗 – user3279189

0

爲每個分區創建一個查詢。由於分區鍵是聚合列之一,每個分區將生成單獨的數據。

將單個語句分解爲多個較小的語句幾乎總是效率較低。但是通過分區,即使查詢了25次,整個表的數據也只會被讀取一次。這種改變應該只比原來的方法稍微低效,但應該使用少得多的臨時表空間。除非分區是可怕的傾斜。

begin 
    --Loop through all partitions. 
    for partition_names in 
    (
     select partition_name 
     from user_tab_partitions 
     where table_name = 'TXN' 
    ) loop 
     --Execute the statement. 
     execute immediate q'< 
      WITH IDQ_LKP AS 
      ... 
      FROM TXN partition (>'||partition_names.partition_name||q'<),LKP 
      ... 
     >'; 

     --Normally commits should not be in DML loops, but a commit is required 
     --if the statement uses direct-path writes. 
     commit; 
    end loop; 
end; 
/

更新 - 單查詢方法和證據表明,它可能工作

每個分區上的查詢可以合併成一個單一的SQL語句。這應該仍然表現良好,使用較少的臨時表空間,儘管它將是一個helluva大型SQL語句。

的基本思路是:

with lookup as ... 
select txn partition (partition1), lookup ... union all 
select txn partition (partition2), lookup ... union all 
... 
select txn partition (partition25), lookup ... union all 

這裏的樣品臺,樣品數據和僞造統計:

create table txn(date_pk date, col1 number, col2 number, col3 number, colr number 
    ,col5 number, colr_desc number, col5_desc number, record_count number 
    ,record_identifier number) 
partition by hash (col2) 
(
    partition p01,partition p02,partition p03,partition p04,partition p05, 
    partition p06,partition p07,partition p08,partition p09,partition p10, 
    partition p11,partition p12,partition p13,partition p14,partition p15, 
    partition p16,partition p17,partition p18,partition p19,partition p20, 
    partition p21,partition p22,partition p23,partition p24,partition p25 
); 

--A few fake rows just to create a column censity for GROUP BY 
insert into txn 
select sysdate, 2, level, level, level, level, level, level, level, level 
from dual connect by level <= 100000; 

begin 
    --Gather mostly for column density. 
    --Use GLOBAL because I don't know how to fake partition stats. 
    dbms_stats.gather_table_stats(user, 'txn', granularity => 'global'); 
    --Fake 452M rows. This number will generate 262G of TempSpc. 
    --I can't reproduce it with 20G because I don't know the column densities. 
    dbms_stats.set_table_stats(user, 'TXN', numrows => 452000000); 
end; 
/

這裏的原始查詢,有一些化妝品修改,使之更小。它仍然包含相同的列,條件和分組。請注意,優化器估計它將使用262GB的臨時表空間,並且執行與您的執行非常相似。

explain plan for 
WITH IDQ_LKP AS 
(
    SELECT '703' AS METRIC_ID,'desc1' AS EN_METRIC_1_NM FROM DUAL UNION ALL 
    SELECT '702' AS METRIC_ID,'desc1' AS EN_METRIC_1_NM FROM DUAL UNION ALL 
    SELECT '704' AS METRIC_ID,'% desc1' AS EN_METRIC_1_NM FROM DUAL UNION ALL 
    SELECT '705' AS METRIC_ID,'desc2' AS EN_METRIC_1_NM FROM DUAL UNION ALL 
    SELECT '706' AS METRIC_ID,'desc3' AS EN_METRIC_1_NM FROM DUAL UNION ALL 
    SELECT '707' AS METRIC_ID,'desc5' AS EN_METRIC_1_NM FROM DUAL UNION ALL 
    SELECT '701' AS METRIC_ID,'desc4' AS EN_METRIC_1_NM FROM DUAL 
) 
SELECT /*+ parallel(16) */ 
    col1,col2,'Monthly Snapshots' Time_Rollup,col3,date_pk,colr,col5,colr_DESC,col5_DESC,metric_id,EN_METRIC_1_NM,NULL METRIC_1_LY,NULL METRIC_2_LY,NULL METRIC_3_CY,NULL METRIC_3_LY 
    ,sum (CASE WHEN (metric_id='704' AND record_identifier=17) THEN nvl (record_count,0) ELSE 0 END) AS METRIC_1_CY 
    ,sum (CASE WHEN (metric_id='703' AND record_identifier=17) THEN nvl (record_count,0) ELSE 0 END) AS METRIC_2_CY 
FROM TXN,IDQ_LKP 
WHERE col1=2 
GROUP BY col1 , col2 , col3 , date_pk , colr , col5 , colr_DESC , col5_DESC, metric_id , EN_METRIC_1_NM; 

select * from table(dbms_xplan.display); 


Plan hash value: 2764457837 

-------------------------------------------------------------------------------------------------------------------------------------------- 
| Id | Operation     | Name  | Rows | Bytes |TempSpc| Cost (%CPU)| Time  | Pstart| Pstop | TQ |IN-OUT| PQ Distrib | 
-------------------------------------------------------------------------------------------------------------------------------------------- 
| 0 | SELECT STATEMENT   |   | 3163M| 179G|  | 67M (1)| 00:43:46 |  |  |  |  |   | 
| 1 | PX COORDINATOR   |   |  |  |  |   |   |  |  |  |  |   | 
| 2 | PX SEND QC (RANDOM)  | :TQ10002 | 3163M| 179G|  | 67M (1)| 00:43:46 |  |  | Q1,02 | P->S | QC (RAND) | 
| 3 | HASH GROUP BY   |   | 3163M| 179G| 262G| 67M (1)| 00:43:46 |  |  | Q1,02 | PCWP |   | 
| 4 |  PX RECEIVE    |   | 3163M| 179G|  | 67M (1)| 00:43:46 |  |  | Q1,02 | PCWP |   | 
| 5 |  PX SEND HASH   | :TQ10001 | 3163M| 179G|  | 67M (1)| 00:43:46 |  |  | Q1,01 | P->P | HASH  | 
| 6 |  HASH GROUP BY  |   | 3163M| 179G| 262G| 67M (1)| 00:43:46 |  |  | Q1,01 | PCWP |   | 
| 7 |  MERGE JOIN CARTESIAN|   | 3163M| 179G|  | 488K (1)| 00:00:20 |  |  | Q1,01 | PCWP |   | 
| 8 |   PX RECEIVE   |   |  7 | 70 |  | 14 (0)| 00:00:01 |  |  | Q1,01 | PCWP |   | 
| 9 |   PX SEND BROADCAST | :TQ10000 |  7 | 70 |  | 14 (0)| 00:00:01 |  |  | Q1,00 | S->P | BROADCAST | 
| 10 |   PX SELECTOR  |   |  |  |  |   |   |  |  | Q1,00 | SCWC |   | 
| 11 |   VIEW   |   |  7 | 70 |  | 14 (0)| 00:00:01 |  |  | Q1,00 | SCWC |   | 
| 12 |    UNION-ALL  |   |  |  |  |   |   |  |  | Q1,00 | SCWC |   | 
| 13 |    FAST DUAL  |   |  1 |  |  |  2 (0)| 00:00:01 |  |  | Q1,00 | SCWP |   | 
| 14 |    FAST DUAL  |   |  1 |  |  |  2 (0)| 00:00:01 |  |  | Q1,00 | SCWP |   | 
| 15 |    FAST DUAL  |   |  1 |  |  |  2 (0)| 00:00:01 |  |  | Q1,00 | SCWP |   | 
| 16 |    FAST DUAL  |   |  1 |  |  |  2 (0)| 00:00:01 |  |  | Q1,00 | SCWP |   | 
| 17 |    FAST DUAL  |   |  1 |  |  |  2 (0)| 00:00:01 |  |  | Q1,00 | SCWP |   | 
| 18 |    FAST DUAL  |   |  1 |  |  |  2 (0)| 00:00:01 |  |  | Q1,00 | SCWP |   | 
| 19 |    FAST DUAL  |   |  1 |  |  |  2 (0)| 00:00:01 |  |  | Q1,00 | SCWP |   | 
| 20 |   BUFFER SORT  |   | 451M| 21G|  | 67M (1)| 00:43:46 |  |  | Q1,01 | PCWP |   | 
| 21 |   PX BLOCK ITERATOR |   | 451M| 21G|  | 570 (95)| 00:00:01 |  1 | 25 | Q1,01 | PCWC |   | 
|* 22 |   TABLE ACCESS FULL| TXN  | 451M| 21G|  | 570 (95)| 00:00:01 |  1 | 25 | Q1,01 | PCWP |   | 
-------------------------------------------------------------------------------------------------------------------------------------------- 

Predicate Information (identified by operation id): 
--------------------------------------------------- 

    22 - filter("COL1"=2) 

Note 
----- 
    - Degree of Parallelism is 16 because of hint 

更換單txn,idq_lkp具有多個txn partition (pXX),idq_lkp降低最大臨時表估計從262G到10G。此示例僅包含25個分區中的2個,但添加更多分區不會增加所需的臨時表空間。

explain plan for 
WITH IDQ_LKP AS 
(
    SELECT '703' AS METRIC_ID,'desc1' AS EN_METRIC_1_NM FROM DUAL UNION ALL 
    SELECT '702' AS METRIC_ID,'desc1' AS EN_METRIC_1_NM FROM DUAL UNION ALL 
    SELECT '704' AS METRIC_ID,'% desc1' AS EN_METRIC_1_NM FROM DUAL UNION ALL 
    SELECT '705' AS METRIC_ID,'desc2' AS EN_METRIC_1_NM FROM DUAL UNION ALL 
    SELECT '706' AS METRIC_ID,'desc3' AS EN_METRIC_1_NM FROM DUAL UNION ALL 
    SELECT '707' AS METRIC_ID,'desc5' AS EN_METRIC_1_NM FROM DUAL UNION ALL 
    SELECT '701' AS METRIC_ID,'desc4' AS EN_METRIC_1_NM FROM DUAL 
) 
SELECT /*+ parallel(16) */ 
    col1,col2,'Monthly Snapshots' Time_Rollup,col3,date_pk,colr,col5,colr_DESC,col5_DESC,metric_id,EN_METRIC_1_NM,NULL METRIC_1_LY,NULL METRIC_2_LY,NULL METRIC_3_CY,NULL METRIC_3_LY 
    ,sum (CASE WHEN (metric_id='704' AND record_identifier=17) THEN nvl (record_count,0) ELSE 0 END) AS METRIC_1_CY 
    ,sum (CASE WHEN (metric_id='703' AND record_identifier=17) THEN nvl (record_count,0) ELSE 0 END) AS METRIC_2_CY 
FROM TXN partition (p01),IDQ_LKP 
WHERE col1=2 
GROUP BY col1 , col2 , col3 , date_pk , colr , col5 , colr_DESC , col5_DESC, metric_id , EN_METRIC_1_NM 
union all 
SELECT /*+ parallel(16) */ 
    col1,col2,'Monthly Snapshots' Time_Rollup,col3,date_pk,colr,col5,colr_DESC,col5_DESC,metric_id,EN_METRIC_1_NM,NULL METRIC_1_LY,NULL METRIC_2_LY,NULL METRIC_3_CY,NULL METRIC_3_LY 
    ,sum (CASE WHEN (metric_id='704' AND record_identifier=17) THEN nvl (record_count,0) ELSE 0 END) AS METRIC_1_CY 
    ,sum (CASE WHEN (metric_id='703' AND record_identifier=17) THEN nvl (record_count,0) ELSE 0 END) AS METRIC_2_CY 
FROM TXN partition (p02),IDQ_LKP 
WHERE col1=2 
GROUP BY col1 , col2 , col3 , date_pk , colr , col5 , colr_DESC , col5_DESC, metric_id , EN_METRIC_1_NM; 


select * from table(dbms_xplan.display); 

Plan hash value: 260310120 

----------------------------------------------------------------------------------------------------------------------------------------------------------------- 
| Id | Operation      | Name      | Rows | Bytes |TempSpc| Cost (%CPU)| Time  | Pstart| Pstop | TQ |IN-OUT| PQ Distrib | 
----------------------------------------------------------------------------------------------------------------------------------------------------------------- 
| 0 | SELECT STATEMENT    |       | 253M| 14G|  | 3923K (51)| 00:02:34 |  |  |  |  |   | 
| 1 | TEMP TABLE TRANSFORMATION  |       |  |  |  |   |   |  |  |  |  |   | 
| 2 | LOAD AS SELECT    | SYS_TEMP_0FD9D66A0_D66798 |  |  |  |   |   |  |  |  |  |   | 
| 3 | UNION-ALL     |       |  |  |  |   |   |  |  |  |  |   | 
| 4 |  FAST DUAL     |       |  1 |  |  |  2 (0)| 00:00:01 |  |  |  |  |   | 
| 5 |  FAST DUAL     |       |  1 |  |  |  2 (0)| 00:00:01 |  |  |  |  |   | 
| 6 |  FAST DUAL     |       |  1 |  |  |  2 (0)| 00:00:01 |  |  |  |  |   | 
| 7 |  FAST DUAL     |       |  1 |  |  |  2 (0)| 00:00:01 |  |  |  |  |   | 
| 8 |  FAST DUAL     |       |  1 |  |  |  2 (0)| 00:00:01 |  |  |  |  |   | 
| 9 |  FAST DUAL     |       |  1 |  |  |  2 (0)| 00:00:01 |  |  |  |  |   | 
| 10 |  FAST DUAL     |       |  1 |  |  |  2 (0)| 00:00:01 |  |  |  |  |   | 
| 11 | UNION-ALL     |       |  |  |  |   |   |  |  |  |  |   | 
| 12 | PX COORDINATOR    |       |  |  |  |   |   |  |  |  |  |   | 
| 13 |  PX SEND QC (RANDOM)  | :TQ10002     | 126M| 7362M|  | 1961K (1)| 00:01:17 |  |  | Q1,02 | P->S | QC (RAND) | 
| 14 |  HASH GROUP BY    |       | 126M| 7362M| 10G| 1961K (1)| 00:01:17 |  |  | Q1,02 | PCWP |   | 
| 15 |  PX RECEIVE    |       | 126M| 7362M|  | 1961K (1)| 00:01:17 |  |  | Q1,02 | PCWP |   | 
| 16 |  PX SEND HASH   | :TQ10001     | 126M| 7362M|  | 1961K (1)| 00:01:17 |  |  | Q1,01 | P->P | HASH  | 
| 17 |   HASH GROUP BY   |       | 126M| 7362M| 10G| 1961K (1)| 00:01:17 |  |  | Q1,01 | PCWP |   | 
| 18 |   MERGE JOIN CARTESIAN |       | 126M| 7362M|  | 19567 (1)| 00:00:01 |  |  | Q1,01 | PCWP |   | 
| 19 |   PX RECEIVE   |       |  7 | 70 |  |  2 (0)| 00:00:01 |  |  | Q1,01 | PCWP |   | 
| 20 |   PX SEND BROADCAST | :TQ10000     |  7 | 70 |  |  2 (0)| 00:00:01 |  |  | Q1,00 | P->P | BROADCAST | 
| 21 |    VIEW    |       |  7 | 70 |  |  2 (0)| 00:00:01 |  |  | Q1,00 | PCWP |   | 
| 22 |    PX BLOCK ITERATOR |       |  7 | 70 |  |  2 (0)| 00:00:01 |  |  | Q1,00 | PCWC |   | 
| 23 |    TABLE ACCESS FULL| SYS_TEMP_0FD9D66A0_D66798 |  7 | 70 |  |  2 (0)| 00:00:01 |  |  | Q1,00 | PCWP |   | 
| 24 |   BUFFER SORT   |       | 18M| 879M|  | 1961K (1)| 00:01:17 |  |  | Q1,01 | PCWP |   | 
| 25 |   PX BLOCK ITERATOR |       | 18M| 879M|  | 23 (92)| 00:00:01 |  1 |  1 | Q1,01 | PCWC |   | 
|* 26 |    TABLE ACCESS FULL | TXN      | 18M| 879M|  | 23 (92)| 00:00:01 |  1 |  1 | Q1,01 | PCWP |   | 
| 27 | PX COORDINATOR    |       |  |  |  |   |   |  |  |  |  |   | 
| 28 |  PX SEND QC (RANDOM)  | :TQ20002     | 126M| 7362M|  | 1961K (1)| 00:01:17 |  |  | Q2,02 | P->S | QC (RAND) | 
| 29 |  HASH GROUP BY    |       | 126M| 7362M| 10G| 1961K (1)| 00:01:17 |  |  | Q2,02 | PCWP |   | 
| 30 |  PX RECEIVE    |       | 126M| 7362M|  | 1961K (1)| 00:01:17 |  |  | Q2,02 | PCWP |   | 
| 31 |  PX SEND HASH   | :TQ20001     | 126M| 7362M|  | 1961K (1)| 00:01:17 |  |  | Q2,01 | P->P | HASH  | 
| 32 |   HASH GROUP BY   |       | 126M| 7362M| 10G| 1961K (1)| 00:01:17 |  |  | Q2,01 | PCWP |   | 
| 33 |   MERGE JOIN CARTESIAN |       | 126M| 7362M|  | 19567 (1)| 00:00:01 |  |  | Q2,01 | PCWP |   | 
| 34 |   PX RECEIVE   |       |  7 | 70 |  |  2 (0)| 00:00:01 |  |  | Q2,01 | PCWP |   | 
| 35 |   PX SEND BROADCAST | :TQ20000     |  7 | 70 |  |  2 (0)| 00:00:01 |  |  | Q2,00 | P->P | BROADCAST | 
| 36 |    VIEW    |       |  7 | 70 |  |  2 (0)| 00:00:01 |  |  | Q2,00 | PCWP |   | 
| 37 |    PX BLOCK ITERATOR |       |  7 | 70 |  |  2 (0)| 00:00:01 |  |  | Q2,00 | PCWC |   | 
| 38 |    TABLE ACCESS FULL| SYS_TEMP_0FD9D66A0_D66798 |  7 | 70 |  |  2 (0)| 00:00:01 |  |  | Q2,00 | PCWP |   | 
| 39 |   BUFFER SORT   |       | 18M| 879M|  | 1961K (1)| 00:01:17 |  |  | Q2,01 | PCWP |   | 
| 40 |   PX BLOCK ITERATOR |       | 18M| 879M|  | 23 (92)| 00:00:01 |  2 |  2 | Q2,01 | PCWC |   | 
|* 41 |    TABLE ACCESS FULL | TXN      | 18M| 879M|  | 23 (92)| 00:00:01 |  2 |  2 | Q2,01 | PCWP |   | 
----------------------------------------------------------------------------------------------------------------------------------------------------------------- 

Predicate Information (identified by operation id): 
--------------------------------------------------- 

    26 - filter("COL1"=2) 
    41 - filter("COL1"=2) 

Note 
----- 
    - Degree of Parallelism is 16 because of hint 
+0

Sory,我必須在純SQL中實現這個功能....它是我們內部工具的一個限制... – user3279189

+0

您可以通過25個不同查詢中的「UNION ALL」來完成此操作。這將是一個非常大的查詢,但我認爲它會很快並且使用較少的表空間。我會盡量在明天發佈更多細節。 –

+0

嗨Joanearles,謝謝....我會嘗試我的方案,並回復給你...後續問題 - 我原來的查詢是能夠實現分區修剪...是相當於查詢單個分區在「 UNION ALL「模式? – user3279189