sql 쿼리 확인부탁드립니다. 0 9 863

by 밤나무 [Oracle Tuning] [2017.08.23 17:01:32]


sql.sql (12,387Bytes)

안녕하세요.

성능이 느린 SQL이 있는데 중첩적으로 같은테이블을 두번 access 하고 있어서 이부분을 개선하고자 하는데 ,, 어디서 손을 봐야될지 모르겠네요..

어떻게 수정해야 두번 엑세스를 하지 않을까요??

첨부파일 첨부합니다. 조언부탁드립니다.. 감사합니다.

by 우리집아찌 [2017.08.23 17:24:15]
       SELECT TO_CHAR(B.INS_DATE , 'YYYY-MM-DD') ins_date,
               count( CASE WHEN B.INS_DATE > TO_DATE((TO_CHAR(sysdate-(7-1) , 'YYYYMMDD')), 'YYYYMMDD') THEN 1 END ) count
        FROM   TPM11 A,
               TPM15 B
         WHERE ( A.INDEXING_FLG=0
               OR     A.INDEXING_FLG=7
               OR     A.INDEXING_FLG IS NULL )
          AND  B.BUB_CD = A.BUB_CD (+)
          AND  B.SA_NO = A.SA_NO (+)
          AND  B.GA_SER = A.GA_SER (+)
          AND  B.PAN_SER = A.PAN_SER (+)
          AND  B.CHG_CD = A.CHG_CD (+)
        GROUP BY TO_CHAR(B.INS_DATE , 'YYYY-MM-DD')

 


by 마농 [2017.08.23 17:58:26]
SELECT TO_CHAR(b.ins_date, 'yyyy-mm-dd') ins_date
     , COUNT(a.bub_cd) cnt
  FROM tpm15 b
  LEFT OUTER JOIN tpm11 a
    ON b.bub_cd  = a.bub_cd
   AND b.sa_no   = a.sa_no
   AND b.ga_ser  = a.ga_ser
   AND b.pan_ser = a.pan_ser
   AND b.chg_cd  = a.chg_cd
   AND a.indexing_flg IN (0, 7)
 WHERE b.ins_date >= TRUNC(sysdate-(7-1))
 GROUP BY TO_CHAR(b.ins_date, 'yyyy-mm-dd')
;

 


by 밤나무 [2017.08.24 15:52:57]

마농님이 알려주신 SQL로 실행해보니까 이전 SQL과 결과값이 다르게 나옵니다.. 수정된 SQL 이 날짜별 count 값이 날짜별로 더 작게 나옵니다.. 어디를 수정해야될까요?


by jkson [2017.08.24 16:01:45]

기존 작성하셨던 쿼리의 결과가 문제가 있었던 것으로 보입니다.
쿼리의 의도가
tpm15와 tpm11을 아우터조인하여
일자별로 tmp11에 indexing_flg가 7인것과 0인 것의 총합을 구하려고 했다면
마농님 쿼리대로 하셔야 올바른 결과를 가지고 올 수 있었던 것이고요.

다른 의도라면 어떤 의도로 작성하신 것인지 설명을 해주셔야겠네요.


by jkson [2017.08.23 18:34:30]

음.. 원 쿼리가 잘 이해가 안 됩니다. 일단 속도보다도.. 정확한 결과가 나오고 있는 건지..

원 쿼리의 인라인뷰 X를 보면 B LEFT OUTER JOIN A인데

WHERE 조건에는 INDEXING_FLG = 0 OR INDEXING_FLG = 7 OR INDEXING_FLG IS NULL 조건을 걸었는데

왜 이런 조건을 써주신 건지.. 추출하려고 하는 데이터가 어떤 데이터인지에 대한 정의부터 알려주셔야할 것 같네요.


by 마농 [2017.08.23 18:40:04]

기존 쿼리가 이상해진 이유 분석
1. 아우터 조인 후에 a 의 indexing_flg 에 조건을 주다보니 오류 발생
  - a.indexing_flg(+) = 0 OR a.indexing_flg(+) = 7
  - 이렇게 했는데 아우터 조인에 or 사용 못한다고 오류발생
2. indexing_flg 에 조건에 (+) 기호 제거했더니
  - 오류는 안나는데 아우터 조인 안됨
3. 그래서 OR indexing_flg IS NULL 조건 추가 했으나
  - 조인에 실패한 것은 나오지만
  - 조인에 성공했지만 0,7 이 아닌 것은 제외됨
4. 그래서 tmp15 를 두번 읽어 다시 또 아우터 조인
5. 기타 문제점
  - count(*) 로 인해 조인에 실패한 자료는 0건이어야 하는데 1건이 나오는 문제도 있음


by jkson [2017.08.23 18:52:03]

쿼리만 보시고 쿼리 작성자가 무슨 고민을 했는지 다 분석이 되시는군요-0-

설명 듣고 보니 그런 이유겠네요. 작성자님 confirm만 남았군요ㅋㅋ


by 밤나무 [2017.08.23 20:11:38]

마농님 아찌님, 모두들 감사 합니다. ^^


by 마농 [2017.08.24 16:04:21]

1. 기존 쿼리의 문제점이 0 건이 나와야 할 부분이 1 건이 나오는 문제가 있어서
  - count(*) 부분을 count(a.컬럼) 으로 수정했구요.
2. 날짜 조건이 등호가 없는 것이 이상하여
  - > 크다(>) 조건을 크거나같다(>=) 로 수정했습니다.
3. 결과가 달라진 이유를 직접 확인하셔야 합니다.
  - 위 두가지 이유 때문에 틀린건지?
  - 아니면 다른 이유가 또 있는지?
  - 저는 데이터를 볼수가 없으므로 확인이 불가합니다.
  - 1번의 이유 때문에 다른거라면? 기존 쿼리의 결과가 틀린 것일 수 있습니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입