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 4410 게시물 읽기
No. 4410
datetime 인덱스 질문입니다
작성자
권용재(amadeusj)
작성일
2008-08-25 10:12
조회수
5,007

MSSQL 에서 datetime 컬럼이 있습니다

이컬럼을 index 로 잡았습니다


근데 어디선가 본적이 있어서 질문드립니다


인덱스를 가공하게 되면 인덱스가 깨진다고했습니다

예를 들어

select * from testtable

where max(iCode) > 10

=> 해당 쿼리가 말이안되지만 막상 생각이 나는 예제가 없어서 억지로 끼어맞춘겁니다


이런식으로 인덱스인 컬럼의 데이타를 가공하게되면 인덱스 처리가 안된다고 알고있습니다


이런점은 이해가 되는데


datetime 일때

select * from testtable

where createDate = '2008-02-02' => createDate 는 datetime 입니다

이럴때는 실제 createDate 는 datetime 형식이므로 위와같은 데이타가 들어있지 않습니다

그러므로 내부에서 가공이 일어난후에 적용이 됩니다 (그냥 제생각입니다)

그렇다면 인덱스인 컬럼을 가공했으로 인덱스가 적용이 안된다고 알고있는데..

이런경우에도 맞는건가요?

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

저도 허접하지만 알고 있는 것을 알려드리겠습니다. 나머지는 고수님들 답변을 참고하세요.

인덱스의 개념을 알고계시면 의외로 간단하게 해결됩니다. 전화번호부를 예로 들겠습니다. 전화번호부를 보시면 이름순으로 만들어져 있다는 것을 아실겁니다. 인덱싱이 되어있다는거죠.

[book]
=========================
name        phone
=========================
김민우       02-123-5678
김상식            :
   :                 :
나정렬            :
   :                 :
사오정            :
   :                 :
홍길동            :
=========================
 다음과 같이 하면 홍길동이라는 이름의 전화번호를 쉽게 찾을 수 있습니다.
쿼리 : SELECT * FROM [book] WHERE name = '홍길동'

그럼 다음과 같이 성은 모르겠고 이름이 길동으로 끝나는 사람을 찾아오라고 하면 어떻게 될까요?
쿼리 : SELECT * FROM [book] WHERE name LIKE '%길동'
그러면 어쩔 수 없이 [book]전체를 뒤져서 이름이 길동으로 끝나는 사람들의 목록을 가져와야 합니다.

쿼리의 name부분에 함수를 사용해 버리면 똑같은 결과를 얻게 됩니다. 인덱스를 타서 첫 부분과 비교를 해야 되는데 함수를 사용해 버리면 전체를 살펴볼 수 밖에 없는거죠. 다음과 같은 쿼리가 그런 예입니다.
쿼리 : SELECT * FROM [book] WHERE SUBSTRING(name, 2, 2) = '길동' (전화번호부로 찾기가 쉽지 않습니다. 컴터는 단순합니다. 물론 성과 이름을 나눠서 인덱싱 해놓았다면 쉽게 찾을 수 있겠죠.)

물론 다음과 같은 쿼리는 인덱스를 이용합니다.
쿼리 : SELECT * FROM [book] WHERE name LIKE '홍길%' (전화번호부로 쉽게 찾을 수 있겠죠?)

필드에 함수를 이용한다는(가공한다) 말은 해당 필드명에 함수를 이용하는 것이지 값을 입력하는 부분은 상관이 없습니다. 다음 쿼리와 같이 해도 인덱스를 잘 탈 수 있다는거죠.
쿼리 : SELECT * FROM [book] WHERE name = SUBSTRING('홍길동이다', 1, 3)

한 마디로 이렇게 하지 말라는 말입니다. '홍길'로 시작하는 사람들의 전화번호 목록을 뽑고 싶다고 합시다.
쿼리 : SELECT * FROM [book] WHERE LEFT(name, 2) = '홍길'
이렇게 해버리면 인덱스를 탈 수 가 없습니다.

인덱스가 있는 컬럼을 가공하면 인덱스를 탈 수 가 없다는 것이죠. 오른쪽의 비교 값은 상관없습니다. 인덱스에서는 그게 중요한게 아니니까요.

지나가다님이 2008-08-25 13:27에 작성한 댓글입니다. Edit

네...답변 감사합니다~
좀더 제가 확인을 해봐야겠네요.

권용재(amadeusj)님이 2008-08-25 16:07에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
4413mysql에암호된것을 mssql사용가능한가요 [1]
김길동
2008-08-25
4764
4412문자를 날짜로 입력 [1]
고형윤
2008-08-25
6042
4411작업별 처리율을 구하려고 합니다 [1]
쿼리질문요
2008-08-25
5326
4410datetime 인덱스 질문입니다 [2]
권용재
2008-08-25
5007
4409개월수를 구하고 싶어요... [1]
정명규
2008-08-24
5063
4408오류코드 목록을 알고 싶습니다. [3]
구니
2008-08-23
5128
4407sql server 2005 설치 -> 다시 2000 설치 후 접속 문제
도와주세요!
2008-08-22
4841
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.019초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다