plsql 조회 qry 작성시 동적 조건을 1 2 2,113

by 도라지요 [2014.03.20 13:25:45]



select *
from tb1
where 1=1
    and pk1 like 인자값 || '%'

    and (
nvl(length(인자값)),0) =0
or (length(인자값)  > 0 and pk1 = 인자값)


위에 and문과 아래 and 문 어느게 더 효율적일까 해서요. 아무래도 아래것은 함수로 감싸서 속도상에 지장이 있지않을까
하는데 프로시저나 패키지를 짜는데 where 조건절이 동적으로 아무래도 많이 생기다보니.. plsql 내부에서 처리하자니 으음..
어떤게 나은지 애매하네요. 성능상으로 관계없으면 좋지만...이것둘다 아니면 뭔가 좋은 팁이 없을까요?

단순히 위에것들은 값이 없으면 전체 조회, 있으면 조건 조회.. 뭐 이런겁니다만..
by 마농 [2014.03.20 14:27:12]

1. AND pk1 LIKE 인자값 || '%'
  - 인자값이 있건 없건간에 하나의 실행계획으로 고정됨
  - 전체조회시(인자값이 없을 경우) pk1 이 널허용인 경우 널값이 누락됨
  - pk1이 가변자리수인 경우 인자값이 'a' 일 경우 'ab' 등이 출력될 수 있음.
2. AND (인자값 IS NULL OR (인자값 IS NOT NULL AND pk1 = 인자값))
  - 인자값이 있고 없고에 따라 실행계획이 두개로 분리될 가능성이 있음
3. AND pk1 = DECODE(인자값, NULL, pk1, 인자값)
  - 인자값이 있고 없고에 따라 실행계획이 두개로 분리될 가능성이 있음
  - 전체조회시(인자값이 없을 경우) pk1 이 널허용인 경우 널값이 누락됨
4. SELECT ~
   AND 인자값 IS NULL
   UNION ALL
   SELECT ~
    AND 인자값 IS NOT NULL
    AND pk1 = 인자값
  - 실행계획이 확실하게 분리됨

확실한 것은 실행계획을 반드시 확인해 봐야만 합니다.


by 도라지요 [2014.03.20 15:27:18]

마농님~~~ 추가적인 부분도 알려주셔서 감사드립니다.^^

요는 실행계획을 반드시 확인이군요!

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