[ Oracle - Data_Type ]

 

                                [ DATA TYPE ]

☞ DATA TYPE 개요
 

1. 개요 : 데이터 타입은, 테이블 컬럼을 정의하거나, 프로시져 / 함수의 인자에 사용되는 값이
          저장되는 방식을 결정한다. 오라클에서는, 데이터 타입에 따라 의미상 동일한 값이
          다르게 처리 됩니다. 예를 들어, NUMBER데이터 타입에 저장된 숫자에는 다른 숫자를
          더하거나 뺄 수가 있지만, RAW 데이터 타입에 저장된 숫자 표현에 대해서는 더하거나 뺄
          수가 없다.

2. 이해
   - 성능측면 : 적절한 데이터 타입을 사용하여, 인덱스가 사용되지 못하는 일을 예방
                데이터 터압이 수행속도에 미치는 영향을 이해
   - 자원황용측면 : 적절한 데이터 타입을 사용하여 불필요한 자원낭비를 예방
   - 장애대응측면 : Corruption 등 장애 발생시, 블럭 구조 분석 능력 확보.
                    트랜잭션 처리 내부 구조를 이해하는데 필요한 선행 지식 확보.


☞ DATA TYPE 종류
 

1. 문자, 숫자, 날짜, 기간, 바이너리, ROWID, 사용자정의
2. 문자 TYPE : CHAR, NCHAR, VARCHAR2, NVARCHAR2, CLOB, NCLOB, LONG
3. 숫자 TYPE : Oracle9i기준으로 숫자는 NUMBER Data Type만 제공
4. 날짜 TYPE : DATEINTERVAL DAY TO SECOND, INTERVAL YEAR TO MONTH, TIMESTAMP
               TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONE
5. 바이너리  : BLOB, BFILE, RAW, LONG RAW
6. 특정ROW   : ROWID, UROWID
7. 사용자 정의 데이터 타입 : OBJECT type, COLLECTION Data Type, REFERENCE Data Type으로 구분.
      Object Type은 데이터 타입과 이 데이터들을 조작하기 위한 함수 혹은 프로시져를 묶어서
      사용자가 정의한 새로운 데이터 타입이다.
      Collection Data Type은 VARRAYNESTED TABLE이 해당하며, 다른 Object를 참조하는
      Reference Data Type도 사용자 정의 데이터 타입에 해당된다.

 

◎ 데이터 타입의 선정 지침
   문자열 관련 일반 지침, 숫자, 날짜 관련 일반 지침, LONG/LONG RAW 제약 사항,
   BLOB/CLOB 제약 사항

 

☞ CHAR TYPE

 

1. 정의
   CHAR 타입은, 데이터베이스의 character set 데이터를 고정 길이로 저장하고, NCHAR 타입은
   데이터베이스의 national character set 데이터를 고정길이로 저장하는데 사용되는 데이터
   타입이며, 9i 이상 버전에서는 UNICODE를 사용하여야만 한다.

2. 유형
   내장 데이터 타입 ▶ 스칼라 타입 ▶ 고정 길이 문자 데이터 타입

3. 설명
   고정 길이 문자 데이터로, 정의할 때 지정된 길이 만큼의 바이트 또는 글자 개수 만큼을 저장.
   CHAR의 경우 데이터베이스 character set이 KO16KSC5601로 지정되어 있을 경우, CHAR(4)는 한글
   2자리 또는 영문 4글자를 저장할 수 있음.
   한편 NCHAR의 경우, NCHAR(4)는 한글 4자리를 모두 저장할 수 있음. (바이트가 아니라 지정된
   글자 만큼)

4. 특징
   지정된 길이보다 적은 길이의 문자열을 저장할 경우, empty byte가 space로 padding 됨.
   CHAR / NCHAR의 데이터 타입 코드는 96번임 (아래 그림 참조)

5. Column Length/Default
   최대 2000바이트까지 저장 가능함.
   CHAR기본 길이는 1바이트. 예를 들어 테이블 생성시 CHAR 만 지정하고 자릿수 지정을 하지 않을
   경우, CHAR(1)로 처리됨. 한편 NCHAR의 경우 기본 길이는 1글자임.

   NCHAR의 경우, national character set이 AL16UTF16일 경우, 2배 만큼의 바이트를 사용하며,
   UTF8의 경우, 3배 만큼의 바이트를 사용한다.

6. 내부저장방식
    

 

 

☞ VARCHAR2 / NVARCHAR2

 

1. 정의
   VARCHAR2 타입은, 데이터베이스의 character set 데이터를 가변 길이로 저장하고,
   NVARCHAR2 타입은 데이터베이스의 national character set 데이터를 가변길이로 저장하는데
   사용되는 데이터 타입이며, 9i 이상 버전에서는 UNICODE를 사용하여야만 한다.

2. 유형
   내장 데이터 타입 ▶ 스칼라 타입 ▶ 가변 길이 문자 데이터 타입

3. 설명
   - 가변 길이 문자 데이터로, 정의할 때 지정된 길이 만큼의 바이트 또는 글자 개수 까지 저장가능.
   - VARCHAR2의 경우 데이터베이스 character set이 KO16KSC5601로 지정되어 있을 경우,
     VARCHAR2(4)는 한글 2자리 또는 영문 4글자를 저장할 수 있음.
   - 한편 NVARCHAR2의 경우, NVARCHAR2(4)는 한글 4자리를 모두 저장할 수 있음.
     (바이트가 아니라 지정된 글자 만큼)

4. 특징
  - 저장되는 값은, 가변 길이로, empty space가 padding 되지 않음.
  - 테이블에 대한 Full Scan시에도 작은블록을 읽어 성능상 장점이 있으며, Empty Block이
    PADDING되지 않아 정확한 비교를 하는데 유의해야 할 사항이 적다
  - 실제로 저장된 문자data는 각 문자의 ASCII CODE값만 저장되었음을 확인이 하실 수 있다.
  - VARCHAR2 / NVARCHAR2의 데이터 타입 코드는 1번임. (아래 그림 참조)

5. Column Length/Default
  - 최대 4000바이트까지 저장 가능함.
  - VARCHAR2의 경우, 최대 길이는 반드시 지정되어야 함.
  - NVARCHAR2의 경우, 기본 값은 1 글자임.
  - NCHAR의 경우, national character set이 AL16UTF16일경우, 2배 만큼의 바이트를 사용하며,
    UTF8의 경우, 3배 만큼의 바이트를 사용함.

6. 내부저장방식
    

 

7. 참고
   VARCHAR2와 NVARCHAR2의 dump결과 내부코드가 같으나, 구별은 table description으로
   column에 정의된 Data Type에 대한 확인이 가능하며, 또한 한글의 경우 저장된 byte로도 확인이
   가능하다.
   예를 들어 DB characterset이 KO16KSC5601이고 national characterset이 UTF8인 경우,
  “가”를 저장한다고 보면, varchar2 Data Type의 length는 2byte이나 nvarchar2 Data Type은
   3byte로 보인다.
   물론 DB characterset과 national characterset이 같은 UTF8인 경우엔 column에 정의된
   DataType으로만 확인이 가능합니다.

 

☞ CLOB / NCLOB

 

1. 정의
   CLOB/NCLOB은 LOB (Large Object) 데이터 타입의 일부로, 최대 4GB까지의 문자 데이터를
   저장하는데 사용된다. CLOB은 데이터베이스의 character set으로 데이터를 저장하며,
   NCLOB은 national character set으로 데이터를 저장하는데, 9i 이상 버전에서는 UNICODE를
   사용하여야만 한다.

2. 유형
   내장 데이터 타입 ▶ 스칼라 타입 ▶ LOB 문자 데이터 타입

3. 설명
   - 변동 길이 문자 데이터로 최대 길이를 지정하지 않음.
   - 다른 문자 데이터 타입과는 달리 SELECT, UPDATE등를 수행하기 위해서는 별도의 PL/SQL 패키지
     또는 API를 사용하여야 함. (DBMS_LOB 등)
   - CLOB / NCLOB의 경우는 INSERT는 다른 데이터타입과 같이 수행 가능.
   - 한 ROW에 여러 LOB 타입 데이터 사용 가능.

4. 특징
   - 8 까지는 테이블 내부 또는 외부에 선택적으로 저장되도록 지정할 수 있었으나,
     8i 이상 버전에서는, 테이블 외부의 별도 LOB 세그먼트에 저장됨.
   - 테이블에는, LOB Locator (20 byte)만 저장되며, 데이터가 저장된 LOB세그먼트와의 중간에
     LOB Inode(최대 16byte) 세그먼트가 존재함. (아래 그림 참조)
   - CLOB/NCLOB의 데이터 타입 코드는 112번임.

5. Column Length/Default
   최대 4 기가 바이트까지 저장 가능함.

6. 내부저장방식
    

 

7. 참고
  - SQLPLUS에서는 4000 BYTE이하인 경우 SELECT, INSERT, UPDATE, DELETE작업이 가능하며,
    PL/SQL에서는 32k까지 가능합니다. 그래서 일반적으로는 Pro*C 또는 JAVA 언어를 사용하여
    Oracle에서 제공하는 API를 이용한 프로그램을 작성한다.

  - 다른 문자 데이터 타입과는 달리 DBMS_LOB과 같은 전용 PL/SQL 패키지 및 API를 제공한다.
    한 ROW에 여러 CLOB/NCLOB Data Type을 사용할 수 있다.

  - Oracle8까지는 LOB INDEX가 TABLE 이 저장되는 곳과 동일한 내부 저장영역 (세그먼트)에 또는
    외부에 선택적으로 저장 되도록 지정할 수 있었으나, Oracle8i이상 부터는 DML보다는
    SELECT 위주로 인접한 블럭으로부터 데이터를 읽어올 수 있도록, LOB INDEX는 LOB 세그먼트가
    같이 저장된다.

  - Internal LOB은 LOB locator, LOB Inode 즉 LOB index와 data인 lob segment로 구성된다.
    CLOB/NCLOB의 내부 저장 코드는 112번 이다.

 

☞ LONG

 

1. 정의
   LONG 데이터 타입은, 하위 버전에 대한 호환성을 위해 존재하며, 역할은 CLOB/NCLOB과 유사하다.
   차이점은, 별도의 세그먼트에 데이터가 존재하는 것이 아니라 동일한 row의 다른 데이터와 함께
   저장된다는 점이다.

2. 유형
   내장 데이터 타입 ▶ 스칼라 타입 ▶ LONG 문자 데이터 타입

3. 설명
   - 변동 길이 문자 데이터로 최대 길이를 지정하지 않음.
   - 한 ROW에는 최대 하나의 LONG 데이터 타입만 사용가능.
   - CLOB/NCBLOC 대비 많은 제약 사항을 가짐 (순차적액세스만 허용, 사용자 정의 데이터 타입에
     사용 불가, REPLICATION 사용 불가 등)

4. 특징
   - 테이블 정의할 때 LONG 컬럼은 어느 위치에나 지정 가능하나, 오라클 데이터베이스에서는
     내부적으로 LONG 컬럼의 위치를 맨 뒤에서 저장하는 형태로 물리적으로 처리함
     (사용자에게는 직접 보이지 않음)
   - LONG 데이터 타입 코드는 8번임.

5. Column Length/Default
   최대 2 기가 바이트까지 저장 가능함.

6. 내부저장방식
    

 

7. 참고
   Block dump 결과를 보면 각 문자에 대한 ascii code값으로 저장된 값에 대한 확인이 가능하다.
   내부 저장 코드는 8번이다.
   참고로 화면에 보여지는 결과는 dump() function을 사용한 것이 아니라 , alter system command로
   block dump를 뜬 결과이다

☞ NUMBER

 

1. 정의
   NUMBER 데이터 타입은 가변 길이의 숫자 데이터를 저장하는데 사용된다. 오라클에서는 INTEGER,
   FLOAT, DOUBLE, REAL과 같은 ANSI 데이터 타입도 내부적으로는 NUMBER로 처리되나,
   10g에서 BINARY_FLOAT, BINARY_DOUBLE 데이터 타입이 추가되어, 보다 적은 공간으로
   숫자 데이터를 처리 할 수 있게 향상되었다.

2. 유형
   내장 데이터 타입 ▶ 스칼라 타입 ▶ 숫자 데이터 타입

3. 설명
  - PRECISION과 SCALE에 의해 표현 가능한 숫자를 저장함.
  - 내부적으로는 변동 길이로 저장됨.

4. 특징
  - NUMBER 데이터 타입은 내부적으로 exponent 부분과, digit부분으로 나누어 저장함.
  - Exponent 부분은, 1 바이트로 저장되며, sign bit / offset / exponent부분으로 구성됨
  - Digit 부분은, 내부적으로는 100진수 방식으로 (base 100 digits)저장되며,
    1 바이트에 2자리까지 저장됨.
  - NUMBER의 데이터 타입 코드는 2번임.

5. Column Length/Default
  - 최대 21바이트까지 사용 가능함.
  - 표현 가능한 범위는 1.0 X 10^-130 부터 1.0 X 10^126 까지이며, precision은 최대 38자리,
    scale은 –84~127까지 지정할 수 있음.

6. 내부저장방식
   

7. 참고
   - Dump결과를 보면 NUMBER의 데이터 타입 코드는 2번이고 , length와 숫자 data가 저장된 형태를
     보여준다.
   - Number Data Type은 단순히 ASCII 또는 UNICODE로 저장하는 문자열 데이터 타입과는 달리
     Oracle의 내부알고리즘에 따라 계산하여 저장되며, 상세한 내용은 오라클 교육 센타의 별도의
     DSI강의를 통해서 접하실 수 있다.


 

☞ DATE

 

1. 정의
   DATE 데이터 타입은 날짜와 시간을 고정 길이로 표현하는데 사용된다.

2. 유형
   내장 데이터 타입 ▶ 스칼라 타입 ▶ 날짜 데이터 타입

3. 설명
   - 세기 / 년 / 월 / 일 / 시 / 분 / 초 데이터를 저장할 수 있음.
   - 초 이하 단위 (밀리초 등)과, Timezone과 관련된 정보를 저장하지 않음.

4. 특징
   - 전체 7바이트 가운데, 첫 두 바이트는 세기와 연도를 나타내고, 다음 두 바이트는 월,
     일을 나타내며, 나머지 세 바이트는 시, 분, 초를 나타냄.
   - DATE의 데이터 타입 코드는 12번임.

5. Column Length/Default
    - 기원전 4712년 1월 1일부터, 기원후 9999년 12월31일까지 표현 가능.
    - 항상 7바이트의 고정 길이를 사용함.

6. 내부저장방식
   

 

 

7. 참고
   - 내부 저장방식을 보면 화면과 같습니다. 내부 type code는 12번이며, length는 언제나
     7 byte이다. 데이터는 표현하고자 하는 세기, 연도, 월,일,시,분,초로 구성되어 있다.
   - 각각의 BYTE의 내용은 마찬가지로 Oracle의 내부 알고리즘에 의해 계산되어 저장된다.

 

☞ TIMESTAMP

 

1. 정의
   TIMESTAMP 데이터 타입은, 특정 시점을 나타내는데 사용되며, TIMEZONE과 관련된 정보를 어떤
   방식으로 저장하는지에 따라 3가지 세부 유형으로 구분된다.

2. 유형
   내장 데이터 타입 ▶ 스칼라 타입 ▶ 타임스탬프 데이터 타입

3. 설명
   - 세기 / 년 / 월 / 일 / 시 / 분 / 초 데이터를 저장할 수 있음.
   - 초 이하 단위를 9자리까지 저장할 수 있으며, Timezone과 관련된 정보를 선택적으로 저장할 수
     있음.
   - TIMESTAMP (TIMEZONE과 관련된 정보를 저장하지 않음)
   - TIMESTAMP WITH TIMEZONE (TIMEZONE과 관련된 정보를 저장)
   - TIMESTAMP WITH LOCAL TIMEZONE (세션의 기본 TIMEZONE값을 사용)

4. 특징
   - TIMEZONE에서 첫 7바이트는 DATETIME과 동일하며, 마지막 4바이트는 초 이하 단위 (9자리)를
     저장하는데 사용됨.
   - TIMEZONE을 명시적으로 저장하는 경우 (TIMESTAMP WITH TIMEZONE) 추가적으로 2바이트를 더
     사용하는데, 각 바이트는 TIMEZONE HOUR와 TIMEZONE MINUTE를 저장하는데 사용됨.
   - TIMESTAMP의 데이터 타입 코드는 180번임.
   - TIMESTAMP WITH TIMEZONE의 데이터 타입 코드는 181번임.
   - TIMESTAMP WITH LOCAL TIMESZONE의 데이터 타입 코드는 231번임.

5. Column Length/Default
   - 기원전 4712년 1월 1일부터, 기원후 9999년 12월 31일까지 표현 가능.
   - TIMEZONE 정보를 저장하는지 여부에 따라 필요로 하는 저장 공간이 달라짐.

6. 내부저장방식
   

 

 

7. 참고
   - TIMESTAMP의 데이터 타입 코드는 180번, TIMESTAMP WITH TIMEZONE의 데이터 타입 코드는 181번,
     TIMESTAMP WITH LOCAL TIMESZONE의 데이터 타입 코드는 231번이며, Oracle에서 내부적으로
     사용하는 알고리즘에 의해 계산되어 값이 저장된다.
8. Create 예문)
   - col_name1  TIMESTAMP(7)   --저장된 값형태 : [02/11/25 15:16:57.0000000]

                               --7자리 이므로 Fractional Second가 7자리로 표현

 

☞ INTERVAL

 

1. 정의
   INTERVAL은 TIMESTAMP간의 차이를 나타내는데 사용되는 데이터 타입으로, YEAR-MONTH INTERVAL과
   DAY-SECOND INTERVAL로 나뉘어 진다. YEAR-MONTH는 YEAR와 MONTH 필드의 차이를 나타내는 반면,
   DAY-SECOND는 DAY, HOUR, MINUTE, SECOND 필드의 차이를 나타낸다.

2. 유형
   내장 데이터 타입 ▶ 스칼라 타입 ▶ 기간 데이터 타입

3. 설명
   - INTERVAL YEAR TO MONTH는 두 TIMESTAMP간의 차이(기간)를 ‘몇 년 몇 개월’로 나타냄.
   - INTERVAL DAY TO SECOND는 두 TIMESTAMP간의 차이(기간)를 ‘몇 일, 몇 시간 몇 분 몇 초’로
     나타냄.

4. 특징
   - INTERVAL YEAR TO MONTH는 년도의 차이를 4바이트로 저장하고, 1바이트를 월을 차이로 나타내며,
     저장되는 값이 항상 양수 형태로 저장될 수 있도록 일정 오프셋으로 더해 저장함.
   - INTERVAL DAY TO SECOND는 날짜 차이로 4바이트, 시분초의 차이로 1바이트 4바이트를 초 이하
     단위의 차이를 저장하는데 사용함.
   - INTERVAL YEAR TO MONTH의 데이터 타입 코드는 182번임.
   - INTERVAL DAY TO SECOND의 데이터 타입 코드는 183번임.

5. Column Length/Default
   - INTERVAL YEAR TO MONTH는 5바이트 고정 길이 사용
   - INTERVAL DAY TO SECOND는 11바이트 고정 길이 사용.

6. 내부저장방식
   

 

 

7. 참고
   Dump를 떠 보면 INTERVAL YEAR TO MONTH의 데이터 타입 코드는 182번이며,
   INTERVAL DAY TO SECOND는 183번이다.
8. Create 예문)
 - col_name1  INTERVAL YEAR(3) TO MONTH  --저장된 값형태 : [+010-03]

                                         --월 3자리 123개월을 YEAR와 MONTH로 환산하면 10년3개월
 - col_name2  INTERVAL DAY TO SECOND(3)  --저장된 값형태 : [+00 00:03:06.000000]

                                         --초 3자리 186초를 DAY, HOUR, MINUTE, SECOND로
                                           환산하면 3분 6초

 

☞ BLOB / BFILE

 

1. 정의
   BLOB/BFILE은 LOB (Large Object) 데이터 타입의 일부로, 최대 4GB까지의 바이너리 데이터를
   저장하는데 사용된다.
   BLOB은 바이너리 데이터를 데이터베이스 내부에 저장하며, BFILE은 바이너리 데이터를
   데이터베이스 외부인 OS 에 저장 한다.

2. 유형
   내장 데이터 타입 ▶ 스칼라 타입 ▶ 바이너리 데이터 타입

3. 설명
   - 변동 길이 바이너리 데이터로 최대 길이를 지정하지 않음.
   - 다른 LOB 데이터 타입과 같이 INSERT, SELECT, UPDATE 등을 수행하기 위해서는 별도의
     PL/SQL 패키지 또는 API를 사용하여야 함. (DBMS_LOB 등)
   - 한 ROW에 여러 LOB 타입 데이터 사용 가능.

4. 특징
   - BLOB에 저장된 데이터는 다른 데이터 타입과 마찬가지로 트랜잭션에 참여함.
   - BFILE에 저장된 데이터는 READ-ONLY이며 DURABILITY 역시 OS에서 보장되어야 함.
   - BLOB과 BFILE의 내부 처리 구조는 완전히 다름.
   - BFILE은 최대 30바이트의 디렉토리 알리아스와, 최대 256바이트의 파일 이름 표현 가능.
   - BLOB의 데이터 타입 코드는 113번임.
   - BFILE의 데이터 타입 코드는 114번임.

5. Column Length/Default
   - BLOB 데이터는 최대 4기가 바이트까지 저장 가능함.
   - BFILE은 OS의 제약이 없다면 최대 4 기가바이트까지 저장 가능함.

6. 내부저장방식
   - BFILE 구조 예시, BLOB의 구조는 CLOB 구조와 개념적으로는 동일함.
   

 

 

7. 참고
   - BLOB Data Type의 내부 저장 방식은 CLOB Data Type과 유사하며, 저장되는 data성격만
     바이너리 데이터를 저장한다. BFILE은 최대 30바이트의 디렉토리 알리아스와,
     최대 256바이트의 파일 이름 표현이 가능하다. Dump를 떠 보면 BLOB의 데이터 타입 코드는
     113번이며, BFILE의 데이터 타입 코드는 114번이다.

 

☞ RAW / LONG RAW

 

1. 정의
   RAW 및 LONG RAW는 바이너리 이미지, 데이터를 저장하는데 사용되는 데이터 타입으로, 역 호환성을
   위해 사용된다. 현재 는 BLOB 및 BFILE 데이터타입을 사용하는 것이 권고된다.

2. 유형
   내장 데이터 타입 ▶ 스칼라 타입 ▶ 바이너리 데이터 타입

3. 설명
   RAW와 LONG RAW는 바이너리 데이터를 저장하는데 사용됨.

4. 특징
   - 데이터베이스에서는, 내용에 대한 해석이나, 변환을 하지않음. 예를 들어, 내용으로 문자를
     입력 하였다고 하더라도 자동적인 character set conversion등은 수행하지 않음.
   - LOB과는 달리, ROW내 다른 데이터와 함께 저장 되므로 (in-line) row chaining이 많이 발생함.
   - RAW의 데이터 타입 코드는 23번임.
   - LONG RAW의 데이터 타입 코드는 24번임.

5. Column Length/Default
   - RAW는 최대 2000바이트까지 저장 가능.
   - LONG RAW는 최대 2기가바이트까지 저장 가능.

6. 내부저장방식
   

 

 

7. 참고
   - LOB과는 달리, ROW내 다른 데이터와 함께 저장 되므로(in-line) row chaining이 많이 발생한다.
   - Dump 결과 RAW의 데이터 타입 코드는 23번임을 알 수 있으며, LONG RAW의 데이터 타입 코드는
     24번이다.


 

☞ ROWID, UROWID

 

1. 정의
   - ROWID 및 UROWID는 테이블의 ROW에 대한 고유 식별자로, 특정 ROW의 물리적 위치를 직접
     저장하지는 않지만, 특정 행을 찾는 가장 빠른 메커니즘을 제공한다.
   -
Pseudo 칼럼으로 ROWID는 테이블 내의 한 행에 대한 논리적인 주소값을 가지는 데이터 유형으로
       오라클에서 자동으로 할당하여 생기는 Pseudo 칼럼

2. 유형
   내장 데이터 타입 ▶ 스칼라 타입 ▶ 데이터베이스 내부 처리용 데이터 타입

3. 설명
   - ROWID는 Database에 있는 각 행에 대한 고유 식별자임.
   - ROWID는 명시적으로 컬럼 값으로서 저장되지 않음.
   - ROWID는 행의 물리적 주소를 직접 부여하지는 않지만 행 위치를 지정하는 데 사용될 수 있음.
   - ROWID를 사용하면 가장 빠르게 테이블의 행을 액세스할 수 있음.
   - ROWID는 주어진 키 값의 집합을 가진 행을 지정하기 위해 인덱스에 저장됨.
   - UROWID는 오라클 데이터베이스 이외 DB 테이블의 ROWID 및 IOT (Index Organized Table)의
     ROWID를 처리할 수 있음.

4. 특징
   - ROWID는 3가지 타입이 존재함.
     o SHORT : RDBA와 ROW 정보로 구성
     o LONG : OBJECT ID와 RDBA, ROW 정보로 구성
     o UNIVERSAL
   - UNIVERSAL ROWID (UROWID)에는 다시 3가지 타입이 존재함
     o PHYSICAL : 일반 테이블 및 클러스터, 파티션, 인덱스, 인덱스 파티션 및 서브파티션에
                  대한 주소
     o LOGICAL: Index Organized Table의 주소
     o REMOTE: 오라클 이외 데이터베이스에 대한 ROWID
   - ROWID의 데이터 타입 코드는 69번이며 UROWID는 208번임.

5. Column Length/Default
   - SHORT ROWID는 6바이트 16진수 문자열로 나타내짐.
   - LONG ROWID는 10바이트 16진수 문자열로 나타내짐.
   - UNIVERSAL ROWID는 최대 3950바이트까지를 차지할 수 있음.

6. 내부저장방식
   

 

 

7. 참고
   - SHORT ROWID는 Restricted Rowid라고도 하며, Oracle7 이하와의 역 호환성을 위해 존재한다.
     4 byte의 RDBA와 2byte의 ROW 정보로 구성된다.
   - LONG rowid는 extended rowid라고도 불리며,4byte의 OBJECT ID와 4byte의 RDBA와 2byte의
     ROW 정보로 구성된다.
   - CharToRowId() , RowIdToChar()

 

◎ User Defined Data Type

☞ OBJECT TYPE

 

1. 정의
   OBJECT TYPE은 사용자가 정의한 복합 데이터 타입으로 (composite data type), 데이터 타입과
   이 데이터들을 조작하기 위한 함수 혹은 프로시져를 묶어서 사용자가 정의한 새로운 데이터
   타입이다. VARRAY, NESTED TABLE 및 REF는 OBJECT TYPE과 밀접한 관계를 가지며, OBJECT TYPE
   자체를 테이블이나 컬럼으로 사용할 수 있다.

2. 유형
   사용자 정의 데이터 타입

3. 설명
   - OBJEC TYPE은 자동차의 경우, 차종, 년식, 배기량과 같은 속성과, 전진, 후진, 정지와 같은
     행동을 지원하는데, 이러한 일반적인 객체지향 관점을 OBJECT TYPE에서 지원함.
   - OBJECT TYPE은, OBJECT TABLE 또는 특정 컬럼의 타입으로 활용할 수 있으며, VARRAY 또는
     NESTED TABLE의 구성 요소로 사용할 수 있음. ( VARRARY나 NESTED TABLE은, OBJECT TYPE
     이외에도 BUILT-IN TYPE 및, PL/SQL 변수나, 파라미터, 결과값 등으로 구성 가능함)

4. 특징
   - OBJECT TYPE은, 3가지 구성 요소로 이루어짐.
     o NAME : OBJECT TYPE에 대한 고유 식별자
     o ATTRIBUTE : BUILT-IN TYPE 또는 다른 OBJECT TYPE
     o METHOD : PL/SQL, C, JAVA와 같은 언어로 작성된 모듈
   - 사용자가 정의할 때 마다 생성되므로, 정해진 데이터 타입 코드는 없음.
   - 내부적으로는 일반 테이블 형태로 변환되어 저장되며, 최 하단 (leaf) 데이터 타입이
     BUILT-IN 데이터 타입이 될 때 까지 확장 (explode) 됨.
   - 실제 데이터는 최 하단 (leaf)의 BUILT-IN 데이터 타입으로 저장됨.

5. 적용형태1 - OBJECT TABLE
    

 

 

6. 작용형태2 - COLUMN OBJECT
    

 

 

7. 참고>
Object table을 예로 보면, 맨 끝 가지 레벨의 scalar는 (leaf-level scalar) 테이블의 컬럼에
대응합니다. 그리고 시스템에서 자동으로 생성한 2개 컬럼이 테이블에 추가된다.
SYS_NC_OID$ : 테이블의 row와 연관된 object ID
SYS_NC_OWINFO$ : 각 row의 constructor를 보여 주기 위한 pseudo column
이 pseudo column이 테이블의 저장에 공간을 차지 하지는 않으나 (아래 블럭 덤프 참조) object에
대한 상세한 정보를 얻기 위해 이 컬럼을 쿼리에 사용할 수 있다.

SQL> select sys_nc_oid$ from employees1;
SYS_NC_OID$
--------------------------------------
5DCC862136C2484CE0340800207ECAE5
SQL> select sys_nc_rowinfo$ from employees1;
SYS_NC_ROWINFO$ (EMPNO, ENAME)
--------------------------------------
EMP_TYP(1, ‘peter’)
덤프 결과
--------
col 0 : [16] 5d cc 86 21 36 c2 48 4c e0 34 08 00 20 7e ca e5 <- OID
col 1 : [ 2] c1 02 <- Empno
col 2 : [ 5] 70 65 74 65 72 <- Ename


☞ VARRAY

 

1. 정의
   VARRAY 타입은, 순서를 갖는 엘리먼트들의 배열을 저장하는데 사용된다.

2. 유형
   내장 데이터 타입 ▶ 컬랙션 타입 ▶ 순서를 갖는 배열

3. 설명
 - VARRAY 컬럼 자체는 스칼라 타입의 컬럼처럼, 단일 값처럼 간주 되며, DML에 의해 조작할 수 있음.
 - 각 엘리먼트에는 인덱스가 있으며 배열상의 순서를 나타냄.
 - UPPER BOUND는 정의할 때 지정되며 한번 정의된 후에는 변경할 수 없음.
 - 엘리먼트들은 배열의 맨 끝부터 삭제할 수 있음.

4. 특징
   - 4000바이트 미만일 경우, IN-LINE 형태로 저장되며, 내부적인 구현은 RAW 타입에 저장하는
     방식을 사용함.
   - 4000바이트 이상일 경우, OUT-OF-LINE 형태로 저장되며 내부적으로는 BLOB 형태로 저장하는
     방식을 사용함.

5. Column Length/Default
   스칼라 타입과 같이 정해진 크기나, 기본 값은 없음.

6. 내부저장방식
   

 

7. 참고>

Create or replace type person_typ as object
(a number, b varchar2(10));
Create or replace type v_person_typ as varray(5);
Create table person
(col1 number,
col2 varchar2(10).
col3 v_person_typ)
varry col3 store as lob person_tab;
Oracle Data Types
이 덤프는, person_typ에 대한 VARRAY(5)에 대한 내용으로, person_typ은 두개 attribute로 정의
되어 있다: a NUMBER, b VARCHAR2(10)
col 3 : [32] 88 01 20 01 01 00 02
0b 84 01 0b 02 c1 02 04 70 61 75 6c
0c 84 01 0c 02 c1 03 05 70 65 74 65 72

Byte 1 – 6 VARRAY overhead (byte 3(20) -> 전체 VARRAY column(32 bytes))
Byte 7 (02) VARRAY의 element의 갯수(2 person_typ elements)
Byte 8 (0b) 첫번째 array element의 길이 (11 bytes)
Byte 9 – 11 Object overhead(84 01 0b)
Byte 12 – 14 Length (02) + data (c1,02) -> 1
Byte 15 – 19 Length (04) + data (70,61,75,6c) -> paul
Byte 20 (0c) 두번째 element의 길이 (12 bytes)
Byte 21 – 23 Object overhead(84 01 0c)
Byte 24 – 26 Length (02) + data (c1,03) -> 2
Byte 27 – 32 Length (05) + data (70,65,74,65,72) -> peter


☞ NESTED TABLE

 

1. 정의
   NESTED TABLE 데이터 타입은, 테이블을 하나의 컬럼에 저장할 때 사용된다.

2. 유형
   내장 데이터 타입 ▶ 컬랙션 타입 ▶ 중첩 테이블

3. 설명
   - NESTED TABLE순서를 지정하지 않은 레코드나 행의 집합임.
   - NESTED TABLE의 행은 동일한 구조를 가짐.
   - NESTED TABLE 의 행은 상위 테이블에 있는 해당 행의 포인터와 함께 상위 테이블과는 별도로
     저장됨.
   - NESTED TABLE 의 저장 영역 특성은 Database 관리자가 정의할 수 있음.
   - NESTED TABLE 에 대해 미리 정의된 최대 크기는 없음.

4. 특징
   - NESTED TABLE 을 STORE TABLE이라고 하며, 원래 테이블과는 별도 영역에 저장됨.
   - STORE TABLE 생성시 STORAGE 절을 지정할 수 있음.
   - STORE TABLE의 특정 ROW는 직접 액세스 할 수없으며,PARENT TABLE을 활용해 액세스 하여야만 함.

5. Column Length/Default
   - 스칼라 타입과 같이 정해진 크기나, 기본 값은 없음.
   - STORE TABLE에는, 시스템에서 자동적으로 생성하는 컬럼이 추가됨.(SYS_NC_ROWINFO$, OBJECT_ID)
   - PARENT TABLE 입장에서는, RAW(16) 형태로 저장함.

6. 내부저장방식
   

 

7. 참고 >

store table 내의 row는 직접 엑세스 불가능합니다. 다음은 그 예입니다.
SQL> create table storage (
2 salesman number (4),
3 elem_id number (6),
4 ordered date,
5 items elements_tab)
6 nested table items store as items_tab;
Table created

SQL> insert into storage
2 values(100,123456,SYSDATE,
3 ELEMENTS_TAB (ELEMENTS(175692,120.12),
4 ELEMENTS(167295,130.45),
5 ELEMENTS(127569,99.99)));
1 row created
SQL> select * from items_tab;
select * from items_tab
*
ERROR at line 1 :
ORA-22812: cannot reference nested table column’s storage table


☞ REF

 

1. 정의
   REF (“reference”의 줄임)은, 데이터베이스 테이블에 저장된 object에 대한 참조이며 object
   그 자체는 아니다. REF 타입은, relational column으로 사용될 수 있으며, object type을
   구성하는 데이터 타입으로도 사용될 수 있다.

2. 유형
   내장 데이터 타입 ▶참조 타입 ▶ 참조 타입

3. 설명
   - OBJECT TABLE에 저장된 각각의 객체는 OID (Object ID)를 갖고 있음.
   - OID는 마치 관계형 데이터베이스에서 처럼 다른 객체에서 참조할 수 있으며, 참조할 때
   - 사용하는 데이터 타입이 REF임.

4. 특징
   - 참조 대상 객체가 삭제되었을 경우, REF는 dangling 상태가 되었다고 하며, OBJECT TABLE에
     대해 ANALYZE를 시켜 해결 할 수 있음.
   - REF는 OID 뿐만 아니라, 메타 정보와 참조되는 ROW의 ROWID 정보를 포함함.
   - REF 데이터 타입의 코드는 111번임.

5. Column Length/Default
   - 표준 REF 타입의 크기는, 42바이트임. (참조되는 객체의 OID 16 바이트, 객체를 포함하는
     테이블의 OID 16바이트, ROWID 힌트 10 바이트로 구성됨)
   - 그러나, PRIMARY KEY에 기반을 둔 OID에 대한 REF 컬럼은, 42 바이트가 아닐 수 있음.

6. 내부저장방식
   

 

7. 참고>
 예를 들어 department table이 두개 컬럼으로 구성되어 있을 경우 : dname(VARCHAR2),
 mgr(REF EMP_TYP) 테이블에 한 개 row를 추가한 후에는 다음과 같은 저장 특성을 볼 수 있다.

Oracle Data Types
SQL> select dump (mgr, 16) from department;
DUMP(MGR,16)
--------------------------------------
Typ=111 Len=36: 0,22,2,8,5d,cc,86,21,36,c2,48,4c,e0,34,8
0,20,7e,ca,e5,5d,cc,86,21,36,c1,48,4c,e0,34,8,0,20,7e,ca,e5
SQL> select mgr from department;
MGR
------------------------------------00002202085DCC862136C2484CE0340800207
ECAE55DCC862136C1484CE0340800207ECAE5
SQL> selec deref(mgr) from department;
DEREF(MGR) (EMPNO,ENAME)
------------------------------------
EMP_TYP(1,’peter’)
REF 데이터 타입의 코드는 111번으로 확인이 가능합니다.

 

◎ 데이터 타입의 선정 지침

문자열 관련 일반 지침

 

1. 정의
   
문자 데이터와 관련된 데이터 타입 선정시, (1) 소요 공간, (2) 유니코드, (3) 데이터 내용, (4) 비

교 방식 등을 고려해야 한다.

2. 형태
   

3. 참고
   문자 데이터와 관련된 데이터 타입 선정 시에는 (1) 소요 공간, (2) 유니코드, (3) 데이터 내용,
  (4) 비교 방식 등을 고려해야 합니다.
   소요공간이란 저장되어야 하는 user data의 size를 고려하여 각 문자 Data Type별 최대 size를 알고
   선정하는 것을 의미한다.
   Oracle9i기준 Char Data Type은 최대 2KB저장이 가능하며, VARCHAR2는 4KB까지,
   Long Data Type은 2GB까지, clob Data Type은 4GB까지 가능하다.
   기본 database characterset에 해당하는 값이 아닌, 유니코드 national characterset 형태로
   데이터를 저장할 필요가 있는 경우에는 NCHAR, NVARCHAR2, NCLOB 데이터 타입에 대한 고려가 필요.

   문자 데이터의 내용에 따라서 저장되는 문자 데이터가 고정길이이면서 한자리거나 짧은 경우엔
   CHAR Data Type을 고려 할 필요가 있다.
   그러나 가변길이인 경우엔 char에 비해 varchar2 Data Type을 사용하시는 것이 자원의 낭비를
   줄이고, 테이블에 대한 full scan시 읽어야 할 블럭 갯수를 줄여 성능저하를 막을 수 있다.
   비교방식을 고려해보면, Char Data Type은 비교시 실제 데이터만 가지고 비교하는 것이 아니라
   padding된 blank를 넣어야 올바른 비교가 되므로 , 사용자 어플리케이션 작성시 유의해야 한다.

   테이블 설계 시, NULL column들이 많은 Column들을 물리적으로 뒤로 두는 것이 Space절약을
   위해 바람직하다. 또한 초기에 Null이었다가 Update시 Row길이가 늘어난다면 PCTFREE를 크게
   주어야 한다.


☞ 숫자, 날짜 관련 일반 지침

 

1. 정의
   오라클 9i 까지 모든 숫자는 내부적으로 NUMBER 타입에 저장된다. 날짜를 나타내는데는,
   DATE, TIMESTAMP를 사용할 수 있으며 경우에 따라 문자열 데이터 타입을 사용하는 경우도 있다.

2. 숫자 관련 일반 지침
   1. 반올림과 관련된 사항을 고려.
      – 예를 들어 유효 자릿수가 소수점 두자리 숫자에 대한 연산을 할 경우, 소수점 두자리
        숫자끼리 연산을 해서 결과값 역시 소수점 두자리 값으로 계산되도록 할 것.
      – 나눗셈 연산시, (예 1/3) 유효 자릿수를 지정하지 않을 경우, 소수점 자릿수를 많이
        소요하게 되므로, 자릿수 지정에 유의.Row-Chaining 유발.

3. 날짜 관련 일반 지침
 1. 초 이하 단위에 대한 저장이 필요할 경우, TIMESTAMP를 고려.
 2. 날짜 관련 연산이 빈번할 경우, DATE또는 TIMESTAMP를 고려할 것.
 3. 년월일에 대한 LIKE 나 = 과 같은 조건을 자주 사용할 경우, CHAR, VARCHAR2 고려. 단 유효한
    날짜인지 여부는 사용자 애플리케이션에서 확인 하여야 함.

4. 참고
   10g에서는 IEEE 754 형태의 BINARY_FLOAT과, BINARY_DOUBLE이 추가 되었음.


☞ LONG/LONG RAW 제약 사항

 

1. 정의
   크기가 큰 데이터를 저장하는데 LONG 또는 LONG RAW에는 많은 제약 사항이 따르므로, 새로운
   테이블을 설계할 경우, LOB을 우선 고려하고, 기존의 LONG 또는 LONG RAW또한 LOB으로의
   전환이 고려될 필요 가 있다.

2. LONG, LONG RAW의 제약 사항
   1. 테이블의 한 ROW에 여러 LOB 컬럼이 있을 수 있는 반면, LONG 또는 LONG RAW
      컬럼은 한 ROW에 하나 밖에 사용될 수 없음.
   2. LONG 또는 LONG RAW는 값 전체가 테이블 내에 저장이 되는 반면, LOB는 테이블 컬럼
      내에 LOB locator만 저장이됨 BLOB과 CLOB (내부 LOB) 데이터는 별도의 테이블스페이스에
      저장시킬 수 있으며, BFILE (외부 LOB) 데이터는 데이터베이스 외부의 별도 파일로 존재함.
   3. LOB 데이터는 4GB까지 저장이 가능하며, BFILE 컬럼이 가리키는 파일 크기는 4GB 이내에서
      OS에서 지원하는 최대 크기까지 가능함.. 한편 LONG이나 LONG RAW 데이터 타입에서는 2GB
      까지만 지원이 가능함.
   4. LOB는 랜덤 액세스가 가능한 반면, LONG 타입에 저장된 데이터는 처음부터 원하는 지점까지
      순차적으로 읽어 처리하여야 한다.
   5. LOB 데이터에 대한 replication을 local 또는 remote에서 수행할 수 있는 반면,
      LONG / LONG RAW 컬럼 데이터는 replication이 되지 않음.
   6. LONG 컬럼의 데이터는 TO_LOB()라는 함수를 사용하여 LOB로 변환 가능하지만,
      LOB를 LONG / LONG RAW로 변환 하는 기능은 제공되지 않음.
   7. LOB는 사용자 정의 데이터 타입 (userdefined Data Type)의 속성 (attribute) 으로
      사용될 수 있는 반면, LONG이나 LONG RAW는 속성으로 사용될 수 없음.


☞ BLOB/CLOB 제약 사항

 

1. 정의
   한편, LOB 또한 제약 사항이 있으므로, 데이터 타입 선정 시 장단점 비교가 필요하다.

2. LOB의 제약 사항
   1. LOB는 클러스터 테이블에서는 사용할 수 없으며, 따라서 클러스터 키로도 사용할 수 없음.
   2. LOB 컬럼은 GROUP BY, ORDER BY, AGGREGATE function, SELECT DISTINCT 등에 사용할 수
      없으며 JOIN 에도 사용할 수 없음. 그러나 LOB 컬럼을 사용하는 테이블에 대한 UNION ALL은
      지원됨. UNION MINUS나 SELECT DISTINCT는 OBJECT TYPE의 MAP이나 ORDER 함수가 정의된
      경우 사용할 수 있음.
   3. LOB 컬럼은 ANALYZE ... COMPUTE/ESTIMATE STATISTICS 명령 사용 시에도 analyze 되지 않음.
   4. LOB는 VARRAY에는 사용할 수 없음.
   5. NCLOB은 OBJECT TYPE의 속성(attribute)으로 사용될 수 없으나, 메소드 정의를하는 데는
      NCLOB 파라미터를 사용할 수 있음.

참고자료 : 한국 오라클 (주) 제품지원실 작성문서

Posted by 농부지기
,