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
운영게시판
최근게시물
DB2 Q&A 1021 게시물 읽기
No. 1021
[DB2]인덱스 사용에 관한 질문입니다
작성자
이문선(yurina99)
작성일
2006-06-20 10:17ⓒ
2006-06-20 10:42ⓜ
조회수
7,215

[아래는 DB2 환경입니다.]

제가 알기로는 PK를 잡으면 그것이 기본 인덱스로 잡힌다고 들었습니다.

 

scode(char4)+ daytime (varchar30)

로 pk를 만들었습니다.

 

[실행1]

select * from tablename where socde='12' and daytime='123123123'

______________expalin plan 이렇게 나옵니다.

1 Index Scan (No Table Access) NPA.NEW_PSSV_PK_2004 Index 358.14
2 Sort 358.97
3 Row Identifier Scan (RID) 358.98
4 Fetch Table Data NPA.NEW_PDA_SERVSTAT_2004 Table 2889.53
5 Data Operation Complete 2889.53

 

[실행2]

select * from new_pda_servstat_2004 where scode='0401'

____________explain plan

1 Table Access Full NPA.NEW_PDA_SERVSTAT_2004 Table 14032.64
2 Data Operation Complete 14032.64

 

[실행3]

select * from new_pda_servstat_2004 where scode='0401' and daytime>='20041205151211956286'

________explain plan

1 Table Access Full NPA.NEW_PDA_SERVSTAT_2004 Table 14290.52
2 Data Operation Complete 14290.52

 

[실행4]

select * from new_pda_servstat_2004 where scode>='0401'

________explain plan

1 Table Access Full NPA.NEW_PDA_SERVSTAT_2004 Table 14032.64
2 Data Operation Complete 14032.64

 

 

질문1]

scode와 daytime두개로 되어있으니 scode만 입력된 경우에는 scode만이라도 인덱스를

타는게 정상 아닌가요?

 

질문2]

왜 실행3,4 처럼 daytime, scode이 '='아 아닌 경우는

인덱스를 타지 못하나요?

 

추가]

int 형으로 pk가 a+b인걸 만들었습니다

해봤더니 a 만줘도, a+b로 주어도, a에 부등호를 주어도, 둘다부등호를 주어도 인덱스를 찾더라구요

만약 내부적으로 char가 변형이 일어난다면

인덱스를 사용할수 있는 방법은 없나요?

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

plan을 실행하기 전에 optimizer의 오류를 막기위해 runstats를 실행하세요.

[실행2]

select * from new_pda_servstat_2004 where scode='0401' 이 sql이 full scan을 실행했다면 scode='0401' 의 분포도가 크기 때문일것같습니다.

select  count(*) from new_pda_servstat_2004의 값과

select count(*) from new_pda_servstat_2004 where scode='0401'의 값을 비교해보세요. 인덱스를 사용한 후 테이블을 다시 읽는 것보다 테이블을 full sacn하는 것이 더 유리하다고 판단한 경우입니다.

 

[실행3]

select * from new_pda_servstat_2004 where scode='0401' and daytime>='20041205151211956286'

이것도 위와 유사 하다고 봅니다. scode뒤에 daytime이 더 추가가 되었지만 범위를 줄이지 못하고 scode='0401' 조건 하나만 들어왔을때만 count가 비슷할 것 같습니다.

select * from new_pda_servstat_2004 where scode='0401' and daytime>='20060605151211956286'

정도로 범위를 줄인다면 index scan을 할것같습니다.

 

 

도님이 2006-06-20 10:48에 작성한 댓글입니다. Edit

타입이 변경되는 경우 대부분 index를 사용하지 못하지만 특정 경우 타입이 변경되도 plan이 변경되지 않는 경우을 봤습니다. (V8)

도님이 2006-06-20 10:53에 작성한 댓글입니다. Edit

감사합니다..ㅠㅠ

select * from new_pda_servstat_2004 where scode='0401' and daytime>='20041205' and daytime <='20041205' and capitalcd='44'

 

이런식으로 범위를 줄여보니

 

1 Index Scan (No Table Access) NPA.NEW_PSSV_PK_2004 Index 3577.16 
2 Sort   3579.63 
3 Row Identifier Scan (RID)   3579.63 
4 Fetch Table Data NPA.NEW_PDA_SERVSTAT_2004 Table 6195.77 
5 Data Operation Complete   6195.77 

 

이렇게 인덱스를 타는군요.. 감사합니다~!

범위가 너무 넓어서 fullscan이 효율적이라 판단했나 봅니당

이문선(yurina99)님이 2006-06-20 11:17에 작성한 댓글입니다.

또 질문이용~~!!ㅠㅠ

전체 12000 에서 결과 200건 가량을 뽑아 내는 쿼리 인데요

 

select *
from new_pda_stat_cnt
where daytime>='20050101'
and daytime<='20050102'

 

이 테이블은 daytime+a+b+c

이런식으루 되어있는데요..

이경우도 인덱스를 못타더라구요..

이건 건수가 많은것도 아닌데..왜 그럴까요..

 

select *
from new_pda_stat_cnt
where daytime>='20050101'
and daytime<='20050101'

요것도 안탑니다

 

select *
from new_pda_stat_cnt
where daytime='20050101'

요것만 타더군요.. 결과는 같은데..

 

왜그럴까요??

 

이문선(yurina99)님이 2006-06-20 11:34에 작성한 댓글입니다.
이 댓글은 2006-06-20 11:45에 마지막으로 수정되었습니다.

기간을 지정할때 그렇게 쓰고 있는데 그런 경우는 보지 못했습니다. runstats를 다시 돌려보시죠 .

이상하네요.

도님이 2006-06-20 11:46에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
1025차세대 데이터베이스 신제품 DB2 V9 발표
BRAHMAN
2006-06-23
6896
1023Load utility 사용시 commit시점은 한번인가요??? [2]
이문선
2006-06-21
7567
1022query 질문 입니다.~!
이문선
2006-06-20
6822
1021[DB2]인덱스 사용에 관한 질문입니다 [5]
이문선
2006-06-20
7215
1020insert into A select * from B 시에 commit은?? [1]
이문선
2006-06-16
7043
1019db2 insert시에 transaction log공간 부족 에러시 [1]
이문선
2006-06-16
7349
1018DB초보입니다. Ms-Access2003 과 DB2 테이블 연결 안될까요?
최병훈
2006-06-16
7684
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다