안녕하세요. 오랜만에 구루비에 질문을 올리게 되었습니다.
물론 이슈가 생긴부분은 해결을 한 상태이긴합니다만 차이점을 몰라서 문의를 드립니다.
A) AND AD.ENV_MAJOR_GBN = DECODE(V_APPR_TYPE, NULL, AD.ENV_MAJOR_GBN, V_APPR_TYPE)
B) AND AD.ENV_MAJOR_GBN LIKE V_APPR_TYPE || '%'
여기 두가지 쿼리가 있습니다.
물론 PL/SQL Developer에서 실행하면 두 쿼리모두 아주 빠른속도로 결과가 나오구요.
그런데 UI(asp.net)에서 실행하면 A쿼리는 아주느린(1분이상) 결과를 주고 B쿼리는 아주빠른(1초내)결과를 주고 있습니다.
두 쿼리는 모두 같은일을 하고 있구요.
코스트 확인결과 차이가 좀 있습니다만 제가 코스트활용을 인덱스를 이용하게는 할수 있지만 이렇게 태웠을때 어떻다 이렇게 해석은
지식이 부족하여 고수님들의 의견을 묻습니다.
코스트화면을 같이 첨부하겠습니다.
A) AND AD.ENV_MAJOR_GBN = DECODE(V_APPR_TYPE, NULL, AD.ENV_MAJOR_GBN, V_APPR_TYPE)
B) AND AD.ENV_MAJOR_GBN LIKE V_APPR_TYPE || '%'
1. 만약.
단일 테이블에 대해서 위 두가지 조건으로 비교한다면
B 는 조건값 유무에 상관없이 인덱스를 타게 되고
A 의 경우엔 해당 항목이 인덱스 항목이고 not null 항목이라는 전제가 있으면
조건값이 들어오는지 안들어 오는지에 따라 실행계획이 분리될 수 있습니다.
조건값이 들어오면 인덱스 스캔
조건값이 안들어오면 풀 스캔
2. 하지만.
지금은 여러 테이블을 조인하고 조건도 다양할 것으로 생각됩니다.
해당 조건 한줄만 가지고 판단 할 수 있는 문제가 아닙니다.
전체 쿼리를 보고 판단해야 합니다.
실행계획을 비교해 보면 테이블들을 읽는 순서가 다릅니다.
순서가 왜 달라졌을까를 생각해야 합니다.