제3장 데이터 타입의 길이의 결정
- 관계형 데이터베이스에서 제공하는 데이터 타입은 대개 CHAR, VARCAHR2, NUMBER, DATE, LONG, RAW, LONG RAW, ROWID 타입으로 분류한다.
- 우리는 원하는 정보를 가장 효율적으로 처리하기 위해서 적절한 데이터 타입의 선정이 필요함
- 적절하지 못한 데이터 타입은의 선정은 수행속도를 나쁘게 하고 불필요한 자원을 낭비를 가져온다.
- 옵티마이져의 액세스 경로 선정에 나쁜 영향을 미치기도 한다.
- 서로관계를 가지는 컬럼들에 대해 '데이터 타입의 일관성' 을 지키지 않을 경우에는 고생을 하는 경우가 많이 발생한다.
1. 데이터 타입의 선정 절차
- 데이터 모델링을 통해 작성된 ERD(Entity Realationship Diagram)를 이용하여 물리적 데이터베이스를 설계
- 테이블 결정 후 속성(Atrribute)을 컬럼(Column)으로, 관계(Relationship)을 외부키(Foreign Key)로 지정
- 각종 비지니스 룰(Business Rule)를 찾아 제약조건(Constraints)로 지정
- 컬럼의 데이터 타입과 길이를 결정
- 컬럼의 데이터 타입과 길이를 결정하기 위해서 우리가 해야할 절차
- 먼저 데이터가 문자타입인지 숫자타입인지 확인하여 문자타입이 고정길이로 할것인지, 가변길이로 할것인지 결정
- 그밖에 음성이나 이미지 정보를 관리하거나 LONG타입의 사용여부를 결정한다.
- 날짜처리를 위해 DATE타입을 사용할것인지, 일반문자타입으로 할 것이니 결정
- 데이터 값이 숫자타입이라 할 지라도 문자타입으로 할 필요는 없는 검토
- 숫자타입의 경우 인덱스르 사용할수 없게 하므로 신중하게 판단해야하며 숫자타입으로 결정했다면 소수점 자리수를 확실히 결정
- 데이터 타입이 결정되었드며 선정된 타입의 특성에 따라 적적한 길이를 확정한다.
1.1 문자타입, 숫자타입의 결정
- 우리가 결정하고자 하는 컬럼의 값이 문자형태인지 숫자 형태인지 조사한다.
- 연산을 하게되는 컬럼의 값은 당연히 숫자타입이겠지만, 코드화시킨 컬럼이나 그밖의 각종 인조키(Artifical Key)들은 숫자타입으로 할수도 있고 문자로 할수도 있다.
- 인조키란 임의 값에 의미를 부여하는 것이므로, 상황에 따라 어떠한 값을 부여할 수도 있다.
- 가능한 문자와 숫자들 같이 결합하는것은 좋지 못하다.
- 필요에 따라 변별력(Readability)을 향상시키고 사용상의 편의를 위해서 문자와 숫자의 조합도 좋은 방법이 될수 있다.
- 데이터 값이 숫자이든 문자이든 간에 그 데이터 타입을 어떻게 하느냐는 아주 중요한 사항이다.
- 만약 숫자를 가지는 한자리로 지정된 컬럼을 NUMBER타입으로 했다면 오히려 저장되는 길이가 늘어난다.
- 다른컬럼과 비교될 때 내부적인 변형을 일으켜 인덱스를 사용할수 없게 만들지 모른다.
1.2 문자타입의 확정
문자타입의 확정을 위해서 우리가 해야할 절차
- 먼저 일반 문자타입(CHAR, VARCHAR2)로 할 것인지 특수형태(LONG, RAW, LONG RAW)로 할것인지를 결정한다
- 만약 일반 문자타입으로 결정했다면 고정길이(CHAR)로 할것인지 가변길이로(VARCHAR2)로 할것인지를 결정한다.
- 최대길이를 조사하여 컬럼의 길이를 결정한다.
- 최대길이가 2000바이트가 넘는다면 LONG타입의 사용여부를 결정한다.
- LONG타입은 약간의 제한이 있기 때문에 현재의 사용환경이 그 제한요소에 저촉되지 않는지 확인해야 한다.
- 가변길이(VARCHAR2)를 여러개 사용할 필요가 있는 검토하여 결정한다.
- 음성(Sound)나 영상(Image)처리를 해야하는 특수한 경우는 처리할 양이나 보유한 장비에 따라 테이블의 컬럼으로 지정할 것인지 다른 매체를 이용할 것인지 결정한다.
1.3 숫자타입의 확정
- 컬럼값이 비록 숫자라 하더라도 반드시 숫자타입으로 해야 하는것은 아니다.
- 연산을 하거나 일련번호 등이 아닌 경우 저장공간을 절약하기 위해 함부로 숫자타입으로 지정하면 예기치 못했던 문제들이 일어날수 있다.
{tip:title=숫자타입의 확정을 위해서 우리가 해야할 절차 }
- 문자타입으로 해야 할 필요는 없는지 검토한다. 주로 향후에 인덱스로 구성될 인조키에 해당하는 컬럼이나 구분코드등이 여기에 해당된다.
- 숫자티입으로 결정했다면 최대 길이를 조사하여 결정한다.
- 숫자타입은 고정길이가 아니다.
- 숫자타입은 입력된 숫자의 길이를 2로 나눈 길이에 부호(Sign)관리를 위해 1바이트가 추가로 결합(Pack Decimal)된 가변길이로 저장된다.
- 소수점 몇자리까지 관리할 것인지 정확히 조사하여 결정한다.
- 만약 년월일(YYMMDD) 형태로 관리하고자 하는 숫자컬럼은 문자타입으로 하는것이 훨씬 유리하다.
{tip}
1.4 날짜타입의 확정
- 관계형 데이터베이스에는 날짜를 관리하기 위한 DATE타입이 있다.
- 일반숫자와 같이 자유로운 연상이 가능하고 날짜와 관련된 많은 특별기능(Date Function)들이 있다.
- 각 나라마다 사용되는 상이한 날짜유형도 DBMS의 특정기능을 이용해 원하는 유형으로 사용할 수도 있다.
2. 데이터 타입의 선정
- 각 데이터 타입별 특성을 자세하게 파악해 보고 각 컬럼의 속성에 따라 어떤 데이터 타입을 결정해야 할 것인지를 알아보기로 한다.
- 최적의 데이터 타입을 선정하기위해서 우리가 반드시 알아두어야 할 각 데이터 타입별 특성들이 무엇인지를 알아보고 그 활용에 대한 기준을 수립해 보고자 한다.
- 고정길이(Char) 데이터 타입 과 가변길이(Varchar2) 데이터 타입의 고유한 특성과 그 활용기준을 제시한다.
- 데이터 타입의 특성으로 인해 우리가 적절한 조치를 해야 할 사항들과 문자 타입의 비교법칙을 알아본다.
- NUMBER 타입의 효율적인 사용기준과 DATE타입의 선정기준을 제시한다.
- 이 데이터 타입들은 인덱스 사용과 밀접한 관계를 가지고 있어 수행속도에 미치는 영향이 매우크다.
- 상황에 따른 최적의 선정방법을 알아보고 이미 적절하지 못한 데이터 타입을 선정하여 사용중이라면 발생하는 비효율적인 문제를 해결하는 방법을 제공한다.
- 기타 LONG, RAW, LONG RAW, ROWID 타입의 사용기준과 주의사항을 알아본다.
2.1 CHAR 타입
가. 특성
- 고정길이 문자 데이타(Alphanumeric)
- 최대 길이 : 255 byte (default = 1byte)
- 다른 타입에 비해 제한이 적다
- 일부 입력시 BLANK 가 자동으로 채워짐
- 지정된 길이보다 길면 입력시 에러가 발생
- 전혀 값을 주지 않으면 NULL 상태로 입력
- 연속된 여러개의 컬럼이 마지막 컬럼까지 NULL값을 가진다면 그 전체가 단 1 Byte를 가진다.
- NOT NULL 사이에 있다면 각각의 NULL 컬럼은 1 바이트를 가진다.
- NULL값이 예상되는 컬럼들은 가능한 연속된 순서로 지정하는것이 바람직하다.
나. 활용
- 데이타가 고정길이인 경우
- 모든 데이터가 고정길이를 가진다고 하더라도 비교되는 다른 컬럼들과 서로 다른 데이터 타입을 가진다면 비교가 어려워 질수 있다.
- 컬럼 길이가 짧고 거의 모든 데이타의 길이가 일정량을 넘는 경우 고려
- 컬럼의 길이가 한자리 경우에 사용한다.
- 가변길이로 지정할 경우 많은 체인(chain) 발생이 우려되는 경우
- 채워진공백은 다른 컬럼이나 로우가 사용할수 없는 불용성재고 인것이다.
- 데이터 액세스될때 불필요한 공백까지 네트워크를 타고 이동하게 되며 컬럼의 비교법칙에 의하면 비교시에도 훨씬 비효율적인 일이 발생함
- 곧 이어 데이타가 입력되는 경우
- 테이블 생성 SQL에 DEFAULT constraint를 ' '(blank) 로 지정
- 길이의 편차가 심한 경우에 사용하면 불필요한 저장공간의 낭비, 수행속도가 저하
2.2 VARCHAR2
가. 특성
- 가변길이 문자 데이타(Alphanumeric)
- 최대 길이 : 2000 (반드시 길이 지정)
- 다른 타입에 비해 제한이 적다
- 일부만 입력시 뒷부분은 NULL
- 입력한 값의 뒷부분에 있는 BLANK도 같이 입력
- 전혀 값을 주지 않으면 NULL 상태 입력
- 지정된 길이보다 길면 입력시 에러 발생
나. 활용
- 데이터가 가변길이인 경우
- 적절한 PCTFREE 를 부여하지 않으면 체인발생 가능성이 높다
- 테이블의 통합했을 때 기본키 값에 따라 컬럼값이 존재하지 않을수 있는 컬럼은 반드시 VARCHAR2 타입을 사용해야한다.
- 컬럼 길이의 편차가 심한 경우
- NULL 로 입력되는 경우가 많은 경우
- 테이블 생성 SQL에 DEFAULT constraint 를 ' '(space) 로 지정하여 원하는 만큼의 길이를 확보하여 체인을 감소
- 가능한 CHAR 타입보다 VARCHAR2 사용
2.3 문자타입의 비교 법칙
가. 양쪽 모두 CHAR
- 길이가 서로 다르면 짧은 쪽에 SPACE를 추가하여 길이를 같게한 후 비교
- 값이 같다면 전체 전체문자를 모두 비교헤야만 한다.
나. 어느 한쪽이 VARCHAR2
- CHAR 타입이 아니므로 문자값 비교가 먼저수행
- 문자를 비교하여 서로다른 값이 나타나면 문자값이 큰컬럼이 크다고 판다하고 비교 종료
- 만약 값이 같다면 길이가 짧은 컬럼만큼 비교한후 각 컬럼의 길이를 비교하여 길이가 긴 컬럼이 크다고 판단
- VARCHAR2는 NOT NULL까지가 길이
- CHAR 타입이 아니므로 문자값 비교가 먼저수행
- 만약 값이 같다면 길이가 짧은 컬럼만큼 비교한후 각 컬럼의 길이를 비교하여 긴컬럼이 크다고 판단
- VARCHAR2타입으로 지정된 컬럼은 저장된 데이터값이 같다면 지정된 컬럼의 길이에 관계없이 동일한 길이를 가지므로 'V1=V2'라는 결과
다. 상수값과의 비교
상수쪽을 변수타입과 동일하게 바꾸어 비교
변수쪽이 CHAR 이면 (1)의 경우가 적용
변수쪽이 VARCHAR2면 (2)의 경우로 적용
2.4 NUMBER
가. 특성
- 음수, ZERO, 양수 저장
- 범위 : 1.0 x 10 ~ 9.9...9 x 10
- 전체 자리수는 38자리를 넘을 수 없다
- 소수점은 -84 ~ 127
- 소수점이 지정되지 않았을 때 소수점이 입력되거나, 지정된 소수점자리 이상 입력되면 반올림되어 저장
- 지정한 정수 자리수 이상 입력시 에러
나. 활용
- 연산이 필요한 컬럼은 NUMBER타입으로 지정한다.
- 문자값과 비교되면 상대타입을 숫자타입으로 바꾸어 비교하므로 인덱스를 생성할 컬럼은 가능한 문자타입으로 할 것
- NUMBER 로 지정된 컬럼을 LIKE 'char%' 로 비교하면 인덱스를 사용하지 않음
- 기본키에 포함되는 일련번호는 반드시 숫자타입으로 해야한다.
- '00001'와 같은 고정길이 방법으로 표현하는 것은 저장공간의 낭비뿐만 아니라 사용하기에도 불편하다.
- NUMBER : 길이를 제한하지 않을 정수입력 지정된 소수점이하의 값은 반올림되어 저장 되므로 감안하여 소수점 자리수 결정
- NUMBER(p,s) 로 지정시 p는 s의 자리수를 포함한 길이므로 감안하여 P의 자리수를 결정
- NUMBER 타입은 항상 가변길이므로 충분하게 지정할 것
2.5 DATE 타입
가. 특성
- 일자와 시간을 저장
- 포함정보 : 세기, 년도, 월, 일, 시간, 분, 초
- NLS_DATE_FORMAT을 이용하여 국가별 특수성을 해결
- 특별히 시간을 지정하지 않으면 00:00:00
- 특별히 일자를 지정하지 않았다면 현재월의 1일로 지정됨
- SYSDATE는 현재일과 시간을 제공
나. 활용
- 일자나 시간의 연산이 빈번한 경우 사용
- 시간이 정상적으로 입력된 경우 일자를 '='로 비교할 수 없음
- LIKE, SUBSTR 등 STRING 비교 불가능
- 자주 조건절에 사용되거나 EUC에 적용시 문자타입을 적용하는 것을 고려해 볼 것
- 주로 DATE 연산이나 기록(logging), TIMESTAMP로 사용되는 컬럼은 사용
- INDEX를 적용할 컬럼은 문자타입으로
- JOIN 되는 상대 컬럼과는 같은 타입으로
2.6 LONG 타입
특 성
- 2 GIGA 바이트(2 -1)의 가변길이 문자 저장
- VARCHAR2와 유사한 특징을 가진다
- 제한사항
- 하나의 테이블에 하나의 LONG 타입만
- (NOT) NULL을 제외한 다른 Constraint 지정할 수 없다
- 인덱스를 만들 수 없다
- PROCEDURE 나 Stored FUNCTION에서 LONG 타입의 변수를 받을 수 없다
- Stored FUNCTION은 LONG 타입 출력불가
- SELECT문 내에서 WHERE, GROUP BY, ORDER BY, CONNECT BY, DISTINCT불가
- SQL Function(substr,..) 사용 불가
- SUB-QUERY list로 사용 불가
- CREATE TABLE .. AS SELECT .. 사용불가
활 용
- 아주 긴 문자열 (편지, 처방전, 각종 서술문)
- Data Dictionary 내의 VIEW 정의 SQL
- SUBSTR을 사용할 수 없으므로 라인별로 출력이 곤란하므로 입력, 수정시 대책 수립
2.7 RAW, LONG RAW, ROWID 타입
특 성
- 그래픽 IMAGE 나 디지탈 SOUND를 저장
- HEXA-DECIMAL 형태로 RETURN
- RAW는 VARCHAR2와 유사
- LONG RAW는 LONG과 유사
- 제한사항
- 저장과 추출만 가능
- DATA를 가공할 수 없다
- LONG RAW는 LONG과 같은 제한
활 용
3. 데이터 길이의 결정
3.1 VARCHAR2 타입의 길이의 결정
- VARCHAR2 는 가능한 충분하게 최대치를 부여
- 생성시 부여한 컬럼의 길이는 단지 자료사전에 저장되어 체크(Check)기능을 한다.
3.1 CHAR 타입의 길이의 결정
- CHAR는 가능한 최소의 길이를 지정
- 컬럼의 길이가 단 한자리인 경우는 항상 CHAR타입을 사용하며 테이블 생성SQL에서는 데이터 타입만 지정하고 컬럼의 길이는 지정하지 않아도 무방하다.
3.3 NUMBER 타입의 길이의 결정
- NUMBER 타입의 길이를 제한하지 않을 때는 NUMBER로만 지정하고 가능한 충분하게 지정
- NUMBER 타입의 소수장점은 그 이하에서 반올림되어 저장되므로 감안해서 지정
- NUMBER 타입은 소수점을 지정하지 않으면 소수점 이하에서 반올림되어 정수로 저장되므로 소수점 저장을 원하면 반드시 소수점 지정
- NUMBER 타입의 길이는 소수점을 포함한 길이므로 필요한 정수부분을 확인
참고자료
문서에 대하여
- 최초작성일 : 2007년 10월 9일
- 이 문서는 오라클클럽 대용량 데이터베이스 스터디 모임에서 작성하였습니다.
- 이 문서의 내용은 이화식님의 대용량 데이터베이스 솔루션1 을 참고했습니다.