사내시스템 개발중 기존 쿼리의
where절에 아래와 같은 코드가 있는걸 발견했습니다.
1. WHERE ( (I_NAME IS NULL AND 1=1) OR ( I_NAME IS NOT NULL AND NAME LIKE '%' || I_NAME || '%') )
2. WHERE NAME LIKE '%' || I_NAME || '%'
아무리 생각해도 1번 쿼리와 2번 쿼리는 결과나 속도면에서 차이가 없는 것 같습니다
PL/SQL Developer 에서 실행계획을 돌려보면 1번이 cost가 약간 작게 나오긴 합니다.
1번과 같이 작성한 이유가 있을까요?
1번과 2번중 어떤걸 쓰는게 좋을까요
조건이 입력되지 않을 경우에는 아예 조건 체크를 하지 않으려는 의도입니다.
I_NAME IS NULL 일 경우와 I_NAME IS NOT NULL 일 경우에 조건을 달리 하는 것이지요.
AND 1=1 은 굳이 필요는 없으므로 빼도 상관은 없습니다.
아마도, 아래쪽 쌍을 이루는 조건절과 라임을 맞추기 위해 넣은 게 아닐까? 생각되네요.
위 조건에서는 LIKE '%ㅁㅁㅁ%' 조건이라 성능 차이가 없을 수 있지만
= 조건이나 LIKE 이더라도 앞 쪽 % 가 없는 조건(LIKE 'ㅁㅁㅁ%')이라면 성능차가 있을 수 있습니다.
그리고 name 항목이 null 허용 컬럼이라면? 2번은 틀린 쿼리입니다.
그리고 어떤게 더 나을지는 이 조건 하나만 봐서는 모릅니다.
조건이 이거 하나 뿐인가요? 아니면 다른 조건이 더 있을까요?
양쪽 % LIKE 조건이라면? 그냥 간단하게 2번으로 가는게 좋을 듯 합니다.
= 조건이나 뒤쪽 % LIKE 조건 등의 인덱스를 이용할 수 있는 조건이라면?
다른 조건들과의 우선순위를 따져가며 결정해야 합니다.