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
운영게시판
최근게시물
MS-SQL Q&A 1586 게시물 읽기
No. 1586
인덱스 기법 조언부탁
작성자
김민영(visionmcoj)
작성일
2004-09-30 10:52
조회수
3,867

두개 테이블을 조인해서 select 를 하는 문장이 있습니다.

ALL_EVENT 테이블은 날짜시간초 의 값이 있습니다.

두가지는 uniqueidentifer 형식의 키값을 가지고 있습니다.

여기서 ALL_EVENT 테이블은 하루에도 수만건의 데이터가 쌓이고 있습니다.

 

다음과 같이 날짜를 하루단위로 범위 축소를 해서 가져오려고 하는데요

아무래도 워낙 큰 테이블을 query하려고 하니 부담이 되고 있습니다.

오라클에서는 hash join 기법이라던지.. 이런 부분을 사용했었는데요.

 

여기서도 날짜나 pkguid 에는 index는 걸었습니다.

다른 좋은 방법이 있는지 조언 부탁드립니다.

 

select convert(char(8), Event.times,112) as 날짜 , Query.querystring as 검색어
FROM ALL_EVENT Event, ALL_EVENT_QUERY Query
WHERE Event.pkguid=Query.pkguid
AND Event.times between CONVERT(char(8),GETDATE()-1,112)
AND CONVERT(char(8),GETDATE(),112)

 

 

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

sql문으로는 자세한 답변은 못드리겠는걸요..

 

여튼 참고하십시요. 물론 아주 교과서적인 답변이라 욕하실지도 모르겠지만요.

우선은 이미 인덱스를 물어보셨다면 인덱스에 대한 의미나
인덱스의 종류에 대한 것은 이미 알고 있는 걸로 가정하고 들어가겠습니다.
(너무 단순 테크닉이라고 욕할지 모르시겠는걸요 ^^)

인덱스의 사용에 대한 전략이라면
1. WHERE절에서 참조되는 컬럼.
2. 참조키가 설정되어 있는 컬럼.
3. 참조키는 아니지만 JOIN에 사용되는 컬럼.
4. 범위 검색이 일어나는 컬럼.
5. ORDER BY로 정렬 되는 컬럼, GROUP BY로 그룹핑 되는 컬럼.

 

사용을 자제 하고자 하는 부분은...
1. WHERE절에서 사용되지 않는 컬럼.
2. WHERE절에서 함수로 변환하여 사용하는 칼럼.

등등입니다.

 

따라서 pkguid에 인덱스를 건것은 맞는 전략이 되겠지요.

그러나 날짜에 대한 것은 고민을 하여야 하지 않나 싶습니다.

 

 

여리님이 2004-09-30 11:38에 작성한 댓글입니다. Edit

감사합니다.

 

하나만 더 여쭤보겠습니다.

함수로 변환된 컬럼에는 함수 인덱스를 거는 방법이 있나요?

말씀대로 times 에는 clustered indexed scan 이네요.

일종의 풀스캔을 하고 있는거 같아여. (indexed seek가 아니네요)

 

함수 인덱스가 있으면 좋을 거 같은데...

김민영(visionmcoj)님이 2004-09-30 12:09에 작성한 댓글입니다.

제가 알기로는 함수는 index를 타지 않는 걸로 알고 있습니다.

아쉬운데요.  ^^

 

여리님이 2004-09-30 12:49에 작성한 댓글입니다. Edit

event 테이블에는 times와 pkguid로 인덱스를 거시고

(순서가 중요합니다. times, pkguid로 거셔야 합니다.)

query 테이블에는 pkguid로 인덱스를 거시면 됩니다.

 

그럼 일단 스켄은 둘다 index 스켄을 하게 됩니다.

 

조인부분은 상황을 좀더 고려해야합니다.

만약 하루종일으 pkguid가 query에 존재하는 pkguid의 존재 %를 고려하셔야합니다. 만약 %가 낮으면 hash 조인을 유도하셔야하고 %가 높다면 hash를 사용하면 안됩니다.

%가 높은경우 query 테이블은 full스켄을 유도 하는것도 좋은 방법입니다.

 

이상 원론적인 이야기였습니다.

p.s. 그리고 질문시 ddl을 같이 올려주시면 테이블상황이나 레코드수등을 유추하는데 도움이 될거 같습니다. sql 튜닝는 레코드수나, 카디널리티가 아주 중요합니다.

장종훈님이 2004-10-01 11:42에 작성한 댓글입니다. Edit

감사합니다..

말은 무슨말인지 알겠는데..

실행을 하려니.. 좀 깜깜.. ^^;

 

현재 신설 db다 보니, 데이터가 없어서 저도 정확히 예상할 수 없어서

어설프게 질문했습니다.

 

한번더 대답 주신대로 해보고 또 글 올릴께요. ^^

김민영(visionmcoj)님이 2004-10-01 18:29에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
1589update에 관해서 여쭈어보겠습니다. [1]
이명진
2004-10-01
2713
1588파라독스db와 비주얼 베이직과 연결시 오류
이관수
2004-10-01
2379
1587[질문] Tree 구조 테이블 구현법 [2]
김찬수
2004-09-30
3647
1586인덱스 기법 조언부탁 [5]
김민영
2004-09-30
3867
1585[질문]테이블이 2개 이상때 FULLTEXT 검색 방법?
김찬수
2004-09-30
3142
1583같은 디비의 테이블에 복사와 다른 디비로의 복사, 어떤것이 빠를까요? [1]
qudals
2004-09-24
2809
1582MYSQL1064오류나서요 제발 답변 부탁드려요 [1]
김은경
2004-09-24
2197
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다