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 21752 게시물 읽기
No. 21752
[질문] NOT IN, IN, <> 중에 뭐가 더 빠를까요?
작성자
서지수(pelsia2)
작성일
2005-02-16 16:01
조회수
2,625

국가코드 도시명 인구수

01 서울 5000

01 부산 7000

02 LA 3000

02 NY 5000

03 일본 1000

 

대충 이런게 있다고 하고요...

대략 데이타가 500만개가 있다고 가정하고요...

 

select 국가코드, sum(인구수)

from 테이블

where 국가코드 = '01'

group by 국가코드;

 

이렇게 하면 그냥 무난한 퀴리인데요...

 

만약 01 을 제외한 다른 국가코드의 합을 구할때...

1.

select 국가코드, sum(인구수)

from 테이블

where 국가코드 <> '01'

group by 국가코드;

 

2.

select 국가코드, sum(인구수)

from 테이블

where 국가코드 not in ( '01' )

group by 국가코드;

 

3.

select 국가코드, sum(인구수)

from 테이블

where 국가코드 in ( '02', '03', '04'.........'99' )

group by 국가코드;

 

이 셋중에 뭐가 제일 속도가 빠를까요?

 

데이타는 약 500만건이라고 가정하고요.

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

1, 2는 같은 sql 입니다.

not in 을 parsing 할때 옵티마이저는 내부적으로 <> 로 바꿉니다.

col between A and B 를  col >= A and col <= B 로 바꾸듯이...

또한, not in 에 복수개의 조건이 오면 or로 바꿉니다. (in 도 마찬가지)

 

1,2 vs 3은... 그때 그때 다르다고 밖에^^;

아시겠지만.. 부정형 비교는 인덱스를 사용할 수 없습니다.

국가코드에 인덱스가 있고, 01의 데이터가 전체 데이터의 대부분이라면 국가코드 in ('02', '02', '03', '04'.........'99' ) 가 인덱스를 활용하므로 더 빠릅니다.

하지만 국가코드의 데이터 분포가 고르거나 01의 데이터의 수가 적다면 국가코드로 인덱스를 타서 국가코드 in ('02', '02', '03', '04'.........'99' ) 보다는 not in 비교로 full scan을 하는것이 더 빠르지 않을까 합니다.^^;

in 으로 주고 힌트로 full scan을 유도 할 수도 있겠지요.

 

초보의 의견이었습니다^^;

도움이 되었기를...

민윤기(amgblue)님이 2005-02-16 16:27에 작성한 댓글입니다.
이 댓글은 2005-02-16 16:28에 마지막으로 수정되었습니다.

속도는 데이타 분포도에 따라 달라질수 있기에

 

윗분말씀처럼 상황에 맞게 인덱스를 태우거나 안태우거나 잘 생각해서 하는게 낫고

 

상황이 어쩐지는 몰라도..

저 같으면 not exists를 쓸거 같네요...

ㅠ.ㅠ님이 2005-02-16 16:37에 작성한 댓글입니다. Edit

not in 과 <> 과 같은 부정형은 인덱스를 사용하지 않습니다.

'A'가 아닌 것은 이라고하면 전 데이터를 모두 조회를 해야

알 수가 있기 때문입니다.

그래서 인덱스를 사용을 할려면 1,2번의 SQL은

in으로 대체하세요. in(국가코드)으로 사용을 하든지 아니면

select 국가코드, sum(인구수)

from 테이블

where not exists(select 'x' from 테이블 where 국가코드 = '01')

이렇게 바꿔어 보시든지요.

 

위의 같은 경우는 인덱스를 사용하지 않는게 좋을 것 같내요.

500만건 중에 국가코드가 01이 아닌것이라면

데이터 분포도를 보았을 때 풀스캔을 사용하는게 훨씬 좋을 것 같내요.

인덱스를 사용하면 비용이 너무 많이 들것 같내요.

 

in, not in은 or 로 분리되어 실행이 됩니다.

3번인 경우는 너무 많은 sql이 분리되어 실행이 되어야하기 때문에

안 좋을 것 같내요. 만약에 국가코드 02-99까지라면..

 

select 국가코드, sum(인구수)

from 테이블

where not exists(select 'x' from 테이블 where 국가코드 = '01')

이 방법이나 2번 SQL이 좋을 것 같내요.

한번 비용 테스트를 해보세요.

 

허접한 답변이라 미안스럽네요.

남상우(jyansmin)님이 2005-02-17 02:57에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
21755리스너가 이유없이 죽습니다. 조언 부탁드립니다.
이재영
2005-02-16
896
21754이런상황 완전복구가 가능한지... [2]
핸시기
2005-02-16
1130
21753sequence 관련 [2]
소마
2005-02-16
2159
21752[질문] NOT IN, IN, <> 중에 뭐가 더 빠를까요? [3]
서지수
2005-02-16
2625
21751select문인데도 execute 단계의 rows에 숫자가 나오는 경우는 ?
data
2005-02-16
1337
21750update를 할때 여러건을 하면 이상현상이 있어요.
질문
2005-02-16
1399
21749대용량 테이블에서 delete 는 어떻게 하나요.? [5]
룰루
2005-02-16
9383
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다