2016-10-20 3 views
0

나는 쿼리를 개선하려고합니다. 나는 열리는 표의 자료 집합이있다. 모든 티켓에는 행이 다르며 모든 행은 티켓의 업데이트를 나타냅니다. 모든 행마다 다른 필드 (dt_update)가 있습니다.쿼리 annidate를 사용하는 쿼리에 대한 Oracle 튜닝

이 색인은 st_remedy_full_light에 있습니다.
IDX_ASSIGNMENT (ASSIGNMENT)
IDX_REMEDY_INC_ID (REMEDY_INC_ID)
IDX_REMDULL_LIGHT_DTUPD (DT_UPDATE)는

이제 쿼리 8 초 동안 수행된다. 나를 위해 높다.

WITH last_ticket AS 
    (SELECT * 
    FROM st_remedy_full_light a 
    WHERE a.dt_update IN 
    (SELECT MAX(dt_update) 
     FROM st_remedy_full_light 
     WHERE remedy_inc_id = a.remedy_inc_id 
    ) 
) 
SELECT remedy_inc_id, ASSIGNMENT FROM last_ticket 

이이 쿼리를 더 나은 할 계획 Explain Plan 어떻게 내가 할 수있는 무엇입니까?

P. 이것은 큰 쿼리의 단지 부분이다

추가 정보 : - 529.507 행

를 포함 st_remedy_full_light 표는
+0

'remedy_inc_id'당 'dt_update'가 동일한 'st_remedy_full_light'를 여러 개 지정할 수 있습니까? –

+0

(remedy_inc_id, dt_update)에 대한 색인 또는 아마도 (remedy_inc_id, dt_update, assignment) - Tony Andrews가 제안한 하위 쿼리를 변경하고 싶지 않거나 변경할 수없는 경우에 도움이됩니다. 나는. 각 열에 대한 색인이 아닌 여러 열을 포함하는 단일 색인 - 오라클은 해당 질의에 대해 단일 열 색인 중 하나만 사용할 수 있으며, 세 열 모두를 사용하고 있어도 세 가지를 모두 사용할 수는 없습니다. 질문. 이러한 색인은 Tony Andrew의 제안 검색어도 도움이 될 것입니다. – Boneist

+0

@ EvgeniyK. remedy_inc_id에는 dt_update가 더 있지만 다른 것은 없습니다. – vecio88

답변

2

당신은 시도 할 수 : 또한 훨씬 쉽게

WITH last_ticket AS 
    (SELECT remedy_inc_id, ASSIGNMENT, 
      rank() over (partition by remedy_inc_id order by dt_update desc) rn 
    FROM st_remedy_full_light a 
) 
SELECT remedy_inc_id, ASSIGNMENT FROM last_ticket 
where rn = 1; 
+0

안녕하세요 토니, 답장을 보내 주셔서 감사합니다 ... 불행히도 내가이 솔루션을 사용하지만 이상하게 내 솔루션보다 느립니다. – vecio88

+0

이 쿼리가 원래 쿼리와 비교하여 빠르게 실행되는 이유에 대해 자세히 설명해주십시오. – NzGuy

+0

@NzGuy _personally _ _ _ 그것은 _probably_보다 빠르게 실행됩니다. 왜냐하면 자체적으로'last_ticket'을 해쉬 조인 할 필요가 없기 때문입니다. –

1

가장 좋은 대안 쿼리를, 이것이 실행합니다

select remedy_inc_id 
    , max(assignment) keep (dense_rank last order by dt_update) 
    from st_remedy_full_light 
group by remedy_inc_id 

이 단 하나의 전체 테이블을 스캔하여 (해시/종류) 그룹을 사용하는 것, 자아 조인 없습니다.

인덱스 된 액세스에 대해 신경 쓰지 마세요. 전체 테이블 스캔이 가장 적합 할 것입니다. 테이블이 실제로 넓지 않고 사용 된 모든 열에 대한 복합 인덱스 (remedy_inc_id, dt_update, assignment)가 테이블보다 훨씬 빠르게 읽지 않는 한.