(아래는 MS office가 없거나 다운받아 열기 귀찮을때를 위해 ppt 내용을 올린 것)
Index-Organized Table(IOT)
_M#]
IOT
<primary_key_value,non_primary_key_column_values>
<primary_key_value,non_primary_key_column_values>
IOT는 결국 key column의 데이터가 큰 경우 사용
* invert index : http://en.wikipedia.org/wiki/Inverted_index
* invert index : http://en.wikipedia.org/wiki/Inverted_index
[#M_더보기|접기|
SCOTT> insert into emp (empno, ename) values (5, 'e5');
SCOTT> insert into emp (empno, ename) values (4, 'e4');
SCOTT> insert into emp (empno, ename) values (3, 'e3');
SCOTT> insert into emp (empno, ename) values (2, 'e2');
SCOTT> insert into emp (empno, ename) values (1, 'e1');
SCOTT> insert into emp_iot (empno, ename) values (5, 'e5');
SCOTT> insert into emp_iot (empno, ename) values (4, 'e4');
SCOTT> insert into emp_iot (empno, ename) values (3, 'e3');
SCOTT> insert into emp_iot (empno, ename) values (2, 'e2');
SCOTT> insert into emp_iot (empno, ename) values (1, 'e1');
SCOTT> select * from emp;
===================
EMPNO ENAME
---------- --------
5 e5
4 e4
3 e3
2 e2
1 e1
===================
SCOTT> select * from emp_iot;
===================
EMPNO ENAME
---------- --------
1 e1
2 e2
3 e3
4 e4
5 e5
===================
create table 문을 사용해 IOT를 생성할 경우 추가 정보를 제공해야 합니다.
1. ORGANIZATION INDEX : IOT임을 명시
2. 최소 1개 이상의 primary key
선택적으로 다음을 기술할 수 있습니다.
1. OVERFLOW 구문 : row의 nonkey 컬럼의 값이 index block 크기의 임계치 비율(PCTTHRESHOLD)을 초과하는 경우 지정한 tablespace에 데이터를 저장하여 고밀도 클러스터링을 유지합니다.
2. PCTTHRESHOLD 값 : IOT의 index block에서의 예약 공간 퍼센테이지를 정의.
임계치를 초과한 row의 부분은 head piece와 tail piece로 나뉘어지면서 head piece는 임계값을 만족하게 되고 index leaf block에 저장됩니다.
tail piece는 하나 또는 그 이상의 row piece로 overflow area에 저장됩니다.
그래서 index entry는 key 값과 row의 나머지 값에 대한 포인터를 갖게됩니다. (이렇게 nonkey 컬럼 값은 임계치 조건을 만족시킵니다.)
3. INCLUDING 구문 : overflow data segment에 저장될 nonkey 컬럼을 지정
--scott_iot_overflow.sql 파일
DROP TABLE EMP_IOT_OVERFLOW PURGE;
CREATE TABLE EMP_IOT_OVERFLOW
(
EMPNO NUMBER(4) CONSTRAINT PK_EMP_IOT_OVERFLOW PRIMARY KEY,
ENAME VARCHAR2(10),
JOB VARCHAR2(9),
MGR NUMBER(4),
HIREDATE DATE,
SAL NUMBER(7,2),
COMM NUMBER(7,2),
DEPTNO NUMBER(2)
)
ORGANIZATION INDEX
INCLUDING ename
OVERFLOW TABLESPACE example;
;
begin
for i in 1..7000 loop
INSERT INTO EMP_IOT_OVERFLOW VALUES (i,'sample','CLERK',7788,to_date('17-12-1980','dd-mm-yyyy'),i,NULL,10);
end loop;
end;
/
COMMIT;
--scott.sql 파일
DROP TABLE EMP PURGE;
DROP TABLE DEPT PURGE;
CREATE TABLE DEPT
(
DEPTNO NUMBER(2) CONSTRAINT PK_DEPT PRIMARY KEY,
DNAME VARCHAR2(14) ,
LOC VARCHAR2(13)
) ;
INSERT INTO DEPT VALUES (10,'ACCOUNTING','NEW YORK');
INSERT INTO DEPT VALUES (20,'RESEARCH','DALLAS');
INSERT INTO DEPT VALUES (30,'SALES','CHICAGO');
INSERT INTO DEPT VALUES (40,'OPERATIONS','BOSTON');
CREATE TABLE EMP
(
EMPNO NUMBER(4) CONSTRAINT PK_EMP PRIMARY KEY,
ENAME VARCHAR2(10),
JOB VARCHAR2(9),
MGR NUMBER(4),
HIREDATE DATE,
SAL NUMBER(7,2),
COMM NUMBER(7,2),
DEPTNO NUMBER(2) CONSTRAINT FK_DEPTNO REFERENCES DEPT
);
INSERT INTO EMP VALUES (7369,'SMITH','CLERK',7902,to_date('17-12-1980','dd-mm-yyyy'),800,NULL,20);
INSERT INTO EMP VALUES (7499,'ALLEN','SALESMAN',7698,to_date('20-2-1981','dd-mm-yyyy'),1600,300,30);
INSERT INTO EMP VALUES (7521,'WARD','SALESMAN',7698,to_date('22-2-1981','dd-mm-yyyy'),1250,500,30);
INSERT INTO EMP VALUES (7566,'JONES','MANAGER',7839,to_date('2-4-1981','dd-mm-yyyy'),2975,NULL,20);
INSERT INTO EMP VALUES (7654,'MARTIN','SALESMAN',7698,to_date('28-9-1981','dd-mm-yyyy'),1250,1400,30);
INSERT INTO EMP VALUES (7698,'BLAKE','MANAGER',7839,to_date('1-5-1981','dd-mm-yyyy'),2850,NULL,30);
INSERT INTO EMP VALUES (7782,'CLARK','MANAGER',7839,to_date('9-6-1981','dd-mm-yyyy'),2450,NULL,10);
INSERT INTO EMP VALUES (7788,'SCOTT','ANALYST',7566,to_date('13-7-87','dd-mm-yyyy'),3000,NULL,20);
INSERT INTO EMP VALUES (7839,'KING','PRESIDENT',NULL,to_date('17-11-1981','dd-mm-yyyy'),5000,NULL,10);
INSERT INTO EMP VALUES (7844,'TURNER','SALESMAN',7698,to_date('8-9-1981','dd-mm-yyyy'),1500,0,30);
INSERT INTO EMP VALUES (7876,'ADAMS','CLERK',7788,to_date('13-7-87','dd-mm-yyyy'),1100,NULL,20);
INSERT INTO EMP VALUES (7900,'JAMES','CLERK',7698,to_date('3-12-1981','dd-mm-yyyy'),950,NULL,30);
INSERT INTO EMP VALUES (7902,'FORD','ANALYST',7566,to_date('3-12-1981','dd-mm-yyyy'),3000,NULL,20);
INSERT INTO EMP VALUES (7934,'MILLER','CLERK',7782,to_date('23-1-1982','dd-mm-yyyy'),1300,NULL,10);
begin
for i in 1..7000 loop
INSERT INTO EMP VALUES (i,'sample','CLERK',7788,to_date('17-12-1980','dd-mm-yyyy'),i,NULL,10);
end loop;
end;
/
COMMIT;
SYS> 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
---------------- ------------------ ---------------------- ---------- ------- -------------
EMP_IOT_OVERFLOW SYS_IOT_OVER_52836 PK_EMP_IOT_OVERFLOW EXAMPLE USERS 50
EMP_IOT_BITMAP SYS_IOT_MAP_52869 PK_EMP_IOT_JOB_BITMAP USERS USERS
EMP_IOT_BITMAP SYS_IOT_MAP_52869 PK_EMP_IOT_BITMAP USERS USERS 50
DEPT_IOT_BITMAP SYS_IOT_MAP_52866 PK_DEPT_IOT_BITMAP USERS USERS 50
===========================================================================================
**통계정보 보는 방법 : http://download.oracle.com/docs/cd/B19306_01/server.102/b14357/ch8.htm#sthref1523
consistent gets : Number of times a consistent read was requested for a block
Statistics
----------------------------------------------------------
262 recursive calls ==> SQL문을 실행하기 위해서 제일 먼저 syntax, semantics, previlge 등을 체크해야 하는데 이때 실행되는 무수한 많은 명령어들을 recursve sql 이라고 함.
표현되는 숫자는 읽혀진 data block의 숫자
0 db block gets ==> datablock(변경 전 데이터)가 저장된 공간
726 consistent gets ==> 변경 후 데이터가 저장된 공간
==> DBBlock과 Consistent 공간은 메모리 상의 공간. 보통은 메모리 read가 물리적 read보다 많으나, 물리전 read가 많아질 경우 성능 문제가 발생할 수 있다. (Data Buffer Cache 사이즈 튜닝 필요)
0 physical reads ==> 디스크상에서 읽어서 메모리에 로드된 양
0 redo size ==> redo log buffer에서 읽은 사이즈
983 bytes sent via SQL*Net to client ==> 오라클 CS 환경 : 서버쪽 (SQL*Net이 설치됨), 클라이언트 (클라이언트용 SQLPlus, SQL*Net 등) ㅋCS상의 쿼리 전송 및 서버의 결과를 클라이언트에 전송. 서버에서 클라이언트로 보내준 데이터양
396 bytes received via SQL*Net from client ==> 클라이언트에서 서버로 넘겨준 쿼리
3 SQL*Net roundtrips to/from client ==> 서버와 클라이언트 간 통신을 한 횟수
9 sorts (memory) ==> SQL서버가 설치되면 기본적으로 system, temp, undo 테이블 스페이스가 생성됨. 서버프로세스가 실행되면 PGA(Program Global Area)에서 1차적 소팅 작업을 함. PGA 사이즈가 500K이고, 소팅해야 하는 데이터가 3000K 정도 된다고 하면, PGA에서 한번에 처리하지 못함. 이 때 PGA에서 페이징이 일어나는데 페이징 되면서 이전 소팅 데이터를 잠시 temp tablespace(2차 저장 공간)에 저장함. PGA는 접속한 사용자마다 생성되나, temp의 경우 공유해서 사용함. 사용자별로 PGA 사이즈를 조절할 필요가 있을 때, alter session set sort_area_size = 10M .... 식으로 세션별 PGA 사이즈를 잠시 늘려줄 수 있음.
0 sorts (disk) ==> temp tablespace 를 사용한 데이터량
20 rows processed ==> 쿼리 실행 결과 fetch되는 Row 수
SCOTT> select empno, ename from emp where empno = 7788;
==========================================================================================================
EMPNO ENAME
---------- ----------
7788 SCOTT
==========================================================================================================
Execution Plan
----------------------------------------------------------
Plan hash value: 2949544139
--------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 20 | 2 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| EMP | 1 | 20 | 2 (0)| 00:00:01 |
|* 2 | INDEX UNIQUE SCAN | PK_EMP | 1 | | 1 (0)| 00:00:01 |
--------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("EMPNO"=7788)
Statistics
----------------------------------------------------------
24 recursive calls
0 db block gets
5 consistent gets
0 physical reads
0 redo size
483 bytes sent via SQL*Net to client
385 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
SCOTT> select empno, ename from emp_iot where empno = 7788;
==========================================================================================================
EMPNO ENAME
---------- ----------
7788 SCOTT
==========================================================================================================
Execution Plan
----------------------------------------------------------
Plan hash value: 3316488602
--------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 20 | 1 (0)| 00:00:01 |
|* 1 | INDEX UNIQUE SCAN| PK_EMP_IOT | 1 | 20 | 1 (0)| 00:00:01 |
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("EMPNO"=7788)
Statistics
----------------------------------------------------------
1 recursive calls
0 db block gets
2 consistent gets
0 physical reads
0 redo size
483 bytes sent via SQL*Net to client
385 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
SCOTT> analyze index pk_emp validate structure;
SCOTT> select height, blocks, lf_rows, lf_blks, btree_space, used_space from index_stats;
==========================================================================================
HEIGHT BLOCKS LF_ROWS LF_BLKS BTREE_SPACE USED_SPACE
---------- ---------- ---------- ---------- ----------- ----------
2 32 7014 24 200032 98254
==========================================================================================
일반 Table의 pk_emp의 경우
7014의 index entry(row:LF_ROWS컬럼)를 24개의 leaf block에 저장
하나의 leaf block에는 평균 292.25개의 index entry(row)가 저장 (292.25 = 7014/24 (LF_ROWS/LF_BLKS))
pk_emp index를위해 약 200kb(200032 bytes:BTREE_SPACE컬럼)의 공간이 할당됨
실제 사용된 용량은 약 98kb(98254 bytes:USED_SPACE컬럼)
SCOTT> analyze index pk_emp_iot validate structure;
SCOTT> select height, blocks, lf_rows, lf_blks, btree_space, used_space from index_stats;
==========================================================================================
HEIGHT BLOCKS LF_ROWS LF_BLKS BTREE_SPACE USED_SPACE
---------- ---------- ---------- ---------- ----------- ----------
2 48 7014 40 328032 308674
==========================================================================================
IOT의 pk_emp_iot의 경우
7014의 index entry(row:LF_ROWS컬럼)를 40개의 leaf block에 저장
하나의 leaf block에는 평균 175.35개의 index entry(row)가 저장 (175.35 = 7014/50 (LF_ROWS/LF_BLKS))
pk_emp_iot의 index를위해 약 328kb(328032 bytes:BTREE_SPACE컬럼)의 공간이 할당됨
실제 사용된 용량은 약 308kb(308674 bytes:USED_SPACE컬럼)
그러므로
primary key를 사용하여 1000 rows 추출시
일반 Table의 경우 : 4개의 leaf blocks을 access
IOT의 경우 : 6개의 leaf blocks을 access
결국 이 경우 IOT 사용시 block access가 많아져 성능저하로 이어짐.
해결책 :
overflow 구문을 사용하여 nonkey 컬럼값을 overflow segment에 저장하여 index entry(row)의 크기를 작게 한다.
overflow segment는 일반 table에 저장되기 때문에 각 row는 physical rowid를 가지며
이를 검색하기 위해 index entry에 physical rowid가 저장됨.
*아래 그림은 메모장이나 text 에디터에 copy & paste 하면 잘나옵니다.
EMP_IOT overflow segment table for EMP_IOT
┏━━━┳━━━┳━━━━┳━━━━━━━┓ ┏━━━━━━━┳━━━━━━━━━━━━━━━━━━┓
┃ empno┃ename ┃job ┃physical rowid┃ ┃physical rowid┃self_intro ┃
┣━━━╋━━━╋━━━━╋━━━━━━━┫ ┣━━━━━━━╋━━━━━━━━━━━━━━━━━━┫
┃ 7369┃SMITH ┃CLERK ┃AAAQ5/AAFAAAC ┣━▷┃AAAQ5/AAFAAAC ┃blah~~ blah~~~ blah~~~ blah~~~ ... ┃
┣━━━╋━━━╋━━━━╋━━━━━━━┫ ┣━━━━━━━╋━━━━━━━━━━━━━━━━━━┫
┃ 7499┃ALLEN ┃SALESMAN┃AAAQ5/AAFAAAD ┣━▷┃AAAQ5/AAFAAAD ┃우악우악 우아아아아~~~~~~ ┃
┣━━━╋━━━╋━━━━╋━━━━━━━┫ ┣━━━━━━━╋━━━━━━━━━━━━━━━━━━┫
┃ 7521┃WARD ┃SALESMAN┃AAAQ5/AAFAAAE ┣━▷┃AAAQ5/AAFAAAE ┃잼있는거 내놔 ┃
┣━━━┻━━━┻━━━━┻━━━━━━━┫ ┣━━━━━━━┻━━━━━━━━━━━━━━━━━━┫
┃ ..... ┃ ┃ ..... ┃
┗━━━━━━━━━━━━━━━━━━━━┛ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━┛
그러므로 IOT에서 overflow segment내의 nonkey columns를 검색하는 경우 일반 table에 비해 성능이 떨어짐.
IOT가 사용되기에 적합한 특성
1) columns수가 적다.
2) 각 columns의 size가 작다.
3) full scan이 자주 수행되지 않는다.
4) range scan으로 넒은 범위 검색 보다는 primary key를 사용한 적은 범위 검색을 한다.
5) 자주 검색되는 column과 그렇지 않은 column이 확연이 구분된다.
index_stats 테이블 컬럼 설명 (http://download.oracle.com/docs/cd/B19306_01/server.102/b14237/statviews_4216.htm#sthref2014)
HEIGHT Height of the B-Tree
BLOCKS Blocks allocated to the segment
LF_ROWS Number of leaf rows (values in the index)
LF_BLKS Number of leaf blocks in the B-Tree
BTREE_SPACE Total space currently allocated in the B-Tree
USED_SPACE Total space that is currently being used in the B-Tree
Analyzing Index-Organized Tables
일반 테이블처럼 IOT도 DBMS_STATS 패키지나 ANALYZE 문을 이용해 분석합니다.
IOT의 Optimizer statistics 수집
DBMS_STATS 패키지 사용
SQL> EXECUTE DBMS_STATS.GATHER_TABLE_STATS ('HR','COUNTRIES'); --HR 스키마의 COUNTRIES 테이블을 대상으로 수행
DBMS_STATS 패키지는 index segment와 overflow data segment 모두 분석하며 테이블의 논리적, 물리적 통계를 계산합니다.
- 논리적 통계는 USER_TABLES, ALL_TABLES or DBA_TABLES 테이블을 사용하여 얻을 수 있습니다.
- index segment의 물리적 통계
USER_INDEXES, ALL_INDEXES, DBA_INDEXES 테이블에 primary key index를 질의하여 얻음.
EXAMPLE ] admin_docindex 테이블의 pk_amin_docindex로 조회
SQL> SELECT LAST_ANALYZED, BLEVEL,LEAF_BLOCKS, DISTINCT_KEYS
FROM DBA_INDEXES WHERE INDEX_NAME= 'PK_ADMIN_DOCINDEX';
- overflow data segment의 물리적 통계
USER_TABLES, ALL_TABLES, DBA_TABLES 테이블에 IOT_TYPE = 'IOT_OVERFLOW'를 사용합니다.
EXSAMPLE ] admin_docindex 테이블로 조회
SQL> SELECT LAST_ANALYZED, NUM_ROWS, BLOCKS, EMPTY_BLOCKS
FROM DBA_TABLES WHERE IOT_TYPE='IOT_OVERFLOW'
and IOT_NAME= 'ADMIN_DOCINDEX';
reference :
Managing Optimizer Statistics :http://download.oracle.com/docs/cd/B19306_01/server.102/b14211/stats.htm#PFGRF003
Validating the Structure of Index-Organized Tables
IOT 구조 점검
SQL> ANALYZE TABLE emp VALIDATE STRUCTURE; --table 구조 분석
SQL> ANALYZE TABLE emp VALIDATE STRUCTURE CASCADE; --관련된 모든 object 구조 분석
SQL> ANALYZE TABLE emp VALIDATE STRUCTURE CASCADE ONLINE; --online 진행
Migrated or Chained Rows 제거 방법
0. CHAINED_ROWS 테이블 생성
SQL> @C:\oracle\product\10.2.0\db_1\RDBMS\ADMIN\utlchain.sql
/*
create table CHAINED_ROWS (
owner_name varchar2(30),
table_name varchar2(30),
cluster_name varchar2(30),
partition_name varchar2(30),
subpartition_name varchar2(30),
head_rowid rowid,
analyze_timestamp date
);
*/
1. ANALYZE 문을 통해 migrated row와 chained row의 정보 수집하고 확인합니다.
SQL> ANALYZE CLUSTER order_hist LIST CHAINED ROWS [INTO CHAINED_ROWS]; --분석(PCTTHRESHOLD 값의 선택과 모니터링으로도 사용)
SQL> SELECT * FROM CHAINED_ROWS WHERE TABLE_NAME = 'ORDER_HIST'; --정보확인
OWNER_NAME TABLE_NAME CLUST... HEAD_ROWID TIMESTAMP
---------- ---------- -----... ------------------ ---------
SCOTT ORDER_HIST ... AAAAluAAHAAAAA1AAA 04-MAR-96
SCOTT ORDER_HIST ... AAAAluAAHAAAAA1AAB 04-MAR-96
SCOTT ORDER_HIST ... AAAAluAAHAAAAA1AAC 04-MAR-96
3. 만약 migrated or chained rows가 많다면 다음 step을 진행합니다.
4. migrated or chained rows 를 임시 저장 테이블에 저장합니다.
SQL> CREATE TABLE int_order_hist
AS SELECT *
FROM order_hist
WHERE ROWID IN
(SELECT HEAD_ROWID
FROM CHAINED_ROWS
WHERE TABLE_NAME = 'ORDER_HIST');
5. 원본 테이블에서 migrated or chained rows 들을 삭제합니다.
SQL> DELETE FROM order_hist
WHERE ROWID IN
(SELECT HEAD_ROWID
FROM CHAINED_ROWS
WHERE TABLE_NAME = 'ORDER_HIST');
6. 임시 저장 테이블에 있는 migrated or chained rows 들을 원래 테이블로 insert 합니다.
SQL> INSERT INTO order_hist
SELECT *
FROM int_order_hist;
7. 임시 저장 테이블 삭제합니다.
SQL> Drop the intermediate table:
8. DROP TABLE int_order_history;
9. 분석 자료를 삭제합니다.
SQL> DELETE FROM CHAINED_ROWS
WHERE TABLE_NAME = 'ORDER_HIST';
9. ANALZE 문을 다시 실행하여 migrated or chained rows가 없는지 확인합니다.
chained row가 계속 나타난다면 data block size를 늘려서 chained rows를 제거 해야 합니다.
하지만 항상 chaining을 피할 수 없을 수도 있습니다.
종종 LONG, large CHAR, VARCHAR2 columns을 갖고 있는 테이블들은 chaining을 피할 수 없다.
reference : http://download.oracle.com/docs/cd/B19306_01/server.102/b14231/general.htm#i1006350
** Index Organized Table (IOT)에 대한 이야기 ...... (1)
** Index Organized Table (IOT)에 대한 이야기 ...... (2)
** Overview of Index-Organized Tables
** What Are Index-Organized Tables?
** Logical rowids
Partitioned Table & Index
_M#]
[#M_더보기|접기|
Conn system/oracle as sysdba
create tablespace part01 datafile 'C:\oracle\product\10.2.0\oradata\orcl\part01.dbf' size 10M;
create tablespace part02 datafile 'C:\oracle\product\10.2.0\oradata\orcl\part02.dbf' size 10M;
create tablespace part03 datafile 'C:\oracle\product\10.2.0\oradata\orcl\part03.dbf' size 10M;
create tablespace part04 datafile 'C:\oracle\product\10.2.0\oradata\orcl\part04.dbf' size 10M;
create tablespace part05 datafile 'C:\oracle\product\10.2.0\oradata\orcl\part05.dbf' size 10M;
Conn scott/tiger
CREATE TABLE emp_partition(
emp_id varchar2(5),
name varchar2(20),
age number,
dept varchar2(20),
CONSTRAINT emp_pk PRIMARY KEY (emp_id))
PARTITION BY RANGE(age) -- partition key = age 컬럼
(
partition Part1 values less than (20) tablespace Part01, -- age 컬럼값이 20미만인 경우 Part 01 테이블 스페이스에 저장
partition Part2 values less than (30) tablespace Part02, -- age 컬럼값이 30미만인 경우 Part 02 테이블 스페이스에 저장
partition Part3 values less than (40) tablespace Part03, -- age 컬럼값이 40미만인 경우 Part 03 테이블 스페이스에 저장
partition Part4 values less than (50) tablespace Part04, -- age 컬럼값이 50미만인 경우 Part 04 테이블 스페이스에 저장
partition Part5 values less than (MAXVALUE) tablespace Part05 --age 컬럼값이 50이상인 경우 Part 015테이블 스페이스에 저장
);
Oracle 버전에 따른 파티션
Oracle Ver 7.3
Partition View를 처음으로 도입하였다.
당시 Partition View는 큰 테이블을 동일한 템플릿을 가진 여러 개의 다른 테이블로 분할하고UNION ALL을 사용하여 View로 묶은 형태이다.
그러나 이 방식은 관리의 어려움, 활용성의 부족, 성능등에 대한 이슈로 인하여 Oracle Ver 9i에서는더이상 지원하지 않는다.
Oracle Ver 8.0
컬럼 값의 Range 기반으로 된 Range Partition이 최초로 도입되었고, 비로서 Partition의 모습을 갖추었다.
각 파티션은 각기 다른 테이블 스페이스, Segment에 저장이 가능하다.
Oracle Ver 8i
컬럼 값의 Hash 기반으로 된 hash partition과, Sub Partition을 할 수 있는 Composite Partition이 추가되었다.
이 당시 Composite Partition은 Range-Hash로만 구성 가능함.
Oracle Ver 9i
리스트 값으로 파티션을 할 수 있는 List Partition이 추가되었다.
Composite Partition에서는 Range-Hash 이외에 Range-List가 추가 지원되었다.
Oracle Ver 10g
IOT 파티션이 추가되었다.
Oracle Ver 11g
Composite Partition에서 확장된 Extended Composite Partition이 지원된다.
Range-Range, List-Range, List-Hash, List-List
Reference Partition 추가
Interval Partition 추가
System Partition 추가
Virtual Column Partition 추가
** 파티셔닝 이용 시기
http://wiki.oracleclub.com/pages/viewpage.action?pageId=1507516
** CREATE TABLE ... PARTITION ... 문
http://radiocom.kunsan.ac.kr/lecture/oracle/statement_create/create_table_partition.html
http://wiki.oracleclub.com/pages/viewpage.action?pageId=1507516
** CREATE TABLE ... PARTITION ... 문
http://radiocom.kunsan.ac.kr/lecture/oracle/statement_create/create_table_partition.html
** IOT PARTITIONING
**오라클 파티션 기법-1
** Oracle의 대표적인 DW를 위한 기능, Partition Table의 종류
** 17 Managing Partitioned Tables and Indexes
** 18 Partitioned Tables and Indexes
_M#]
'DB' 카테고리의 다른 글
Oracle architecture (0) | 2010.07.31 |
---|---|
PL/SQL 기본 (0) | 2010.07.30 |
AUDIT - 감사 (0) | 2010.07.30 |
SQL99 - Insert All, MERGE, IS NAN, INTERVAL (0) | 2010.07.30 |
lock 관련 (0) | 2009.02.27 |
Oracle Character set 변경 (3) | 2009.02.12 |
Oracle 실행된 쿼리 보기 (0) | 2009.02.12 |
Oracle Version 확인 (0) | 2009.02.12 |