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
운영게시판
최근게시물
PostgreSQL Q&A 4801 게시물 읽기
No. 4801
[질문] where조건절에서 in 사용시 index사용여부..
작성자
박근준
작성일
2003-07-20 18:01
조회수
1,445

안녕하세요....

 

제가 지금 where 조건절에 in을 사용할일이 많아서요 in을 많이 사용중입니다.

 

그런데 in사용을 하면 explain에서 index를 사용하지 않는 것으로 나와서

질문을 드립니다.

원래 in은 index를 사용하지 않는 건가요? 아니면 제가 설정을 잘못해서

그런건간요... 저는 linux 6.2에 postgres 7.3을 사용 중 입니다.

 

select * from tb_temp

where ( column1,column2,column3 ) in ( select column1,column2,column3 from tb_test ) ;

 

table tb_temp의 primary key는 column1,column2,column3순으로 되어져

있습니다....

 

고수님들의 답변을 부탁드립니다.

감사합니다.

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

in 조건일 경우는 그 in 안에 있을 놈이 하나일 뿐이라면, 당연히 인덱스를 사용하겠지만,

두개 이상이라면,

or 연산을 할 수 밖에 없겠지요.

 

select * from table where pkey in (1);

 

select * from table where pkey in (1,2);

 

이 두놈의 쿼리는 쿼리 최적화에서 엄청난 차이를 보입니다. (pkey 필드가 primary key일 경우)

 

두번째 쿼리는

select * from table where pkey = 1 or pkey = 2 하고 같은 쿼리가 되어버리거든요.

잘 알고 계시겠지만, or 조건은 인덱스를 사용할 수 없습니다.

 

in 문제를 풀 때, 경험적인 해결 방법은

in 조건 대신에 inner join을 사용하는 것입니다.

이부분에 대한 이야기는 그 닥친 상황에 따라 너무도 다른 쿼리들이 나오는지라 여기서 자세히 설명드리기도 그렇네요. 아무튼 쿼리를 작성할 때, 생각의 방향전환을 잠깐 해보시길.

 

----

7.3.x 에서는 in, or 연산에 대해서도 index를 사용하는군요. :)

explain 명령으로 사용하고 있는 버전에서 index를 사용하는 확인해 보시고, 쿼리를 사용하셔야겠네요.

 

김상기(ioseph)님이 2003-07-21 10:01에 작성한 댓글입니다.
이 댓글은 2003-09-04 12:39에 마지막으로 수정되었습니다.

상기님 감사합니다....

 

저도 고심이 많이 됩니다.

어떻게 생각을 전환해야 할지 -_-;;

 

항상 답변 감사드립니다.

박근준님이 2003-07-21 15:35에 작성한 댓글입니다.

이상하군요....

설마.. PostgreSQL에서 IN을 사용한다고 인덱스를 타지 못할까요? 소규모의 데이터베이스도 아닌데..

 

select * from jisa_store where nid IN ( 1,20,100,101 )

--> 제가 사용하는 테이블에서 nid를 PK로 잡고서 실행계획을 본 결과...

Index Scan using jisa_store_pk, jisa_store_pk, jisa_store_pk, jisa_store_pk on jisa_store

 

정상적인 인덱스 스캔을 합니다.

제가 알기로는 PostgreSQL에서 인덱스 경유시..

몇가지 문제가 있었던거 같은데.. 특히 결합 컬럼을 사용하여 PK를 잡은 경우에 조심하셔야 할 것 같내요.

 

우선, 님께서 쿼리문을

select * from tb_temp where ( column1,column2,column3 ) in ( val,val,val )

혹은

select * from tb_temp where column1='val' and column2='val' and column3='val'

이런식의 단일값을 갖는 쿼리문을 날려 보세요.

만약 이 경우에 인덱스를 사용하지 못하면 뭔가가 이상한 것입니다.

 

복잡한(AND와 여러가지 섞여 있는 경우) OR절이 있을 경우엔 인덱스 경유를 못하지만, IN으로 변환하면 가능하지 않을까 싶내요

T.P님이 2003-07-22 19:05에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
4807질문] libpq.lib 이용시 PostgreSQL 서버 버전 확인하는 방법은? [1]
김상기
2003-07-22
2417
4804시스템 카탈로그 깨짐 [2]
심재후
2003-07-22
1893
4802윈도에서 /etc/hosts.allow 파일과 /etc/hosts.deny 파일..? [1]
이호경
2003-07-21
1764
4801[질문] where조건절에서 in 사용시 index사용여부.. [3]
박근준
2003-07-20
1445
4800사용자 인증시 crypt..는 ..? [2]
이호경
2003-07-20
1493
4799postgresql 7.3.3 설치가 안되네요 [1]
유한선
2003-07-20
1373
4798db 백업에서 인증에러가 납니다 [2]
유한선
2003-07-20
1250
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.018초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다