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조건이 타는 순서에 따라서 영향이 있는건지 궁금합니다.
아니면 오라클 튜닝에 따라서 문제가 있는건지
쿼리문제인지 서버문제인지 알고 싶습니다.
* 쿼리는 오류 케이스를 보여주려고 대충짠거라 문제 있어도 넘어가주세요..*
D.RESULT 항목중에 공백인 값이 존재하는 모양입니다.
공백제거 조건과 수치 조건 두개 조건중에
공백제거 조건이 먼저 처리된다면? 수치조건 에러 안날테고
공백제거 조건보다 수치조건이 먼저 처리된다면? 에러 날 것입니다.
어느 조건이 먼저 처리될지는 규칙으로 정해놓은 것은 없습니다.
1. 힌트를 통한 조건절 순서 제어
/*+ ordered_predicates */
2. 에러가 나지 않도록 쿼리를 수정합니다.
AND CAST(REPLACE(d.result, ' ') AS FLOAT) >= 400
3. 기타의견
- Exists 는 서브쿼리가 대용량일 때 유리합니다.
- 코드테이블이라면? 그냥 조인하는게 나을 듯 하네요.
동일한 질문을 올리신적이 있네요?
http://www.gurubee.net/article/68695