테이블은 구분, 일수 컬럼으로 구성되어 있고, 일수 컬럼으로 인덱스가 생성되어 있습니다.
SELECT 구분, 일수
FROM 테이블
WHERE 일수 >= :입력1 AND 일수 <= :입력2 ;
위의 쿼리에서 구분(1,2)이 1일 경우 일수컬럼의 값을 0으로 인식하고 싶습니다. 아래 처럼요.
WHERE DECODE(구분,1,0,일수) >= :입력1 AND DECODE(구분,1,0,일수) <= :입력2
인덱스를 사용할 수 있는 방법이 있을까요?
1) /*+ use_concat */ 힌트 추가 후 OR 절로 풀이 ( ( 구분 = '1' and 일수 = 0 ) or ( 구분 = '2' and 일수 >= :입력1 AND 일수 <= :입력2 ) ) 2. Union all 로 처리 SELECT 구분 , 일수 FROM 테이블 WHERE 구분 = '1' AND 일수 = 0 UNION ALL SELECT 구분 , 일수 FROM 테이블 WHERE 구분 = '2' AND 일수 >= :입력1 AND 일수 <= :입력2 ;
2. Union all 로 처리
SELECT 구분
, 일수
WHERE 구분 = '1'
AND 0 >= :입력1
AND 0 <= :입력2
UNION ALL
WHERE 구분 = '2'
AND 일수 >= :입력1
AND 일수 <= :입력2 ;
구분이 1일 때도 입력1, 2 비교 부분이 추가 되어야 하지 않아요??
INDEX 태우시려면
아래처럼 하는 것도 결과는 같을거 같습니다.
SELECT 구분, 일수 FROM 테이블 WHERE 일수 >= :입력1 AND 일수 <= :입력2 --INDEX 사용 AND DECODE(구분,1,0,일수) >= :입력1 AND DECODE(구분,1,0,일수) <= :입력2
댓글 감사합니다~
근데 제가 질문 설명을 제대로 못한거 같네요.
구분 컬럼 값이 1이면 일수 컬럼 값을 0으로 인식한 상태에서 조건에 대한 결과를 찾고 싶은 거거든요.
박성빈님 첫번째 쿼리 결과가 원하는 결과와 같을것 같아요^^
근데 현재 union all을 사용하지 못할 것 같아서.. 두번째껄 쓰려고 했는데
결과가 다르게 나올것 같아요. 구분이 1이고 일수가 5일 경우 입력1,2를 0,1로 주었을때, 결과가 나와야 되는데 안나올것 같아요.
WHERE (구분 = 1 AND :입력1 <= 0 AND :입력2 >= 0) OR (구분 = 2 AND 일수 >= :입력1 AND 일수 <= :입력2)
원래 이렇게 했었는데, 조건에 변수를 사용하지 않고 값을 직접 입력하면 인덱스가 타는데
변수를 사용하면 인덱스가 안타는거 같더라고요.
저는 INDEX 힌트 주셔서 강제로 태우시는 방법 밖에는 없어보여요~_~;;
SELECT /*+ INDEX(A 인덱스명) */ 구분, 일수 FROM 테이블 A WHERE 1=1 AND 일수 >= :입력1 AND 일수 <= :입력2--INDEX 사용 OR ( DECODE(구분,1,0,일수) >= :입력1 AND DECODE(구분,1,0,일수) <= :입력2 )
고수님들이 더 좋은 답변을 주시길 바래야 겠습니다 -_-;;
use_concat 힌트를 줬는데도 인덱스가 안탔다는 얘기인가요...
채용근님 쿼리는 힌트가 먹긴하는데 ( ( 구분 = '1' and 일수 = 0 ) or ( 이 쿼리는 구분이 1이고 일수가 0인건을 조회 제가 원하는건 '구분이 1일경우 일수를 0으로 본다' 거든요. 일수 := DECODE(구분,1,0,일수)
WHERE (구분 = 1 AND :입력1 <= 0 AND :입력2 >= 0) OR (구분 = 2 AND 일수 >= :입력1 AND 일수 <= :입력2) 위의 쿼리가 원하는 결과인거 같은데, 힌트를 줘도 union으로 안풀리네요.
구분 = 1 을 혹시 varchar 형태인데.. number 형태로 값을 넣으셨나요
구분 = '1'
아니요. 그렇진 않아요.
구분이 varchar가 맞고 실제 쿼리에는 string으로 되어 있어요.
질문에는 편의상 1로 작성한거고요.
꼭 union all로 하지 않아야 한다면
별개로 QB_NAME 을 xplan으로 취득후 그에 대한 힌트를 줘야합니다.
왠만하면 UNION ALL로 타협하세요
어차피 인덱스는 일수 뿐이고, 구분은 인덱스 없고. 두가지 OR 조건중 인덱스를 찰 수 있는것은 구분2 뿐이고 구분1은 인덱스 못타죠. 이럴바엔 차라리 풀스캔이 나을수밖에 없지 않나요? DECODE(구분,1,0,일수) 로 함수기반 인덱스 만들어 사용하세요.