조건1. COMM 값이 NULL인 값은 0으로 간주하여 결과에 포함 조건2 COMM은 조회조건으로 자주 사용되므로 COMM을 선두컬럼으로 하는 인덱스 존재
SELECT EMPNO, ENAME FROM EMP X WHERE NVL(COMM, 0) < 100
이 쿼리에서 조건1때문에 가공안하는 방법을 모르겠네요.. 도와주세요.
by 마농
[2010.07.27 13:23:49]
인덱스엔 널이 포함되지 않기 때문에 널검색을 할때는 인덱스를 사용할 수 업습니다.
인덱스를 사용하려면 다음과 같이 널이 포함된 인덱스를 만들어야 합니다.
1. FBI(함수기반인덱스)
2. BITMAP 인덱스
아니면 아예 널을 없애는 방법도 있겠구요.
Update emp SET comm = 0 Where comm IS NULL;
하지만 굳이 이렇게 까지 해서 인덱스를 타게 해야 하는지 생각해 보세요.
인덱스는 무조건 타게 해야 하는 것은 아닙니다.
상황에 따라 적절하게 타기도 하고 안타기도 해야 합니다.
by sql_master
[2010.07.27 13:51:43]
아 그렇군요. 마농님 좋은거 배워갑니다.
by 知音
[2010.07.27 15:44:07]
테이블에 데이터 생성시 COMM 컬럼에 값이 안들어가도 0으로 처리할 수 있도록 default 처리를 해주시면 문제는 해결될 듯 합니다..
where 절 의 컬럼에 변형을 일으키면 index가 있어도 index를 타지 않습니다.
가급적 컬럼을 변형시키는 것은 지향하시는 게 좋을 듯 싶습니다.
by 현
[2010.07.27 16:57:31]
다음과 같이 정리할 수 있겠네요...
1. FBI를 이용한다 => NVL(COMM, 0) 로 인덱스 생성
2. 테이블 컬럼의 속성을 not null (default 0)으로 변경한다 => COMM < 100으로 조회
3. COMM 이 null인 데이터가 많을 경우 null인 경우와 null이 아닌경우를 분리해서 조회한다. => union all로 분리
1,2,번 같은 경우는 null인 경우가 별로 없을 경우 효과적이구요,
3번의 경우 COMM 이 null인 경우가 많을 경우 효과적입니다.
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.