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
운영게시판
최근게시물
Oracle Q&A 22148 게시물 읽기
No. 22148
CHAR : VARCHAR2...음....
작성자
김흥수(protokhs)
작성일
2005-03-28 01:33ⓒ
2005-03-28 01:41ⓜ
조회수
5,018

토요일날 이런 저런 일로 제가 개발하고 있는 사이트의 정보기술 담당과 약간의 마찰이 있었읍니다.

 

사실은 전 CHAR 데이타 타입은 안 씁니다..

 

그런데 고정길이 컬럼은 CHAR를 쓰라고 태클이 들어왔습니다.

제 아픈 기억으로는 D2K 쓸때 CHAR 타입을 쓰면 MASTER - DETAIL 코딩에 문제가 있어서 애를 먹은 후로는 CHAR는 안씁니다...쓰기 싫구요

 

그의 이야기는 VARCHAR2는1 byte의 오버헤드가 있어서 VARCHAR2(1)은 CHAR(1) 보다 1Byte 자리를 더 잡아 먹는다. 즉 VARCHAR2(1) 은 실제로는 2자리를 잡아먹으니 일단 태그 성격은 전부다 CHAR(1)로 고치라는 겁니다.

 

사실 무언가 문제가 터질지 알 수가 없어서 이 사람 말을 들어주고 싶지가 않은데...

 

저번에는 년월 타입은 CHAR(6)을 써라 날짜는 7자리인데 무엇하러 년월만 쓸 걸 날짜 타입을 쓰냐?

한자리도 아깝다 그러는 걸 연산이 쉽네 어쩌네 하며 안 바꿔줬는데...

이번이 2차 태클입니다.

 

어떤 좋은 수가 있을런지?... 아님 그냥 확 바꿔줘 버릴까요?

 

지금까지 제가 읽은 책들에는 실제 오라클의 데이타가 저장소에 저장되는 이미지가 어떤 형태로 저장된다는 부분은 없었습니다.

압축되는지.. 아니면 바이너리 저장되는지...

Varchar2가 정말 1byte 오버헤드가 있는지...(이 부분 잘 이해 안됩니다.1byte가 null terminate인가? 그럼 만약 오라클이 null을 저장할 때는 null을 두개 저장하여 null임을 표시하나?)

이 글에 대한 댓글이 총 9건 있습니다.
고서진(dreamt)님이 2005-03-28 05:32에 작성한 댓글입니다.
이 댓글은 2005-03-28 05:34에 마지막으로 수정되었습니다.

고서진님 조언에 감사드리구요

제가 영어가 짧아서리

대충 보니까 ,CHAR가 전혀 유리하지 않다는 것은 알겠는데요.

그 문서에

A CHAR datatype and VARCHAR2 datatype are stored identically (eg: the word
'WORD' stored in a CHAR(4) and a varchar2(4) consume exactly the same amount of
space on disk, both have leading byte counts).

이렇게 되어 있는데요 밑줄친 부분이 둘다 문자열 길이 정보를 가져간다는 뜻인가요?

 

그렇다면 문자열의 오버헤드가 4000,2000을 표시하기 위해 최소 16비트가 되어야 한다고 이해해도 되겠습니까?.....

김흥수(protokhs)님이 2005-03-28 09:09에 작성한 댓글입니다.

2000자 짜리 char, varchar2 는 모두 물리적으로 저장될때

첫 2바이트는 문자열의 byte수이고 3번째 바이트 부터 실제 문자열이 저장된다는 뜻 맞습니다.

leading byte count 가 2바이트인지는 확실친 않지만 2바이트일 가능성이 클것 같습니다.

 

크게 중요한 사항은 아닙니다만, 토마스 아저씨가 마지막에 남긴 말씀도 참고 하세요. ^^

The only time I personally use a CHAR type is for CHAR(1).  And that is only
because its faster to type char(1) then varchar2(1)

고서진(dreamt)님이 2005-03-28 09:53에 작성한 댓글입니다.

감사합니다.

그런데 마지막 글....

토마스 아저씨 말대로라면 char(1)일 때도 varchar2(1) 보다 빠를 이유가 없을 듯 한데요.... 왜 그런 말을 했을까요?

 

그리구 또 한가지 의심이 가는 것은 OCI 문서 보면 long 타입 같은 것은 분명하고 명백하게 갯수와 관련된 정보가 데이타 자체에 보관됨을 말하고 있읍니다만.

VARCHAR2나 CHAR는 그런 말이 없구요...

또하나 이해가 안되는 것은

토마스 아저씨 말대로 문자열 길이 정보가 저장이 된다면...

만약 데이타가 null 일때도 기본으로 2자리는 최소 잡아먹는다는 말인데요...

오라클에서 실제 저장 이미지를 그런 식으로 관리한다는 것이 언뜻 이해가 안갑니다...

토마스 아저씨 말이라면 모... 맞겠지만...

그 사람 말이 공식 오라클 말은 아니지 않습니까?

김흥수(protokhs)님이 2005-03-28 10:01에 작성한 댓글입니다.

흠.. 제 기억으로도 varchar2가 약간의 오버헤드가 있는걸로 알고있습니다.

 

어디선지는 기억이 안나지만.. 그럼으로인해 고정길이는 char 타입을 쓰는게 유리한걸로 알고 있는데요...

 

varchar2의 장점은 가변적으로 공간을 차지하기 때문에 고정길이로 안들어가는 데이타는 varchar2가 더 효율적이기 때문에 가변적인 데이타는 varchar2로 잡는것이지요.. 모 당연히 이정도는 아실것같고..

 

제가 봤을때 문제점은 김흥수님께서 char 타입에 대해 안좋은 추억이 있어서... char로 잡는게 싫으신거같네요.. 고걸 먼저 바꾸셔야 할듯..

 

위의 예로도 보면 년월만 들어가는것도 date 로 잡으시는것 같은데

저같아도 태클들어갈듯하네요.. 당연히 char 6자리가 더 효율적인건데

date로 잡았으니...

 

^^  경험이 많으신 김흥수님인걸로 알고있는데... 원래 많은 경험을 가지고 계신분들 상대하기가 더 어렵습니다.. 대개 그 분들은 자기만의 생각을 추구하시려는게 많기 때문이지요.. 김흥수님께서 한발 물러나셔서 더 넓게 보시는게 더 좋은 방법이 되지 않을까 라고 감히 한말씀올리고 갑니다....

 

P.S 그분도 이해해주세요.. 저도 비슷한경험이 있는데 공간없어서 고민고민하는데 단 한자리도 아까워서 그러는걸겁니다.. 공간부족 이거 미칩니다..

ㅠ.ㅠ님이 2005-03-28 10:35에 작성한 댓글입니다. Edit

 

제 지식의 한계로 더이상은 답을 해드릴수가 없네요.

 

저도 오라클로 작업을 하면서 의문점들이 많으나 실제 어떻게 구현되어 있는지 까지 알아내기는 힘들더군요.

(위의 예에서 제가 제일 궁금한것은 왜 CHAR 에도 BYTE COUNT가 저장되는지 하는것 입니다만, 저도 알아내지 못했네요.)

요러한 사항들은 오라클 개발팀에 왜 그런식으로 구현하셨나요? 하고 문의하지 않는한 알기 힘들겠지요.

 

토마스 아저씨의 말이 오라클의 공식 입장은 아니지만, 오라클 최고 권위자라는 타이틀을 빼고라도,

오라클에서 근무하시는 분인 만큼 가능한 조심해서 답변을 할거라고 예상이 됩니다.

또 대부분 근거를 제시해 주고 계시구요.

비록 위의 답변에서는 아니었지만이요.

 

고서진(dreamt)님이 2005-03-28 10:54에 작성한 댓글입니다.

일단 VARCHAR2는 CHAR보다 1BYTE SPACE를 찾지한다고 알고 있습니다.

그런데 그것때문에 DB 용량이나 검색속도가 문제가 되지는 않을것 같습니다.

물론 DATA 건수가 많으면 찾지하는 용량도 조금 많아 지겠죠 하지만 요즘 DISK

가격이 저렴하니까...

 

저는 날자 관련하여 TYPE 을 아래와 같이 사용합니다.

 

CHAR : 죽었다 깨어나도 자리변화는 없다.

            무조건 날자를 체크한다.

 

VARCHAR2 : 혹시 모른다. 

                    무조건 날자를 체크한다.  

 

DATE : 체크도 귀잖다.

           나중에 다른 용도로 사용될 가능성이 있다.

초짜님이 2005-03-28 11:49에 작성한 댓글입니다. Edit
bluepark님이 2005-03-28 14:48에 작성한 댓글입니다. Edit

varchar2 는 가변길이이기 때문에 길이에 대한 정보가 헤더에들어가서 오버헤드가 발생하긴하지만 오라클 쪽에는 varchar2 를 사용하는걸 권장하는걸로 알고있읍니다. 여러가지이유가있던데 생각이 잘나질안는군요 .아마 웹사이트에서 검색해보시면 찾으실수 있을것입니다.

김정민님이 2006-02-16 09:52에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
22151일어입력시 ?표로 나오는 부분 [nvarchar] [3]
김남하
2005-03-28
2481
22150특정컬럼이 있는 테이블 찾기 [1]
신효섭
2005-03-28
1361
22149테이블을 주기적으로 자동으로 Truncate 시키는 방법
안용주
2005-03-28
2018
22148CHAR : VARCHAR2...음.... [9]
김흥수
2005-03-28
5018
22147답좀주세요... [1]
박민국
2005-03-27
1415
22146포인트를 차감시키려 하는데요.ㅜㅜ [2]
김민석
2005-03-27
1541
22145위 쿼리에서 그룹별로 소계를 내야하는데요.. [10]
서상서
2005-03-27
8779
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.019초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다