2013-01-16 2 views
0

쿼리가 있습니다 (아래). Explain 계획은 높은 CPU 사용률을 보여 주며 우리 연구소의 가동 중지 시간을 초래합니다. 그래서이 쿼리를 더 자세히 살펴볼 수 있습니까? 그것을 조정하려면 어떻게해야합니까?쿼리 (집계 함수 사용) 튜닝

FYI, mtr_main_a, mtr_main_b, mtr_hist에는 엄청난 수의 레코드가 포함되어있어 10 백만 개 이상일 수 있습니다.

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 버전이 빠르게 작동하지 않는 경우.