제3장 데이터 타입의 길이의 결정

  • 관계형 데이터베이스에서 제공하는 데이터 타입은 대개 CHAR, VARCAHR2, NUMBER, DATE, LONG, RAW, LONG RAW, ROWID 타입으로 분류한다.
  • 우리는 원하는 정보를 가장 효율적으로 처리하기 위해서 적절한 데이터 타입의 선정이 필요함
    1. 적절하지 못한 데이터 타입은의 선정은 수행속도를 나쁘게 하고 불필요한 자원을 낭비를 가져온다.
    2. 옵티마이져의 액세스 경로 선정에 나쁜 영향을 미치기도 한다.
    3. 서로관계를 가지는 컬럼들에 대해 '데이터 타입의 일관성' 을 지키지 않을 경우에는 고생을 하는 경우가 많이 발생한다.

1. 데이터 타입의 선정 절차

  • 데이터 모델링을 통해 작성된 ERD(Entity Realationship Diagram)를 이용하여 물리적 데이터베이스를 설계
    1. 테이블 결정 후 속성(Atrribute)을 컬럼(Column)으로, 관계(Relationship)을 외부키(Foreign Key)로 지정
    2. 각종 비지니스 룰(Business Rule)를 찾아 제약조건(Constraints)로 지정
    3. 컬럼의 데이터 타입과 길이를 결정
  • 컬럼의 데이터 타입과 길이를 결정하기 위해서 우리가 해야할 절차
    1. 먼저 데이터가 문자타입인지 숫자타입인지 확인하여 문자타입이 고정길이로 할것인지, 가변길이로 할것인지 결정
    2. 그밖에 음성이나 이미지 정보를 관리하거나 LONG타입의 사용여부를 결정한다.
    3. 날짜처리를 위해 DATE타입을 사용할것인지, 일반문자타입으로 할 것이니 결정
    4. 데이터 값이 숫자타입이라 할 지라도 문자타입으로 할 필요는 없는 검토
    5. 숫자타입의 경우 인덱스르 사용할수 없게 하므로 신중하게 판단해야하며 숫자타입으로 결정했다면 소수점 자리수를 확실히 결정
    6. 데이터 타입이 결정되었드며 선정된 타입의 특성에 따라 적적한 길이를 확정한다.

1.1 문자타입, 숫자타입의 결정

  • 우리가 결정하고자 하는 컬럼의 값이 문자형태인지 숫자 형태인지 조사한다.
  • 연산을 하게되는 컬럼의 값은 당연히 숫자타입이겠지만, 코드화시킨 컬럼이나 그밖의 각종 인조키(Artifical Key)들은 숫자타입으로 할수도 있고 문자로 할수도 있다.
    • 인조키란 임의 값에 의미를 부여하는 것이므로, 상황에 따라 어떠한 값을 부여할 수도 있다.
  • 가능한 문자와 숫자들 같이 결합하는것은 좋지 못하다.
    • 필요에 따라 변별력(Readability)을 향상시키고 사용상의 편의를 위해서 문자와 숫자의 조합도 좋은 방법이 될수 있다.
  • 데이터 값이 숫자이든 문자이든 간에 그 데이터 타입을 어떻게 하느냐는 아주 중요한 사항이다.
    • 만약 숫자를 가지는 한자리로 지정된 컬럼을 NUMBER타입으로 했다면 오히려 저장되는 길이가 늘어난다.
    • 다른컬럼과 비교될 때 내부적인 변형을 일으켜 인덱스를 사용할수 없게 만들지 모른다.

1.2 문자타입의 확정

문자타입의 확정을 위해서 우리가 해야할 절차

  1. 먼저 일반 문자타입(CHAR, VARCHAR2)로 할 것인지 특수형태(LONG, RAW, LONG RAW)로 할것인지를 결정한다
  2. 만약 일반 문자타입으로 결정했다면 고정길이(CHAR)로 할것인지 가변길이로(VARCHAR2)로 할것인지를 결정한다.
  3. 최대길이를 조사하여 컬럼의 길이를 결정한다.
  4. 최대길이가 2000바이트가 넘는다면 LONG타입의 사용여부를 결정한다.
    1. LONG타입은 약간의 제한이 있기 때문에 현재의 사용환경이 그 제한요소에 저촉되지 않는지 확인해야 한다.
    2. 가변길이(VARCHAR2)를 여러개 사용할 필요가 있는 검토하여 결정한다.
  5. 음성(Sound)나 영상(Image)처리를 해야하는 특수한 경우는 처리할 양이나 보유한 장비에 따라 테이블의 컬럼으로 지정할 것인지 다른 매체를 이용할 것인지 결정한다.

1.3 숫자타입의 확정

  • 컬럼값이 비록 숫자라 하더라도 반드시 숫자타입으로 해야 하는것은 아니다.
  • 연산을 하거나 일련번호 등이 아닌 경우 저장공간을 절약하기 위해 함부로 숫자타입으로 지정하면 예기치 못했던 문제들이 일어날수 있다.
    {tip:title=숫자타입의 확정을 위해서 우리가 해야할 절차 }
  1. 문자타입으로 해야 할 필요는 없는지 검토한다. 주로 향후에 인덱스로 구성될 인조키에 해당하는 컬럼이나 구분코드등이 여기에 해당된다.
  2. 숫자티입으로 결정했다면 최대 길이를 조사하여 결정한다.
    1. 숫자타입은 고정길이가 아니다.
    2. 숫자타입은 입력된 숫자의 길이를 2로 나눈 길이에 부호(Sign)관리를 위해 1바이트가 추가로 결합(Pack Decimal)된 가변길이로 저장된다.
  3. 소수점 몇자리까지 관리할 것인지 정확히 조사하여 결정한다.
  4. 만약 년월일(YYMMDD) 형태로 관리하고자 하는 숫자컬럼은 문자타입으로 하는것이 훨씬 유리하다.
    {tip}

1.4 날짜타입의 확정

  • 관계형 데이터베이스에는 날짜를 관리하기 위한 DATE타입이 있다.
  • 일반숫자와 같이 자유로운 연상이 가능하고 날짜와 관련된 많은 특별기능(Date Function)들이 있다.
  • 각 나라마다 사용되는 상이한 날짜유형도 DBMS의 특정기능을 이용해 원하는 유형으로 사용할 수도 있다.

2. 데이터 타입의 선정

  • 각 데이터 타입별 특성을 자세하게 파악해 보고 각 컬럼의 속성에 따라 어떤 데이터 타입을 결정해야 할 것인지를 알아보기로 한다.
  • 최적의 데이터 타입을 선정하기위해서 우리가 반드시 알아두어야 할 각 데이터 타입별 특성들이 무엇인지를 알아보고 그 활용에 대한 기준을 수립해 보고자 한다.
    1. 고정길이(Char) 데이터 타입 과 가변길이(Varchar2) 데이터 타입의 고유한 특성과 그 활용기준을 제시한다.
    2. 데이터 타입의 특성으로 인해 우리가 적절한 조치를 해야 할 사항들과 문자 타입의 비교법칙을 알아본다.
    3. NUMBER 타입의 효율적인 사용기준과 DATE타입의 선정기준을 제시한다.
      • 이 데이터 타입들은 인덱스 사용과 밀접한 관계를 가지고 있어 수행속도에 미치는 영향이 매우크다.
    4. 상황에 따른 최적의 선정방법을 알아보고 이미 적절하지 못한 데이터 타입을 선정하여 사용중이라면 발생하는 비효율적인 문제를 해결하는 방법을 제공한다.
    5. 기타 LONG, RAW, LONG RAW, ROWID 타입의 사용기준과 주의사항을 알아본다.

2.1 CHAR 타입

가. 특성

  • 고정길이 문자 데이타(Alphanumeric)
  • 최대 길이 : 255 byte (default = 1byte)
  • 다른 타입에 비해 제한이 적다
  • 일부 입력시 BLANK 가 자동으로 채워짐
  • 지정된 길이보다 길면 입력시 에러가 발생
  • 전혀 값을 주지 않으면 NULL 상태로 입력
    1. 연속된 여러개의 컬럼이 마지막 컬럼까지 NULL값을 가진다면 그 전체가 단 1 Byte를 가진다.
    2. NOT NULL 사이에 있다면 각각의 NULL 컬럼은 1 바이트를 가진다.
    3. NULL값이 예상되는 컬럼들은 가능한 연속된 순서로 지정하는것이 바람직하다.

나. 활용

  • 데이타가 고정길이인 경우
    1. 모든 데이터가 고정길이를 가진다고 하더라도 비교되는 다른 컬럼들과 서로 다른 데이터 타입을 가진다면 비교가 어려워 질수 있다.
  • 컬럼 길이가 짧고 거의 모든 데이타의 길이가 일정량을 넘는 경우 고려
  • 컬럼의 길이가 한자리 경우에 사용한다.
  • 가변길이로 지정할 경우 많은 체인(chain) 발생이 우려되는 경우
    1. 채워진공백은 다른 컬럼이나 로우가 사용할수 없는 불용성재고 인것이다.
    2. 데이터 액세스될때 불필요한 공백까지 네트워크를 타고 이동하게 되며 컬럼의 비교법칙에 의하면 비교시에도 훨씬 비효율적인 일이 발생함
  • 곧 이어 데이타가 입력되는 경우
  • 테이블 생성 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%' 로 비교하면 인덱스를 사용하지 않음
  • 기본키에 포함되는 일련번호는 반드시 숫자타입으로 해야한다.
    1. '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과 같은 제한

활 용

  • 사진등의 IMAGE 저장
  • SOUND 저장

3. 데이터 길이의 결정

3.1 VARCHAR2 타입의 길이의 결정

  • VARCHAR2 는 가능한 충분하게 최대치를 부여
  • 생성시 부여한 컬럼의 길이는 단지 자료사전에 저장되어 체크(Check)기능을 한다.

3.1 CHAR 타입의 길이의 결정

  • CHAR는 가능한 최소의 길이를 지정
  • 컬럼의 길이가 단 한자리인 경우는 항상 CHAR타입을 사용하며 테이블 생성SQL에서는 데이터 타입만 지정하고 컬럼의 길이는 지정하지 않아도 무방하다.

3.3 NUMBER 타입의 길이의 결정

  • NUMBER 타입의 길이를 제한하지 않을 때는 NUMBER로만 지정하고 가능한 충분하게 지정
  • NUMBER 타입의 소수장점은 그 이하에서 반올림되어 저장되므로 감안해서 지정
  • NUMBER 타입은 소수점을 지정하지 않으면 소수점 이하에서 반올림되어 정수로 저장되므로 소수점 저장을 원하면 반드시 소수점 지정
  • NUMBER 타입의 길이는 소수점을 포함한 길이므로 필요한 정수부분을 확인

참고자료

문서에 대하여