2013-10-28 2 views
0

나는이 질의가 느린 쿼리를 가지고 있으며 문제가 무엇인지 전혀 모른다. 여러 개의 where 절을 추가하려고했지만 효과가 없습니다. 실행 시간은 5 분을 훨씬 넘습니다.SQL 내부 조인, 실행 시간

목표는 LM_MAT의 제품이 마지막으로 사용 된 시간을 선택하는 것입니다. 이것은 주식 돌연변이로 결정됩니다. LMH_MAT. LMH_MAT에는 160K 개의 레코드가 있지만 lmh_mat에서 Select *를 수행하는 데는 16ms 밖에 걸리지 않습니다.

나는 해결 방법을 this site에서 결정했습니다.

두 번째 하위 쿼리 (상위 1 선택 ...)를 제거하면 실행 시간이 6 초 미만으로 바뀌고 put은 제품이 마지막으로 사용 된 시간을 선택하여 전체 용도를 제거합니다.

플랫폼 : Sybase Advantage Data Architect.

누군가 나를 도울 수 있기를 바랍니다.

종류의 안부 루카스

쿼리 :

select 
lm_matn, 
LM_OMSCH, 
lm_hoev, 
lm_minh, 
lm_preh, 
lm_datin, 
XDate 
from lm_mat A 
left join (select lmh_matn, lmh_id, cast(lmh_date as sql_date) as XDate 
      from lmh_mat) F 
      on A.lm_matn = F.lmh_matn 
      AND F.lmh_id in 
      (select top 1 FF.lmh_id 
       from lmh_mat FF 
       where FF.lmh_matn=A.lm_matn 
       order by FF.lmh_date desc) 
group by 
    lm_matn, 
    LM_OMSCH, 
    lm_hoev, 
    lm_minh, 
    lm_preh, 
    lm_datin, 
    XDate 
+0

당신은 실행 계획을 게시 할 수 있습니까? –

+0

'lmh_date'를 선택하고'lmh_matn'을'lmh_mat' 테이블에서 선택하여'lm_mat'을 사용하여 왼쪽 조인을 하시겠습니까? 행에서 임의의 값을 선택하는 경우이 작업은 매우 까다 롭지 만 원하는 두 값은 하위 쿼리와 관련되어 있으므로 여기에 단순화가 있어야합니다. –

답변

0

이런 일이 당신이 원하는 결과에 근접 아무것도 제공하는 경우 참조 :

SELECT 
    lm_matn, LM_OMSCH, lm_hoev, lm_minh, lm_preh, lm_datin, XDate 
FROM lm_mat 
LEFT JOIN (SELECT 
    lmh_matn, 
    MAX(lmh_date) AS XDate 
    FROM lmh_mat 
    GROUP BY lmh_matn 
) AS a ON lmh_matn = lm_matn 
GROUP BY 
    lm_matn, LM_OMSCH, lm_hoev, lm_minh, lm_preh, lm_datin, XDate 
+0

예, 도움이됩니다! 고마워요! 단순히 max (lmh_date)가 아닌 경우이 쿼리를 최적화하는 솔루션은 무엇입니까? – user2928360

+0

@ user2928360이 경우 MAX (lmh_date)는 원하는 레코드를 찾는 데 사용하는 기준이므로 해당 기준을 변경하는 것일뿐입니다. SELECT의 맨 위 부분에있는 XDate 대신 lmh_mat (lmh_id와 같은)에서 다른 것을 얻고 싶다면 좀 더 재미있을 것이다. (나는 이전에 그런 쿼리를했지만,보기에는 편리하지 않다) –