오라클 Where 조건 순서에 대해서 궁금합니다. 0 4 1,145

by alues [Oracle 기초] [2018.09.27 11:06:08]


Oracle 11g를 쓰는 곳과 Oracle 9i를 쓰는 곳 두곳이 있습니다.

쿼리를 이런식으로 짰습니다.

SELECT * 
  FROM DATA D 
 WHERE D.EXMCOD = 'COD'
   AND D.RESULT > ' '  
   AND CAST(D.RESULT AS FLOAT) >= 400
   AND EXISTS (SELECT *                     
                 FROM CODE Z            
                WHERE Z.JOINKY  = D.JOINKY       
              )   

11g에서는 이쿼리가 이상없이 돌아가는데

9i에서는 CAST(D.RESULT AS FLOAT) 이부분이 형변환 오류라고 뜹니다.

단순히 RESULT가 빈값인거는 처리안해야 할텐데 처리해서 생기는거 같습니다.

그래서 CAST(D.RESULT AS FLOAT) 이부분을 WHERE조건 제일 처음에 넣으니 이상없이 됩니다.

WHERE조건이 타는 순서에 따라서 영향이 있는건지 궁금합니다.

아니면 오라클 튜닝에 따라서 문제가 있는건지

쿼리문제인지 서버문제인지 알고 싶습니다.

* 쿼리는 오류 케이스를 보여주려고 대충짠거라 문제 있어도 넘어가주세요..*

 

by 마농 [2018.09.27 11:20:17]

D.RESULT 항목중에 공백인 값이 존재하는 모양입니다.
공백제거 조건과 수치 조건 두개 조건중에
공백제거 조건이 먼저 처리된다면? 수치조건 에러 안날테고
공백제거 조건보다 수치조건이 먼저 처리된다면? 에러 날 것입니다.
어느 조건이 먼저 처리될지는 규칙으로 정해놓은 것은 없습니다.

1. 힌트를 통한 조건절 순서 제어
   /*+ ordered_predicates */
2. 에러가 나지 않도록 쿼리를 수정합니다.
   AND CAST(REPLACE(d.result, ' ') AS FLOAT) >= 400
3. 기타의견
   - Exists 는 서브쿼리가 대용량일 때 유리합니다.
   - 코드테이블이라면? 그냥 조인하는게 나을 듯 하네요.


by alues [2018.09.27 12:29:03]

감사합니다.

2번으로 처리해도 똑같은 문제가 있긴 하네요.

동일한 질문을 예전에 한걸 보기는 했지만 그때는 FROM절을 수정한 케이스였고

이번에는 WHERE절이라서 다시 질문을 했습니다.

그리고 이부분이 쿼리상에 문제인지 DB문제인지도 정확히 알고 싶었고요.

답변감사하고 동일질문 올려서 죄송합니다. ㅜㅜ


by 마농 [2018.09.27 11:40:14]

동일한 질문을 올리신적이 있네요?
http://www.gurubee.net/article/68695


by 마농 [2018.09.27 13:07:14]

2번 방법으로 처리해도 동일한 문제가 발생한다면?
이는 공백 ' '  외에 또다른 문자가 있다는 건데요?
숫자로 변환되지 못하는 문자들이 어떤게 있는지 확인해 보세요.

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