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 3541 게시물 읽기
No. 3541
Datetime과 SmallDatetime의 차이 ?
작성자
김영수(io2tree)
작성일
2007-06-01 11:38
조회수
7,290

검색의 생활하를 하고 있지만 원하는 내용의 글이 없어서 이렇게 글 올립니다.


날짜형식의 필드를 만드는 과정에서 DataTime 형시과 SmallDateTime 의 차이점이 궁금해져 이렇게 질문을 드립니다.


Datetime의 경우 1/100초 까지 계산을 한다는 것

SmallDatetime의 경우 분까지 계산이 된다는걸로 알고 있는데..


select getdate() --> 2007-06-01 11:33:29.357

select convert(smalldatetime,getdate()) --> 2007-06-01 11:33:00



데이터의 크기가 Datetime의 경우는 8 SmallDatetime의 경우는 4로 알고 있습니다.


데이터베이스 설계를 바꾸는 과정에서 Datetime을 SmallDatetime으로 변경하려 합니다.. 굳이 초까지 쓸일이 없는데다가 데이터가 작다면

좀더 좋은 성능을 뽑을수 있을까 해서 입니다.


질문의 요지는 Datetime을 SmallDatetime으로 변경했을때 얼마만큼의 성능의 이득을 볼 수 있을까 입니다..


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

저도 초보라서 두 개의 큰 차이점을 알 수 없습니다. 다만 님께서 말씀하신대로 크기가 차이가 난다면 성능상에 조금이라도 차이가 나겠죠. 데이터베이스의 경우 IO부분에서 부하가 생기면 엄청난 속도저하를 가져옵니다. IO부분에 부하가 적다면 그만큼 빨라지겠죠? 데이타가 허용할 수 있는 범위의 가장 작은 데이타형을 잡아주는게 좋다고 생각됩니다.


허접 답변이었습니다.

초보님이 2007-06-04 07:57에 작성한 댓글입니다. Edit

datetime 은 8바이트이고 정수부(연도) 4바이트 + 소수부(시간) 4바이트로 구성됩니다.
smalldatetime 은 4바이트이고 정수부(연도) 2바이트 + 소수부(시간) 2바이트로 구성됩니다.

내부 코드를 알지 못하니 동작도 정확하게는 알수가 없지만
기본적으로 32bit 코드라면 데이터 처리를 4바이트씩 할테니 단순하게 생각하면
smalldatetime 이 더 빠르다고 생각될 수도 있습니다.
하지만 이것도 좀 더 세부적으로 생각해보면 쿼리의 형태에 따라 그렇지 않을 수도 있는데요.
특정 시각 비교일 때는 8바이트와 4바이트로 분명 smalldatetime 이 더 빠들것 같지만
날짜만 비교한다면 과연 smalldatetime 이 더 빠를 것인가 의문입니다.
왜냐하면 날짜만 비교한다면 datetime 은 앞 4바이트만 비교하면 되고
smalldatetime 은 4바이트에서 다시 앞 2바이트를 추출하거나 아니면
32bit 비교에서 앞 16bit에 대한 마스크로 비교하겠지요.

select convert(datetime,2958463.555555556), convert(smalldatetime,65535.555555)

사실 datetime 이 성능에 영향을 주는 쿼리가 어떤것인지 잘 모르겠습니다만
smalldatetime 은 날짜 한계가 2079년으로 그뒤로도 사용될 프로그램이라면
사용하지 않아야 하는 타입이라고 볼수 있습니다.
아니면 70년 뒤에 필드를 수정하셔도 되구요. ^^;
실시간 통계가 아니라면 datetime 이 영향을 줄만한 쿼리가 얼른 안떠오르네요.


아래는 테스트
create table test_datetime (
 id int identity not null primary key,
 num float,
 c_datetime datetime,
 c_smalldatetime smalldatetime
)

insert into test_datetime (num,c_datetime,c_smalldatetime)
values (50000*rand(0),50000*rand(0),50000*rand(0))

insert into test_datetime (num,c_datetime,c_smalldatetime)
select 50000*rand(id), 50000*rand(id), 50000*rand(id)
from test_datetime

여러번 실행(테스트는 800만개)

아래쿼리에서 문자열로 들어간 시각은 암시적으로 형변환됩니다.

select * from test_datetime
where c_datetime = '2000-01-01 01:23:45.667'

select * from test_datetime
where c_smalldatetime = '2000-01-01 01:23:45.667'

두쿼리 비용 50%로 동일(풀스캔)
가져온 row수 0건, 0건
실행시간 42초
-----------------------------------------------
select * from test_datetime
where c_datetime > '2000-01-01 01:23:45.667'

select * from test_datetime
where c_smalldatetime > '2000-01-01 01:23:45.667'

두쿼리 비용 50%로 동일(풀스캔)
가져온 row수 2,318,555건, 2,318,555건
실행시간 3분 46초
-----------------------------------------------
create index idx1 on test_datetime(c_datetime)

create index idx2 on test_datetime(c_smalldatetime)

쿼리비용 51.17%, 48.83%
(크기에 따라 IO 비용이 다르긴 다른가 보네요. 800만건에 대한 예상보다는 작은수준)
실행시간 2분16초  
-----------------------------------------------
select * from test_datetime
where c_datetime = '2000-01-01 01:23:45.667'

select * from test_datetime
where c_smalldatetime = '2000-01-01 01:23:45.667'

두쿼리 비용 50%로 동일(인덱스seek)
가져온 row수 0건, 0건
실행시간 0초
-----------------------------------------------
select * from test_datetime
where c_datetime > '2000-01-01 01:23:45.667'

select * from test_datetime
where c_smalldatetime > '2000-01-01 01:23:45.667'

두쿼리 비용 50%로 동일(인덱스 걸었지만 풀스캔함)
가져온 row수 2,318,555건, 2,318,555건
실행시간 4분 35초
-----------------------------------------------
select top 100 * from test_datetime
order by c_datetime desc

select top 100 * from test_datetime
order by c_smalldatetime desc

두쿼리 비용 50%로 동일(인덱스scan)
가져온 row수 100건, 100건
실행시간 0초
-----------------------------------------------
select * from test_datetime
where c_datetime > '2036-11-22 01:23:45.667'

select * from test_datetime
where c_smalldatetime > '2036-11-22 01:23:45.667'

두쿼리 비용 50%로 동일(인덱스seek)
가져온 row수 159건, 159건
실행시간 0초
-----------------------------------------------

이 테스트가 모든걸 보여주지는 못하겠지만
비슷한 필드일 경우 단지 크기가 작다고 해서 성능이 비례해서 증가하지는 않을거 같습니다.
insert, update, delete 가 현저하게 많다면 약간 다른 문제겠지만요.
정말 중요한 것은 테이블에 대한 설계와 성능을 향상시킬 수 있는 쿼리가 아닌가 합니다.

맛박님이 2007-06-05 19:15에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
3544일괄업데이트 [1]
푸롬이
2007-06-01
2559
3543좀 도와주십시오.. [2]
왕초보
2007-06-01
3681
3542access(mdb)에서 null처리 문제(.net 2.0)? [1]
지화복
2007-06-01
3476
3541Datetime과 SmallDatetime의 차이 ? [2]
김영수
2007-06-01
7290
3540어느것이 성능에 더 좋을까요 ? [2]
김영수
2007-05-31
3045
3539update시 order by 오류 [3]
푸롬이
2007-05-31
4551
3538left join일때 sum처리
풍뎅이
2007-05-31
2969
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.018초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다