안녕하세요.오라클로 디자인된 DB를 DB2에서 변환하려고 합니다.
예를 들어, 오라클에서WEDD_DATE VARCHAR2(8) 이란 컬럼이 있고 여기에는 'YYYYMMDD'로 날짜가 들어가게 됩니다.
DB2에서 단순히 VARCHAR(8)로 해주면 될 것 같은데, DATE라는 타입이 따로 있더군요.
VARCHAR(8)로 하는 것과 DATE로 하는 것중 어떤 게 나을까요?답변부탁드립니다.
VARCHAR(8)보다는 데이터 길이가 '20041110' 이런 식으로
일정하게 들어옴으로 CHAR(8)이 더 좋습니다..
그러나..
CHAR(8)로 정의하면.. 8BYTE를 사용하게 되지만..
DATE로 정의하면.. 4BYTE를 사용하게 됩니다..
그러므로 데이터 양이 많을 수록.. 그만큼..SPACE를 절약하게 됩니다..
또한.. 날짜 연산에 따른 프로그램의 로직도 덜수 있습니다..
참고로..
테이블을 설계시에는 CHAR보다는 DATE로..
VARCHAR보다는 CHAR를 사용하는 것이 좋습니다..
VARCHAR를 사용시에는 테이블 왼쪽(?)에 두는 것이 성능에 좋습니다..
제 생각은 조금 다릅니다.
오라클에서 날짜값을 varchar2(8)로 만든것은 용량적인 측면보다
성능적인 측면을 고려하였다고 보여집니다.
날짜값이 들어가는 데이타인 경우에 보통 데이타건수가 많아지기
마련입니다. 그리고 이러한 날짜 데이타를 어플리케이션과 연결하고
입력과 출력을 설계할때 날짜 포맷에 들어있는 년/월/일/시/분/초
들 중에서 모든 항목을 다 보여주거나 핸들링 하는 로직보다 년/월/일
과 같은 데이타만 으로서 핸들링 하는 경우가 더 많습니다.
이러한 경우 이부분을. 날짜 타입 자체에 인덱싱을 하게 되면
결국, 조건절에서 어느쪽이든 부득이 변환을 일으켜야 됩니다.
where last_ddl_time = to_date('10252004113844') 이 되던
where to_char(last_ddl_time,'YYYYMMDD') = '20041025' 이 되던
어느 한쪽을 선택하게 되는 경우가 오게 되므로 캐스팅 함수를 한번은
타야 하게 되고 또한 아래쪽의 예처럼 하게되면 오히려 인덱스를
사용하지 못하는 사태도 발생합니다.
그러기에 데이타가 많아지는 경우에도 퍼포먼스를 기대하기 위해
그러한 선택을 하였다 생각되어집니다.
이러한 메커니즘은 오라클이나 DB2나 다른 DB들도 같은 원리로
동작합니다. 단지 DB2에서는 더욱 세밀히 용량타입을 선택하고
핸들링 할수 있으므로 위에분 말씀대로 CHAR(8) 타입이 더
좋은 선택이 될수 있습니다.
그러나 이 선택이 나빠지게 되는 경우도 있습니다.
아주 세밀한 판단근거(?)가 있어야 하는경우 말하자면 년/월/일 외에
시/분/초 도 어떨때는 필요할 경우도 있습니다.
그렇다면 두개의 컬럼으로 가져가야 하는냐..혹은 위의 경우처럼
어느한쪽을 선택하고 어느 한쪽을 버려야 할것이냐 하는 선택에
놓일수 있다는 것입니다.
우선은 이 컬럼이 조건으로 어떻게 정형적으로 쓰여야 하는지
파악하는것이 우선이 되어야 할것이며,
결론적으로 조회성능을 높이는 것에 초점을 맞추신다면, DATE
타입보다 VARCHAR 혹은 CHAR 타입이 더 좋은 선택이라
생각되어집니다.
윗분 말대로 퍼포먼스도 중요하지만
DB2는 메인프레임쪽에서 쓰는경우가 많은데... 그만큼 더 용량이 중요하지 않을까 생각되네요..
쓸데없이 varchar로 잡는것보단 char로 char 보단 date 로 하는게
용량을 줄일수 있고.. 또한 퍼포먼스 측면이야 sql 작성을 할때 잘생각
해서 하면 될듯...
음...
두번째설명은 DATE type과 TIME type을 혼용한 것 같은데요. db2의 date type은 년월일까지만 포함하지 시분초를 포함하고 있지는 않지요.
지금 말씀하신 질문은 date type으로 할지 그냥 varchar(8)로 할지의 질문인것 같네요.
db2의 date type은 'yyyy-mm-dd'형식이고 저장byte는 4byte이며..
성능측면에서도 전혀 문제가 없으며 오히려 date간 연산과 날짜에 대한 자동 정합성체크가 되기때문에 varchar(8)나 char(8)로서 사용하는 것보다 훨씬 유리합니다. 조건절에서 비교할때 function을 쓸 일은 없구요. 그리고 date type에 대한 인덱스지정도 당연 가능합니다.
oracle에서의 date type과는 또 약간 다른데요. db2로 변환을 하신다고 하면 당연히 date type을 사용하는 것이 유리합니다. 성능도 그렇고 저장하는 측면도 그렇고 pgm에서의 사용측면에서도 그렇지요.
일반적으로 db2를 사용하는 시중은행권에서도 그렇게 사용하구 있구요. (그리고 db2에서는 to_char나 to_date같은 함수는 없지요..)
to_char() 대신 varchar() 를 쓸수 있습니다 포맷지정은 한정적이지만 어쨌든 호환되지요