아래글 재등록 서브쿼리 질문드립니다. 0 6 783

by 밤나무 [SQL Query] [2017.09.08 12:46:40]


plan2.jpg (1,201,675Bytes)

안녕하세요 서브쿼리 하나 관련해서 질문드립니다.

사업소별로 갯수를 확인해서 더해야되는 쿼리를 만들었는데, 같은 테이블을 중복으로 엑세스하는 문제로 인하여 성능이 지연이 되는거 같은데 서브쿼리를 어떻게 수정해야될지 도움 부탁드립니다.

SQL은 아래와 같습니다.

select (A.CNT + B.CNT) CNT
from (select count(1) cnt
from deliver a
where a.fk_off_cd =:1
and a.year> to_char(sysdate, 'yyyy')-2
and a.fk_dep_off_cd =:2
and a.fk_dep_cd =:3
and a.fk_deli_sts_cd in( select no from code where tp='0014' and cd in('00001','00002')))A
(select count(1) cnt
from deliver a
where a.FK_OFF_CD=:4
and a.year> to_char(sysdate, 'yyyy')-2
and a.fk_dep_off_cd =:5
and a.fk_dep_cd =:6
and a.fk_deli_sts_cd in( select no from code where tp='0014' and cd ='0004')
and (a.deli1_dt = to_char(sysdate, 'yyyymmdd')
or a.deli2_dt = to_char(sysdate, 'yyyyymmdd')
or a.deli3_dt = to_char(sysdate, 'yyyymmdd')))B

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

바인드변수 값은

:1 :4 ,  2: 5 , 3:6 은 서로 같습니다.

 

플랜은 첨부파일과 같습니다. 내부 인터넷이 안되는 상황이라, 핸드폰을 하다보니 ,, 플랜을 사진찍어서 올려봅니다.

 

by 우리집아찌 [2017.09.08 14:05:43]
           
SELECT SUM(CASE WHEN cd in('00001','00002') THEN 1 END) +
       SUM(CASE WHEN CD = '0004' AND to_char(sysdate, 'yyyymmdd') IN (a.deli1_dt, a.deli2_dt , a.deli3_dt ) THEN 1 END)
  FROM DRIVER A 
     , CODE B
 WHERE A.fk_deli_sts_cd = B.NO 
   AND a.fk_off_cd =:1 
   AND a.year> to_char(sysdate, 'yyyy')-2
   AND a.fk_dep_off_cd =:2
   AND a.fk_dep_cd =:3
   AND B.tp='0014' 
   AND B.cd IN ('00001','00002' ,'0004' )

 


by jkson [2017.09.08 14:27:53]

a, b 조인 조건이 빠졌어요.

그런데..

옵티마이저가 효율적인 인덱스를 선택했다면 기존 쿼리도 성능적으로 크게 문제 있을만해 보이진 않는데..

물론 중복 안 되게 만드는 게 더 좋겠지만..

체감상 쿼리가 느리게 느껴질 정도면

데이터 중복 접근이 문제가 아닐 거 같다는 생각이 드네요.


by 우리집아찌 [2017.09.08 14:37:33]

빼먹었따.. ㅡㅡ;

수정함..


by 우리집아찌 [2017.09.08 14:53:57]

//jkson

AND a.year IN ( to_char(sysdate, 'yyyy') - 1  , to_char(sysdate, 'yyyy') ) 

이렇게 하면 HASH로 풀리지 않을까나?

IN 은 안되려나?

 


by jkson [2017.09.08 16:09:45]

year를 한쪽 방향으로 열어놓는 것보다 작년,올해를 명시하는 것이 성능에 있어서 좋겠지만 hash로 풀린다는 말씀은 이해가 잘 안 돼요~


by 우리집아찌 [2017.09.08 16:11:47]

착각했다.. 딴생각했네.. 

컬럼이라고 생각했네.. 

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