SQL문을 좀 봐주시겠어요(속도개선) 0 6 900

by 손님 속도 개선 [2009.06.05 15:08:09]


제가 데이터 베이스 전문가가 아니라..

SQL문이 속도가 느려서 어딘가가 이상한 것 같은데요 모르겠습니다.

어디를 어떻게 고쳐주면 될까요?

 

SELECT DISTINCT
  A.날짜1
  , A.코드1
  , A.이름1
  , COUNT(A.이름2) CK2  --> 방금전에 CK인데 제가 잘못표기했네요. CK2입니다. 아래 CK와 다른 이름입니다.

  , D.CK
  , D.CIM
FROM
  TBL1 A
  , (
    SELECT DISTINCT
      B.날짜1
      , B.코드1
      , B.이름1
      , COUNT(C.이름3) CIM
      , COUNT(B.이름2) CK
    FROM
      TBL1 B
      , TBL2 C
    WHERE
      B.날짜1 = ’20070620’
      AND B.코드1 = ’AA’
      AND B.날짜1 = SUBSTR(C.NO, 0, 8)
      AND B.이름2 = C.이름2
      AND B.이름1 != ’ ’
    GROUP BY
      B.날짜1
      , B.코드1
      , B.이름1
  ) D
WHERE
  A.날짜1 = ’20070620’
  AND A.코드1 = ’AA’
  AND A.날짜1 = D.날짜1
  AND A.코드1 = D.코드1
  AND A.이름1 = D.이름1
  AND A.이름1 != ’ ’
GROUP BY
  A.날짜1
  , A.코드1
  , A.이름1
  , D.CK
  , D.CIM
ORDER BY
  A.날짜1 DESC
  , A.코드1 ASC


TBL1의 index 날짜1,이름2

처리시간이 거의 2-3분걸립니다.

고수님들의 의견을 부탁드립니다.

by 마농 [2009.06.05 15:22:50]
SELECT a.날짜1, a.코드1, a.이름1
, COUNT(a.이름2) ck1
, COUNT(c.이름2) ck2
, COUNT(c.이름3) cim
FROM tbl1 a, tbl2 c
WHERE a.날짜1 = '20070620'
AND a.코드1 = 'aa'
AND a.이름1 != ' '
AND c.no(+) LIKE a.날짜1 || '%'
AND c.이름2(+) = a.이름2
GROUP BY a.날짜1, a.코드1, a.이름1
;

by 박민석 [2009.06.05 15:22:51]
업무상 튜닝이 더 가능하겠지만..
그냥 간단히 봐서 문제가 될만한 부분만 지적할께요~~

SELECT DISTINCT
B.날짜1
, B.코드1
, B.이름1
, COUNT(C.이름3) CIM
, COUNT(B.이름2) CK
FROM
TBL1 B
, TBL2 C
WHERE
B.날짜1 = '20070620'
AND B.코드1 = 'AA'
AND B.날짜1 = SUBSTR(C.NO, 0, 8) ==> 이부분이 문제 입니다.
AND B.이름2 = C.이름2
AND B.이름1 != ' '
GROUP BY
B.날짜1
, B.코드1
, B.이름1;

여기서 문제라고 판단한것은 TAB2 에서 NO 컬럼에 인덱스가 생성되어 있을 듯 한데요.. substr()함수를 사용함으로서 인덱스를 못타게 되었을듯 합니다.

문제가 된다고 한부분을
AND C.NO LIKE B.날짜1||'%'
이렇게 바꿔 보세요~

참 tab2 NO 컬럼에는 반디시 인덱스가 존재해야 합니다.. ^^

by JOY [2009.06.05 15:54:07]
마농님,그리고 박민석님 답변 감사드립니다.
그런데 박민석님 말대로 바꾸어 보았는데 별로 속도가 차이가 없습니다.
분명 인덱스도 설정되어 있는데...
음.. 어떻게 방법이 없을까요?

by 마농 [2009.06.05 16:09:40]
제 쿼리에 대한 테스트 결과도 올려주세요.

by 서성우 [2009.06.05 16:11:10]
민석님이 주신
쿼리에서 distinct를 지워 보세요
group by를 하는데
distinct까지 주실 필요는 없습니다.

by 박민석 [2009.06.08 11:26:03]
전체 실행 계획을 한번 보셔야 합니다.
느낌상 C 테이블 NO 컬럼에 인덱스가 잡혀 있다고 하더라도
C 테이블에 이름2 컬럼 또한 인덱스가 잡혀 있고 인덱스가 이름2 관련된 인덱스를 탈듯 합니다.
통계정보를 생성 시켜 주시던지 /*+ index(c no_index) */를 추가 해보세요..
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입