database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 40342 게시물 읽기
No. 40342
인덱스 사용 관련 질문
작성자
손님
작성일
2013-12-18 10:36ⓒ
2013-12-18 10:37ⓜ
조회수
6,615

테이블은 구분, 일수 컬럼으로 구성되어 있고, 일수 컬럼으로 인덱스가 생성되어 있습니다.

 

SELECT 구분, 일수

FROM 테이블

WHERE 일수 >= :입력1 AND 일수 <= :입력2 ;

 

위의 쿼리에서 구분(1,2)이 1일 경우 일수컬럼의 값을 0으로 인식하고 싶습니다. 아래 처럼요.

WHERE DECODE(구분,1,0,일수) >= :입력1 AND DECODE(구분,1,0,일수) <= :입력2

 

인덱스를 사용할 수 있는 방법이 있을까요?

 

이 글에 대한 댓글이 총 12건 있습니다.

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 ;

채용근(taiji97)님이 2013-12-18 10:46에 작성한 댓글입니다.
이 댓글은 2013-12-18 11:01에 마지막으로 수정되었습니다.

2. Union all 로 처리

SELECT 구분

, 일수

FROM 테이블

WHERE 구분 = '1'

AND 0 >= :입력1

AND 0 <= :입력2

UNION ALL

SELECT 구분

, 일수

FROM 테이블

WHERE 구분 = '2'

AND 일수 >= :입력1

AND 일수 <= :입력2 ;

 

구분이 1일 때도 입력1, 2 비교 부분이 추가 되어야 하지 않아요??

 

박성빈(빈이님)님이 2013-12-18 10:53에 작성한 댓글입니다.

INDEX 태우시려면

아래처럼 하는 것도 결과는 같을거 같습니다.

SELECT 구분, 일수
FROM 테이블
WHERE 일수 >= :입력1 AND 일수 <= :입력2 --INDEX 사용
AND DECODE(구분,1,0,일수) >= :입력1 AND DECODE(구분,1,0,일수) <= :입력2

박성빈(빈이님)님이 2013-12-18 10:54에 작성한 댓글입니다.

댓글 감사합니다~

근데 제가 질문 설명을 제대로 못한거 같네요.

구분 컬럼 값이 1이면 일수 컬럼 값을 0으로 인식한 상태에서 조건에 대한 결과를 찾고 싶은 거거든요.

 

박성빈님 첫번째 쿼리 결과가 원하는 결과와 같을것 같아요^^

근데 현재 union all을 사용하지 못할 것 같아서.. 두번째껄 쓰려고 했는데

결과가 다르게 나올것 같아요. 구분이 1이고 일수가 5일 경우 입력1,2를 0,1로 주었을때, 결과가 나와야 되는데 안나올것 같아요.

손님님이 2013-12-18 11:30에 작성한 댓글입니다. Edit

WHERE (구분 = 1 AND :입력1 <= 0 AND :입력2 >= 0)
OR (구분 = 2 AND 일수 >= :입력1 AND 일수 <= :입력2)

 

원래 이렇게 했었는데, 조건에 변수를 사용하지 않고 값을 직접 입력하면 인덱스가 타는데

변수를 사용하면 인덱스가 안타는거 같더라고요.

손님님이 2013-12-18 11:50에 작성한 댓글입니다. Edit

저는 INDEX 힌트 주셔서 강제로 태우시는 방법 밖에는 없어보여요~_~;;

SELECT /*+ INDEX(A 인덱스명) */ 구분, 일수
FROM 테이블 A
WHERE 1=1
AND 일수 >=  :입력1 AND 일수 <=  :입력2--INDEX 사용
OR ( DECODE(구분,1,0,일수) >=  :입력1 AND DECODE(구분,1,0,일수) <=  :입력2 )

고수님들이 더 좋은 답변을 주시길 바래야 겠습니다 -_-;;

박성빈(빈이님)님이 2013-12-18 12:34에 작성한 댓글입니다.

use_concat 힌트를 줬는데도 인덱스가 안탔다는 얘기인가요...

채용근(taiji97)님이 2013-12-18 13:21에 작성한 댓글입니다.

채용근님 쿼리는 힌트가 먹긴하는데
( ( 구분 = '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으로 안풀리네요.

손님님이 2013-12-18 14:25에 작성한 댓글입니다.
이 댓글은 2013-12-18 14:26에 마지막으로 수정되었습니다. Edit

구분 = 1 을 혹시 varchar 형태인데.. number 형태로 값을 넣으셨나요

 

 

구분 = '1'

채용근(taiji97)님이 2013-12-18 14:30에 작성한 댓글입니다.

아니요. 그렇진 않아요.

구분이 varchar가 맞고 실제 쿼리에는 string으로 되어 있어요.

질문에는 편의상 1로 작성한거고요.

손님님이 2013-12-18 14:43에 작성한 댓글입니다. Edit

꼭 union all로 하지 않아야 한다면

 

별개로 QB_NAME 을 xplan으로 취득후 그에 대한 힌트를 줘야합니다.

 

왠만하면 UNION ALL로 타협하세요

채용근(taiji97)님이 2013-12-18 14:50에 작성한 댓글입니다.

어차피 인덱스는 일수 뿐이고, 구분은 인덱스 없고.
두가지 OR 조건중 인덱스를 찰 수 있는것은 구분2 뿐이고
구분1은 인덱스 못타죠.
이럴바엔 차라리 풀스캔이 나을수밖에 없지 않나요?
DECODE(구분,1,0,일수) 로 함수기반 인덱스 만들어 사용하세요.

마농(manon94)님이 2013-12-19 08:52에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
40345xp방화벽 설정하고 원격접속은..?
한상원
2013-12-20
6325
403448i -> 11g import 가능한가요?
김홍찬
2013-12-19
6477
40343마농, 아린님께 질문드립니다.
야간비행
2013-12-19
6310
40342인덱스 사용 관련 질문 [12]
손님
2013-12-18
6615
40341트랜잭션 1번으로 여러Row Update 수정본.
새하정
2013-12-18
6334
40340오라클에서 복합연사자 사용한 산식 처리 문제 [4]
정재영
2013-12-17
6867
40339UNION ALL SELECT....FROM DUAL 효율성은 어떤가요? [1]
드라군
2013-12-16
6615
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.4로 자료를 관리합니다