달력

5

« 2024/5 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
2010. 4. 12. 16:00

IOT(INDEX ORGANIZED TABLE) I.lib()/I.lib(Altibase)2010. 4. 12. 16:00

.. .. ..
IOT(INDEX ORGANIZED TABLE) 란?


일반 테이블에서 인덱스를 통해서 레코드를 액세스 할 때에는 키 값을 가지고 인덱스를 탐색해서 ROWID를 얻은 다음에  다시 ROWID를 이용해서 테이블을 읽는 두 번의 과정을 거쳐야 합니다.

또한 키 컬럼이 인덱스와 테이블 양 쪽에 중복해서 저장되므로 키 값이 큰 경우에는 디스크의 낭비 또한 무시할 수 없습니다.

이러한 문제점을 해결하고자 고안된 것이 IOT(Index Organized Table) 입니다.


 - IOT는 인덱스 안에 테이블을 넣어 버린 구조로 되어 있기 때문에 인덱스를 읽는 것으로 모든 작업이  완료 됩니다.

 - 키 값에 해당되는 레코드를 테이블에서 읽을 필요도 없고, 데이터의 중복 문제도 자연스럽게 해결할 수 있습니다.

 - IOT는 겉보기에는 테이블이지만 실제로는 기본 키(primary key)를 근간으로 한 인덱스이기 때문에 전제 조건으로 Primary Key를 필요로 합니다.

 - IOT를 생성하면 인덱스와 테이블이 같은 저장 구조에 생성되어 SQL 문이 실행되면, 무조건 IOT 인덱스를 통해 데이터를 검색하여 빠른 데이터 검색이 가능하고 저장 공간이 적게 사용 합니다.


특징

- IOT는 table data를 primary key에 대한 B*Tree index에 적재하는 구조를 갖습니다.

- IOT의 index row들은 인덱스 키 값과 non-key 값을 포한 합니다.

- IOT의 index에는 ROWID 정보가 없습니다.


장점

- range search, exact match를 수행하는 경우 일반적인 table보다 빠른   key-based access가 가능 합니다.

- full table scan 시 primary key에 대한 full index scan이 이루어지므로  자동적인 ordering이 이루어 집니다.

- index key column과 rowid에 대한 storage 중복을 피할 수 있어 storage가 절약 됩니다.

일반 테이블과 IOT테이블의 차이점


 - 일반테이블은 ROWID로 행을 구별하지만 IOT는 PK로 행을 구별합니다.

 - 일반 테이블의 FULL SCAN은 행이 Return되는 순서를 예측할 수 없지만, IOT는 PK값의 순서에 따랄 출력됩니다.

 - IOT는 Unique 제약조건을 설정 할 수 없습니다.

 - IOT는 클러스트를 사용할 수 없습니다.

 - IOT는 일반테이블보다 저장공간이 감소합니다.

 - IOT는 Primary Key를 꼭 생성해야 합니다.  

 - IOT의 Secondary 인덱스는 Primary Key값과 그것을 기반으로 하는 ’Universal Rowid’ 즉, Urowid를 가지고 인덱스가 만들어집니다.

 - IOT는 일반 인덱스와 달리 물리적인 ROWID 정보를 가지고 있지 않고 논리적인 유니버설 ROWID(UROWID)를 가지고 있어 빠르게 검색할 수 있습니다.


 ※ UROWID(Universal Rowid) : 인덱스 구성 테이블(IOT, Index-Organized Table)행의 논리적인 위치

IOT(INDEX ORGANIZED TABLE) 생성


[Syntax]



-- IOT 생성 예제
SQL> CREATE TABLE iot_test (
         id NUMBER CONSTRAINT   iot_test_pk_id   PRIMARY KEY,
         name VARCHAR2(30),
         contents VARCHAR2(2000))
         
ORGANIZATION INDEX TABLESPACE indx
         
PCTTHRESHOLD 40 INCLUDING name
         
OVERFLOW TABLESPACE users;
 
테이블이 생성되었습니다.


아래는 위에서 생성한 문법의 설명 입니다.

 ORGANIZATION INDEX TABLESPACE : IOT Data 저장되는 Tablespace
 
 
PCTTHRESHOLD

  - IOT
위해서 예약된 공간의 백분율, 1블럭의 N% 비율보다 데이터가 입력되면 열이 아닌 데이터는 OVERFLOW TABLESPACE절에 정의된 테이블스페이스에 저장 됩니다.

  - 0~50
사이값으로만 지정가능, 디폴트는 50

  -
만약 PCTTHRESHOLD 40 으로 지정했을 경우,  하나의 행자체가 위에 값보다 크게 되면 INCLUDING
뒤에 있는 컬럼만 제외하고는 모두 OVERFLOW 세그먼트로 이동됩니다.
 
 
INCLUDING

  - IOT
행을 인덱스와 오버플로우 구역으로 나눌 열을 구분합니다.  

  - INCLUDING
지정되지 않았는데 크기가 PCTTHRESHOLD 초과하면 기본 열을 제외한 모든 오버플로우 세그먼트에 저장이 됩니다.

  - INCLUDING
뒤에 있는 컬럼만 제외하고 모두 오버플로우 세그먼트에 저장이 됩니다.

  - INCLUDING
절에 오는 열은 기본 키의 마지막 열의 이름 이거나 기본 키가 아닌 입니다.
 
 
OVERFLOW TABLESPACE
 
  -
PCTTHRESHOLD 초과하는 Data 행이 저장됩니다.

  -
만일 Overflow Tablespace Option 주지 않고 생성된 IOT 대하여 (PCTTHRESHOLD / 100) *DB_BLOCK_SIZE보다 row 발생한다면 ORA-1429 같은 오류를 만나게 됩니다



 

IOT 생성시 만들어지는 세그먼트


위에서 설명한거와 같이 IOT 생성할  기본적으로 인덱스 세그먼트와 OVERFLOW 세그먼트를 지정합니다.


인덱스 : PK 지정시 생성되는 인덱스로 CREATE TABLE 문에 지정된 테이블스페이스에 생성되며 이때 지정된 스토리지와 공간활용 파라미터를 가진다.

OVERFLOW 행조각을 수용할 테이블 : PCTTHRESHOLD 초과한 경우 나머지 컬럼들이 저장되는 테이블로 이름이 SYS_IOT_OVER_n으로 지정되며 n DBS_OBJECTS에서 있는 IOT OBJECT_ID입니다.





-
위에 그림과 같이 인덱스 세그먼트이름은 PK 이름이 되고, 세그먼트유형은 INDEX 됩니다.

-
OverFlow 세그먼트는 세그먼트이름은  SYS_IOT_OVER_n 지정되고, 세그먼트유형은 TABLE 됩니다.



-- 위에서 생성한 IOT 인덱스 세그먼트를 조회 예제 입니다.
SQL> SELECT segment_name FROM user_segments WHERE segment_type=’INDEX’;
SEGMENT_NAME
----------------------
PK_DEPT
PK_EMP
IOT_TEST_PK_ID    --> IOT Data 저장되는 세그먼트



-- 위에서 생성한 IOT OverFlow 세그먼트 조회 예제 입니다.
SQL> SELECT segment_name FROM user_segments WHERE segment_type=’TABLE’;
 
SEGMENT_NAME
------------------------------------------------------------------------
DEPT
EMP
SYS_IOT_OVER_30957 --> OVERFLOW 해당하는 Data 저장되는 세그먼트


 

IOT 실습

똑같은 테이블과 똑같은 데이터를 가지고 일반테이블과 IOT 실습을 해보겠습니다.
 
 
1) 먼저 일반테이블을 생성해서 데이터를 INSERT합니다.


-- 테이블을 생성합니다.
 CREATE TABLE TEST(
 NO NUMBER  CONSTRAINT TEST_NO_PK Primary Key,
 TITLE VARCHAR2(50),
 CONTNETS VARCHAR2(500))
 TABLESPACE USERS;


 -- Data INSERT합니다.
 INSERT INTO TEST
VALUES(3,’CCCCCCCCCC’,’CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC’);
 INSERT INTO TEST
VALUES(1,’AAAAAAAAAA’,’AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA’);
 INSERT INTO TEST
VALUES(5,’EEEEEEEEEE’,’EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE’);
 INSERT INTO TEST
VALUES(2,’BBBBBBBBBB’,’BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB’);
 INSERT INTO TEST
VALUES(4,’DDDDDDDDDD’,’DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD’);
 COMMIT;


-- 데이타를 조회 합니다.
SQL> SELECT no, title FROM test;
 
  NO TITLE
---- ------------ 
   3 CCCCCCCCCC
   1 AAAAAAAAAA
   5 EEEEEEEEEE
   2 BBBBBBBBBB
   4 DDDDDDDDDD




 
2) 위와 똑같이 IOT 생성해서 똑같은 데이터를 INSERT합니다.
 
 
-- IOTTEST 테이블을 생성합니다.
CREATE TABLE IOTTEST (
NO NUMBER CONSTRAINT   IOTTEST_PK_NO   PRIMARY KEY,
TITLE VARCHAR2(50),
CONTENTS VARCHAR2(500))
ORGANIZATION INDEX TABLESPACE INDX
PCTTHRESHOLD 40 INCLUDING TITLE
OVERFLOW TABLESPACE USERS;
 
 
-- DATA INSERT합니다.
 INSERT INTO IOTTEST
VALUES(3,’CCCCCCCCCC’,’CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC’);
 INSERT INTO IOTTEST
VALUES(1,’AAAAAAAAAA’,’AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA’);
 INSERT INTO IOTTEST
VALUES(5,’EEEEEEEEEE’,’EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE’);
 INSERT INTO IOTTEST
VALUES(2,’BBBBBBBBBB’,’BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB’);
 INSERT INTO IOTTEST
VALUES(4,’DDDDDDDDDD’,’DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD’);
 COMMIT;
 
 
-- 데이타를 조회 합니다.
SQL>COL title FORMAT A30;
SQL> SELECT no, title FROM iottest;
 
  NO TITLE
---- ----------
   1 AAAAAAAAAA
   2 BBBBBBBBBB
   3 CCCCCCCCCC
   4 DDDDDDDDDD
   5 EEEEEEEEEE

 
입력한 순서에 상관없이 오름차순으로 정렬되어 있는 것을 확인 있습니다


 

IOT 9i 향상기능


오라클 9i에서 확장된 IOT 대한 온라인 기능 보겠습니다.
 
 
 -- IOT 세컨더리 인덱스에 대해 온라인 생성과 재구성을 있습니다.  
SQL>CREATE INDEX iottest_title_idx ON iottest (title) ONLINE;  
인덱스가 생성되었습니다.
 
 
-- IOT 프라이머리 인덱스에 대해 온라인 COALESCE 있습니다.  
SQL>ALTER TABLE iottest COALESCE;  
 
 
 
IOT 로지컬 ROWID 온라인 갱신
 
IOT 세컨더리 인덱스는 성능향상을 위해 엔트리에 대한 로지컬 ROWID 저장합니다.
로지컬 ROWID 변경될 있기 때문에 인덱스에 저장된 값은 최대 추측가능 값이 됩니다.

따라서, 로지컬 ROWID 내내 변질 상태가 있고, 변질된 로지컬 ROWID 온라인으로 갱신이 가능합니다.

아래 명령어로 로지컬 ROWID 온라인 갱신을 있습니다.
 
 
 
-- IOT 세컨더리 인덱스에 대한 로지컬 ROWID 온라인 갱신을 있습니다.  
SQL>ALTER INDEX iottest_title_idx UPDATE BLOCK REFERENCES;  
 
 
 
IOT 온라인 MOVE

IOT
단편화(fragmentation) 방지하기 위해 재생성 있습니다.
ALTER
명령의 MOVE옵션을 사용하여 재생성 작업을 온라인으로 있습니다.
오버플로우 데이터 세그먼트도 온라인으로 옮겨질 있습니다.


 -- IOT
오버플로우 세그먼트와 함께 온라인으로 옮길 있습니다.
 -- iottest
테이블의 테이블스페이스와 OVERFLOW 테이블스페이스 변경  
SQL>ALTER TABLE iottest MOVE ONLINE TABLESPACE tbs1
      OVERFLOW TABLESPACE
tbs2;


 

IOT 정보조회


-- PAGE,문자열 포맷설정
SET LINESIZE 120;
COL IOT FORMAT A10;
COL OVERFLOW FORMAT A25;
COL INDEX FORMAT A20;
COL OVERFLOWTS FORMAT A10;
COL INDEXTS FORMAT A10;


-- IOT 정보 조회
SELECT t.table_name AS "IOT", o.table_name AS "Overflow",
       i.index_name AS "Index", o.tablespace_name AS "OverflowTS",
       i.tablespace_name AS "IndexTS", I.pct_threshold
FROM dba_tables t, dba_tables o, dba_indexes I
WHERE t.owner = o.owner
  AND t.table_name = o.iot_name
  AND t.owner = I.owner
  AND t.table_name = I.table_name
  AND t.owner = ’SCOTT’;


-- 조회 결과
IOT        Overflow                  Index                OverflowTS IndexTS    PCT_THRESHOLD
---------- ------------------------- -------------------- ---------- ---------- -------------
IOTTEST    SYS_IOT_OVER_30979        IOTTEST_PK_NO        USERS      INDX                  40
IOTTEST    SYS_IOT_OVER_30979        IOTTEST_TITLE_IDX    USERS      SYSTEM
IOT_TEST   SYS_IOT_OVER_30966        IOT_TEST_PK_ID       USERS      INDX                  40



<< 참고문헌 >>
- Oracle Technical Bulletins  No.11615 ORACLE 8.0의 IOT(INDEX ORGANIZED TABLE)
- Oracle 9i Performance Tuning Student Guide Volumn 1

  ================================================
    * 데이터베이스 정보공유 커뮤니티 oracleclub.com
    * 강좌 작성자 : 김정식 (oramaster _at_ naver.com)

.
:
Posted by .07274.