2013-01-16 120 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版本不工作得更快。