1. 조건값이 들어오는 경우 => 조건에 해당하는 자료 조회
2. 조건값이 들어오지 않는 경우 => 전체 자료 조회
이 두가지 경우를
프로그램에서 IF 문으로 분기하여 두개의 쿼리를 따로 돌리는 것이 아닌
IF 문 없이 하나의 쿼리로 구현하는 방법 중 하나입니다.
이때 OR 조건이 어떻게 풀리느냐도 주목해야 합니다.
실행계획을 확인해야 하는데요.
OR 로 풀리는 경우 와 Concat 으로 풀리는 경우가 있습니다.
OR 는 하나의 통쿼리로 풀스캔하여 or 조건 처리하는 거구요.
Concat 은 쿼리가 두개로 분리되어 union 하는 형상입니다.
1번의 경우엔 인덱스를 타는 쿼리
2번의 경우엔 풀스캔을 타는 쿼리
이렇게 분리되는 거죠.
OR 로 풀릴 경우엔 1,2 번 모두 풀스캔을 타게 되어 1번조건에 대한 성능이 나오질 않습니다.
Concat 으로 풀릴 경우 1,2번 모두 효율적으로 동작하게 됩니다.
따라서 concat 을 타도록 유도해야 하며
or 로 탄다면? /*+ use_concat */ 힌트를 사용해 유도할 수 있습니다.
아니면 처음부터 UNION ALL 쿼리로 작성하는 것도 한 방법입니다.