조건에 or 를 넣으면 쿼리문 실행이 너무 오래걸립니다 0 6 939

by mjee [SQL Query] [2017.02.24 17:30:17]


안녕하세요

아래와 같은 쿼리를 작성했습니다.

SELECT  B.bl_id, A.name, A.coord_x, A.coord_y ,B.com200_campus as cp_cd
    FROM AFM.BL A, 
         (SELECT DISTINCT D.bl_id, E.com200_campus
            FROM (SELECT A.bl_id, A.fl_id, A.rm_id
                    FROM afm.rm A, com200tl B, afm.bl C
                   WHERE    
                               A.lectur_use = '수업' 
                            
                            AND C.bl_id = B.com200_bl_id
                         AND A.bl_id = B.com200_bl_id
                         AND A.fl_id = B.com200_fl_id
                         AND A.rm_id = B.com200_rm_id
                          AND  B.com200_campus = '11' <여기부터> or com200_campus = '12' or com200_campus = '13'<여기까지>
                  MINUS
                  SELECT D.bl_id, D.fl_id, D.rm_id
                    FROM AFM.RM_RESERVE D
                             
                   WHERE     STATUS = 'Con'
                
                        AND TO_CHAR( TIME_START, 'YYYYMMDDHH24MISS')
                         >= :time_start
                          AND TO_CHAR( time_end, 'YYYYMMDDHH24MISS')
                         <= :time_end
                        
                        )D, com200tl E
                        
                        where  com200_campus = '11' <여기부터>or com200_campus = '12' or com200_campus = '13'<여기까지>
                             
                        ) B 
                     
                       
   WHERE   A.bl_id = B.BL_ID
     
     
order by cp_cd asc,  name asc



위 쿼리의 노란칠 부분을 제거하면 실행시간이 약 10초내외인데 

저 노란부분을 첨가하면 2분이 지나도 계속 돌아갑니다.

저부분이 number타입이면 부등호로 하면될텐데 char타입이라 부등호 사용도 못하네요 ㅜㅜ

위 쿼리문의 속도 향상 방법이 있을까요?

조언 부탁드립니다.

 

** 노란칠 부분이라고 적은곳 html태그 적용이 안되어 <여기부터> 로 바꿧습니다

by jkson [2017.02.24 17:37:42]

일단은

SELECT B.BL_ID
     , A.NAME
     , A.COORD_X
     , A.COORD_Y
     , E.COM200_CAMPUS AS CP_CD
  FROM AFM.BL A
    , (SELECT DISTINCT D.BL_ID
         FROM (SELECT A.BL_ID, A.FL_ID, A.RM_ID
                 FROM AFM.RM A, COM200TL B, AFM.BL C
                WHERE A.LECTUR_USE = '수업'
                  AND C.BL_ID = B.COM200_BL_ID
                  AND A.BL_ID = B.COM200_BL_ID
                  AND A.FL_ID = B.COM200_FL_ID
                  AND A.RM_ID = B.COM200_RM_ID
                  AND (B.COM200_CAMPUS = '11'--괄호 추가
                    OR B.COM200_CAMPUS = '12'
                    OR B.COM200_CAMPUS = '13')
               MINUS
               SELECT D.BL_ID, D.FL_ID, D.RM_ID
                 FROM AFM.RM_RESERVE D
                WHERE STATUS = 'Con'
                  --AND TO_CHAR(TIME_START, 'YYYYMMDDHH24MISS') >= :TIME_START -- 컬럼변형금지
                  --AND TO_CHAR(TIME_END, 'YYYYMMDDHH24MISS') <= :TIME_END
                  AND TIME_START >= TO_DATE(:TIME_START,'YYYYMMDDHH24MISS') 
                  AND TIME_END <= TO_DATE(:TIME_END,'YYYYMMDDHH24MISS')
              ) D
      ) B
     ,(SELECT DECODE(LEVEL,1,'11',2,'12',3,'13') COM200_CAMPUS 
         FROM DUAL CONNECT BY LEVEL <= 3)  E -- 행복제 의도하신 것 같아 바깥으로 빼고 DUAL로 행복제
 WHERE A.BL_ID = B.BL_ID
ORDER BY CP_CD ASC, NAME ASC

이렇게 해보시고 효과 없으면 다시 고민해 봅시당.

추가) 다시 보니 결정적으로 OR 조건에 괄호를 안 넣으셨네요ㅎㅎ


by 마농 [2017.02.24 17:46:51]

OR 조건 사용시엔 괄호에 유의해야 합니다.
 - 변경전 : AND B.com200_campus = '11' or com200_campus = '12' or com200_campus = '13'
 - 변경후 : AND (B.com200_campus = '11' or com200_campus = '12' or com200_campus = '13')
 - 대체후 : AND B.com200_campus IN ('11','12','13')

D 와 E 를 조인하는데 조인 조건이 없네요?
  - 실수인지? 의도인지?


by jkson [2017.02.24 18:00:06]

아마도 11,12,13으로 행복제 하려는 것 같습니다.


by jkson [2017.02.24 17:54:54]

또 하나 보입니다. 기간 검색 컬럼을 TO_CHAR를 씌우셨네요. 인덱스 스캔 안됩니다.

AND TIME_START >= TO_DATE(:TIME_START,'YYYYMMDDHH24MISS')
AND TIME_END <= TO_DATE(:TIME_END,'YYYYMMDDHH24MISS')

로 수정하세요.


by mjee [2017.02.27 09:34:11]

확인이 늦었습니다ㅜㅜ.

jkson님 마농님 좋은 답변 감사드립니다.

문제도 해결되고 공부도 되었습니다.

 

두분 모두 즐거운 한 주 되시기 바라겠습니다


by mjee [2017.02.27 09:56:03]

말씀해주신 조인조건은 제 실수인것같습니다. 결과가이상하게나오네요,, 좀더 찾아보겠습니다

 

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