2013-01-16 73 views
0

我有一個查詢(下面)。解釋計劃顯示高CPU利用率,這也導致了我們實驗室的停機時間。所以有可能進一步管這個查詢?我該如何調整它?查詢(帶聚合函數)調優

僅供參考,mtr_main_a,mtr_main_b,mtr_hist包含巨大的記錄數可能是1000萬或更多。

SELECT to_char(MAX(mdt), 'MM-DD-RRRR HH24:MI:SS') 
FROM (
      SELECT MAX(mod_date - 2/86400) mdt 
      FROM mtr_main_a 
      UNION 
      SELECT MAX(mod_date - 2/86400) mdt 
      FROM mtr_main_b 
      UNION 
      SELECT MAX(mod_date - 2/86400) mdt 
      FROM [email protected]_hist 
     ) 
/

解釋計劃如下文

Execution Plan 
---------------------------------------------------------- 
Plan hash value: 1573811822 

------------------------------------------------------------------------------------------------------------- 
| Id | Operation    | Name  | Rows | Bytes |TempSpc| Cost (%CPU)| Time  | Inst |IN-OUT| 
------------------------------------------------------------------------------------------------------------- 
| 0 | SELECT STATEMENT  |   |  1 |  9 |  | 79803 (1)| 00:18:38 |  |  | 
| 1 | SORT AGGREGATE  |   |  1 |  9 |  |   |   |  |  | 
| 2 | VIEW     |   |  2 | 18 |  | 79803 (1)| 00:18:38 |  |  | 
| 3 | SORT UNIQUE   |   |  2 | 17 | 77M| 79803 (2)| 00:18:38 |  |  | 
| 4 |  UNION-ALL   |   |  |  |  |   |   |  |  | 
| 5 |  SORT AGGREGATE |   |  1 |  8 |  | 79459 (1)| 00:18:33 |  |  | 
| 6 |  TABLE ACCESS FULL| MTR_MAIN_A | 5058K| 38M|  | 67735 (1)| 00:15:49 |  |  | 
| 7 |  SORT AGGREGATE |   |  1 |  9 |  | 344 (1)| 00:00:05 |  |  | 
| 8 |  TABLE ACCESS FULL| MTR_MAIN_B |  1 |  9 |  | 343 (1)| 00:00:05 |  |  | 
| 9 |  REMOTE   |   |  |  |  |   |   | HISTB | R->S | 
------------------------------------------------------------------------------------------------------------- 

Remote SQL Information (identified by operation id): 
---------------------------------------------------- 

    9 - EXPLAIN PLAN SET STATEMENT_ID='PLUS10294704' INTO [email protected]! FOR SELECT 
     MAX("A1"."MOD_DATE"-.00002314814814814814814814814814814814814815) FROM "MTR_HIST" "A1" (accessing 
     'HISTB') 

感謝和問候, 錢德拉

回答

1

您應該能夠通過戴上mod_date列的索引和改變你的查詢,大大提高了性能在確定最大日期之後以最後減法的方式:

SELECT to_char(MAX(mdt) - 2/86400, 'MM-DD-RRRR HH24:MI:SS') 
FROM (
      SELECT MAX(mod_date) mdt 
      FROM mtr_main_a 
      UNION 
      SELECT MAX(mod_date) mdt 
      FROM mtr_main_b 
      UNION 
      SELECT MAX(mod_date) mdt 
      FROM [email protected]_hist 
     ) 

這應該擺脫全表掃描。

+0

索引在mod_date上創建(均爲mtr_main_a/b)。 –

1

如果您對列的索引,請問這個版本的工作:

SELECT to_char((case when a.mdt > b.mdt and a.mdt > c.mdt then a.mdt 
        when b.mdt > c.mdt then b.mdt 
        else c.mdt 
       end) - 2/86400, 'MM-DD-RRRR HH24:MI:SS') 
FROM (SELECT MAX(mod_date) mdt 
     FROM mtr_main_a 
    ) a cross join 
    (SELECT MAX(mod_date) mdt 
     FROM mtr_main_b 
    ) b cross join 
    (SELECT MAX(mod_date) mdt 
     FROM [email protected]_hist 
    ) c 

這只是一個建議,如果union版本不工作得更快。