'DB/Oracle 10g 강좌'에 해당되는 글 12건

  1. 2009.10.31 Oracle 10g 강좌 목차
  2. 2009.10.31 RAC(Real Application Cluster)
  3. 2009.10.31 Partition Index
  4. 2009.10.31 Composite Range-List Partitioning
  5. 2009.10.31 Composite Range-Hash Partitioning
  6. 2009.10.31 List Partition
  7. 2009.10.31 Hash Partition
  8. 2009.10.31 Range Partition
  9. 2009.10.31 Partition Table 이란?
  10. 2009.10.31 (10gR2)Full UNDO tablespace
  제 목 강좌등록일  
 Oracle10g에서 CONNECT BY의 새로운 기능들 2006-04-12
아래 강좌는 Oracle10g의 내용을 새롭게 정리했습니다.
1. Architecture,아키텍처 2006-04-10
1.1 Overview of the System Global Area
1.1.1 The SGA_MAX_SIZE Initialization Parameter 2006-04-10
1.1.2 Automatic Shared Memory Management,ALTER SYSTEM 2006-04-10
1.1.3 Database buffer cache 2006-04-10
1.1.4 Redo log buffer, Shared pool, Large pool 2006-04-10
1.2 Overview of the Program Global Areas 2006-04-10
2. Process Architecture
2.1 User Processes, Server Processes 2006-04-10
2.2 Background Process 2006-04-10
3. Data Blocks, Extents, and Segments
3.1 Overview of Data Blocks 2006-04-10
3.1.1 PCTFREE, PCTUSED, and Row Chaining 2006-04-10
3.1.2 Automatic Space Segment Management 2006-04-10
3.2 Overview of Extents 2006-04-11
3.3 Overview of Segments 2006-04-11
4. Tablespaces
4.1 Datafiles and Tablespaces 2006-04-11
4.2 Overview of Tablespaces 2006-04-11
4.3 테이블스페이스를 할당하는 방법 2006-04-11
4.4 Bigfile Tablespace 2007-08-06
4.5 Temporary Tablespace Group 2007-08-06
4.6 (10gR2)Full UNDO tablespace 2008-10-29
5. Managing Partitioned Tables and Indexes
5.1 Partition Table 이란? 2006-06-17
5.2 Range Partition 2006-06-17
5.3 Hash Partition 2006-06-17
5.4 List Partition 2006-06-18
5.5 Composite Partition
5.5.1 Composite Range-Hash Partitioning 2006-06-18
5.5.2 Composite Range-List Partitioning 2006-06-18
5.6 파티션 인덱스 2006-06-18
6. RAC(Real Application Cluster) 2007-08-06




출처 : oracleclub.com

'DB > Oracle 10g 강좌' 카테고리의 다른 글

RAC(Real Application Cluster)  (0) 2009.10.31
Partition Index  (0) 2009.10.31
Composite Range-List Partitioning  (0) 2009.10.31
Composite Range-Hash Partitioning  (0) 2009.10.31
List Partition  (0) 2009.10.31
Posted by 야동우
,

1. GRID의 개념
 
  1.1 GRID의 개념
 
  1) GRID 컴퓨팅의 정의 
  
   자세한 정보는 http://blog.naver.com/sbg10?Redirect=Log&logNo=120009432781 참고
   
    그리드 컴퓨팅(Grid Computing)의 핵심 개념은 전화나 전기, 수도 같은 유틸리티로서의 컴퓨팅이다.
    사용자는 원하는 때 원하는 만큼 정보나 컴퓨팅 작업을 요청하고 받을 수 있게 된다.
   
    그리드 컴퓨팅은 프로세싱, 네트워크 대역폭 및 스토리지지 용량과 같은 분산된 컴퓨팅 자원을 가상화하여 하나의 시스템 이미지를 만들어 사용자 및 응용 프로그램이 다양한 IT 기능에 완벽하게 접근할수 있도록 지원한다.
   
    쉽게 기업내에 산재해 있는 소형 서버들을 연결해 하나의 커다란 컴퓨터처럼 사용하는 개념으로 생각 할 수 있다.
   
    유틸리티 컴퓨팅은 "클라이언트 측면에서" 본 것이다. "서버 측면에서" 보자면(그리드의 이면을 파고들면),  "그리드"는 자원 할당, 정보 공유 그리고 고가용성과 관련된 개념이다.

   
  
   ① 자원할당
    - 자원을 요청하고 필요로 하는 누구든지 원하는 것을 얻을 수 있도록 하는 것
    - 요청이 없는 동안에 자원의 낭비를 막는 것.

   
   ② 정보공유
    - 사용자와 어플리케이션이 필요로 하는 정보는 언제 어디서나 필요에 따라 이용할 수 있도록 해주는 것.
   

   ③ 고가용성
    - 고가용성이란 하나의 노드에 문제가 생긴 경우 다른 노드에서 서비스나 기능을 대신 제공하는 것을 말한다
    - 긴 시간동안 지속적으로 운영이 가능한 시스템이나 컴포넌트로 가용성이란 흔히 "100% 가용" 등과 같이 상대적으로 측정되거나
     또는 "절대 고장나지 않음" 등과 같이 표현될 수 있다.
 
 

  2) GRID 컴퓨팅의 필요성

   ① GRID 컴퓨팅은 소형 서버들을 연결, 고성능을 유지하면서 더욱 많은 자원을 활용 가능 하므로 효율적인 IT 인프라 사용을 위한 좋은 방안이다.

   ② 기존에 사용하던 시스템을 전환할 필요 없이, 기존 인프라스트럭처로부터 GRID 컴퓨팅으로 전환 가능 하다.

   ③ GRID 컴퓨팅은 저렴한 가격으로도 기업의 인프라를 효율적으로 활용할 수 있는 최적의 솔루션이다.
  

  

  3) 오라클 GRID 컴퓨팅
   - 저렴한 다수의 컴퓨팅 자원으로 고가의 컴퓨팅 자원보다 더 높은 성능을 구현할 수 있다.

   - 그리드는 어떤 컴퓨터든, 자원을 항상 최대 용량 만큼 쓰는 것이 아니기 때문에 쉬고 있는 순간에 다른 업무에 활용할수 있도록 빌려준다는 개념으로도 이해할 수 있다.

   - Oracle Database 10g는 Enterprise Grid Computing을 위해 디자인된 최초의 데이터베이스이다.
 
 
  
 2 RAC의 개념
 
  2.1 RAC의 정의
   - Oracle Real Application clusters(RAC)는 Oracle Parallel Server(OPS)의 후속 제품으로 개발되어 Oracle9i 버전부터 기능을 제공 한다.

   - RAC는 동일 데이타베이스(스토리지)를 여러 인스턴스에서 동시에 액세스할 수 있다

   - RAC는 시스템 확장이 가능하기 때문에 결함 허용, 로드 밸런싱 및 향상된 성능을 제공한다.

   - 모든 노드가 동일한 데이타베이스를 액세스하기 때문에 한 인스턴스에서 장애가 발생해도 데이타베이스에 대한 액세스가 손실되지 않는다. 

   - Oracle RAC의 핵심은 공유 디스크 하위 시스템이다.

   - 클러스터의 모든 노드는 클러스터 내의 모든 노드에 대한 데이타, 리두 로그 파일, 제어 파일 및 매개변수 파일을 액세스할 수 있어야 한다.

   - 데이터 디스크는 모든 노드가 데이타베이스를 액세스할 수 있도록 허용하기 위해 전역으로 사용할 수 있어야 한다.


 
  2.2 RAC의 장점

   ① 확장성(자원(CPU/메모리/디스크등)이 부족했을 경우에 대처 할 수 있는 구조)

    - 새로운 업무가 지속적으로 추가되어 서버의 용량이 부족해지는 경우가 발생된다면 클러스터상에 새로운 서버를 유연하게 확장 할 수있고,
      서버를 확장 하더라도 문제가 발생하지 않는다.
   
   ② 고가용성 (장애가 발생해도 시스템 전체가 운용 될 수 있는 구조)

    - 하나의 서버로 구성된 데이터베이스일 경우 데이터베이스 장애가 발생할 경우 복구될때까지 서비스 이용이 불가능 했으나,  RAC의 경우에는 하나의 서버에 장애가 발생하더라도, 나머지 서버에서 지속적인 서비스를 제공할 수 있어 서비스의 중지가 발생하지 않는다.
 
 
 
 3. RAC 구조

   3.1 RAC의 구조

    - 물리적인 하나의 데이터베이스를 여러 대의 서버가 공유하여 사용하는 것.
 
    - 모든 서버들은 같은 데이터를 사용하게 되어 논리적으로는 하나의 시스템을 이용하는 것임.

    - Cache Fusion 기능을 위해 NODE간 High-Speed Interconnect Network는 필수

    

 
reference
- Linux 및 FireWire에 RAC 클러스터 구축 (주)한국오라클
- RAC & Enterprise Manageability Best Practices (주)한국오라클



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

'DB > Oracle 10g 강좌' 카테고리의 다른 글

Oracle 10g 강좌 목차  (0) 2009.10.31
Partition Index  (0) 2009.10.31
Composite Range-List Partitioning  (0) 2009.10.31
Composite Range-Hash Partitioning  (0) 2009.10.31
List Partition  (0) 2009.10.31
Posted by 야동우
,

5.6.1 파티션 인덱스 종류


                                             [그림 2-1] 파티션 인덱스 종류
 


5.6.2 파티션 인덱스 분류 기준
  5.6.2.1. Global / Local
 
 ① Global : 테이블 파티션 키와 인덱스 파티션 키가 서로 다름
  - Global Index는 테이블과 다르게 파티션 되는 경우 입니다.
  - 즉 테이블과 같은 칼럼으로 파티션 되지만, 그 범위가 틀리거나 혹은 다른 칼럼으로 파티션이 이루어지는 경우 입니다.
   

 ② Local : 테이블 파티션 키와 인덱스 파티션 키가 같음
  - 로컬 인덱스란 인덱스를 생성한 테이블과 파티션 된 인덱스가 동일하게 파티션 된 (Equi-Partition) 경우를 나타냅니다.
  - 즉, 인덱스와 테이블은 같은 칼럼에 의해 파티션 되며, 하나의 인덱스 파티션이 테이블 파티션 하나와 대응되며, 대응되는 인덱스 파티션과 테이블 파티션은 각각 같은 범위를 갖게 됩니다.
 

※ Partitioned Table에서는 대부분의 경우 Local Index가 성능이나, 가용성 및 관리의 용이성이 Global Index 보다 우수 합니다. 그러나 업무의 특성 및 기타 Access 의 형태에 따라 Partition Index를 만들고자 하나 Local Index를 생성할 수 없는 경우에 Global Index를 고려 합니다.
 
 
  5.6.2.2. Prefixed / Non-prefixed
 
 ① Prefixed :  인덱스 첫 번째 컬럼이 인덱스 파티션 키와 같음
 
 ② Non-prefixed : 인덱스 첫 번째 컬럼이 인덱스 파티션 키와 다름.
 
 ※ Partitioned Index 생성시 Prefixed/Non-prefixed에 대한 지정은 하지 않으며 위와 같은 Rule로 만들어 졌는지 여부를 DBMS가 확인하여 Dictionary(USER_PART_INDEXES.ALIGNMENT)에 기록하고 관리하게 됩니다
 
 
  앞으로 진행될 Local Prefixed Index, Local non-prefixed Index, Global prefixed Index의 예제는 위에서 설명한 Range Partition 테이블의 예제로 설명을 하겠습니다.

 

-- Range Partition 강좌 때 생성한 sales 테이블
CREATE TABLE sales
    (sales_no NUMBER,
     sale_year INT NOT NULL,
     sale_month INT NOT NULL,
     sale_day INT NOT NULL,
     customer_name  VARCHAR2(30),
     price NUMBER)
       PARTITION BY RANGE (sale_year, sale_month, sale_day)
       (PARTITION sales_q1 VALUES LESS THAN (2005, 01, 01) TABLESPACE ASSM_TBS1,
        PARTITION sales_q2 VALUES LESS THAN (2005, 07, 01) TABLESPACE ASSM_TBS2,
        PARTITION sales_q3 VALUES LESS THAN (2006, 01, 01) TABLESPACE ASSM_TBS3,
        PARTITION sales_q4 VALUES LESS THAN (2006, 07, 01) TABLESPACE ASSM_TBS4 );



5.6.3. Local Prefixed Index
 
 - 위에서 설명한 거와 같이 Local의 의미는 테이블 파티션 키와 인덱스 파티션 키가 같음을 의미 합니다.
 - Prefixed 는 인덱스 첫 번째 컬럼이 인덱스 파티션 키와 같음을 의미 합니다.
 - Range Partition 테이블의 Local Prefixed Index 예제 입니다.


-- Range Partition으로 생성된 sales 테이블에 Local Prefixed Index를 생성한 예제
CREATE INDEX sales_idx01
ON sales(sale_year, sale_month, sale_day) LOCAL
(PARTITION idx_sales_p1 TABLESPACE IDX1,
 PARTITION idx_sales_p2 TABLESPACE IDX2,
 PARTITION idx_sales_p3 TABLESPACE IDX3,
 PARTITION idx_sales_p4 TABLESPACE IDX4 )
 



- Hash Partition 테이블의 Local Prefixed Index 예제 입니다.


-- Hash partition 테이블에서는 STORE IN을 사용하여 인덱스 테이블스페이스를 지정합니다.
-- 위에 예제로 생성된 sales_hash 테이블에 Local Prefixed Index를 생성한 예제
CREATE INDEX sales_hash_idx01 ON sales_hash(sales_no)
LOCAL STORE IN (IDX1, IDX2, IDX3, IDX4);



5.6.4. Local non-prefixed Index
 
 - Index의 첫 번째 컬럼이 파티션 키 컬럼으로 시작하지 않는 Local Index 입니다.
- 파티션 키 컬럼이 Index에 중간에 올 수도 있지만 항상 선두에 오지 않는 한 Non-prefixed index 입니다
- 아래는 Range Partition 테이블의 Local non-Prefixed Index 예제 입니다
 


CREATE INDEX sales_idx02
ON sales(sales_no, sale_year) LOCAL
(PARTITION idx_sales_p1 TABLESPACE IDX1,
 PARTITION idx_sales_p2 TABLESPACE IDX2,
 PARTITION idx_sales_p3 TABLESPACE IDX3,
 PARTITION idx_sales_p4 TABLESPACE IDX4 ) ;




5.6.5 Global prefixed Index
 
 - Global Index는 테이블과 다르게 파티션 되는 경우 입니다. 즉 테이블과 같은 컬럼으로 파티션 되지만, 그 범위가 틀리거나 혹은 다른 컬럼으로 파티션이 이루어지는 경우 입니다.
 
 - Global Index 생성시 인덱스 칼럼의 맨 처음 칼럼을 사용하여 파티션 되면, 생성된 인덱스는 Global Prefixed Index 입니다.
 
 - 다른 칼럼을 사용하여 파티션 되는 경우에는 Global Non-Prefixed Index이지만, 오라클 에서는 Global Prefixed Index만을 지원 합니다.
 
 - Global Index는 항상 인덱스의 맨 앞 칼럼 값만을 이용하여 파티션 됩니다.



-- Range Partition으로 생성된 sales 테이블 sale_year 컬럼에 Global prefixed Index로 생성 예제
CREATE INDEX sales_idx03 ON sales(sale_year)
GLOBAL PARTITION BY RANGE (sale_year)
(PARTITION idx_sales_year_p1 VALUES LESS THAN (2005) TABLESPACE IDX1,
 PARTITION idx_sales_year_p2 VALUES LESS THAN (2010) TABLESPACE IDX2,
 PARTITION idx_sales_year_p3 VALUES LESS THAN (MAXVALUE) TABLESPACE IDX3);





-- Range Partition으로 생성된 sales 테이블 sale_month 컬럼에 Global prefixed Index로 생성 예제
CREATE INDEX sales_idx04 ON sales(sale_month)
GLOBAL PARTITION BY RANGE (sale_month)
(PARTITION idx_sales_month_p1 VALUES LESS THAN (04) TABLESPACE IDX1,
 PARTITION idx_sales_month_p2 VALUES LESS THAN (07) TABLESPACE IDX2,
 PARTITION idx_sales_month_p3 VALUES LESS THAN (10) TABLESPACE IDX3,
 PARTITION idx_sales_month_p4 VALUES LESS THAN (MAXVALUE) TABLESPACE IDX4);




파티션 강좌 참고문헌  

- Oracle® Database Administrator’s Guide 10g Release 1 (10.1)
 - 문서 "Partition Table 과 Index 관리"  김주연  한국오라클 (주) 제품지원실
 - 문서 "인덱스 파티션 설계방법" Reviewed by Oracle Certified Master Korea Community
   (http://www.ocmkorea.com http://cafe.daum.net/oraclemanager)
 - 엔코아 솔루션 웨어하우스 "Partition Table 의 Index" (www.en-core.com)
 - Oracle Technical Bulletins No. 11269 PARTITION TABLE 이란?
 - Oracle Technical Bulletins No. 22103 (V9.2) RANGE LIST PARTITIONING - ORACLE 9.2 ENHANCEMENT



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

'DB > Oracle 10g 강좌' 카테고리의 다른 글

Oracle 10g 강좌 목차  (0) 2009.10.31
RAC(Real Application Cluster)  (0) 2009.10.31
Composite Range-List Partitioning  (0) 2009.10.31
Composite Range-Hash Partitioning  (0) 2009.10.31
List Partition  (0) 2009.10.31
Posted by 야동우
,

5.5.2 Composite Range-List Partitioning

 
 - Range방식을 사용하여 데이터를 Partitioning하고 각각의 파티션 내에서 List 방식을 이용하여 Sub-Partitioning을 하는 방법 입니다.
 
 - Composite Range-Hash method와는 달리 이 방법은 각 row가 어느 서브파티션에 속하게 될지를 조절할 수 있습니다.
 
 - 그러나, multiple subpartition keys는 지원하지 않습니다. 이는 List 파티션이 지원하지 않기 때문이며, 오직 하나의 column만 key partition으로 가능합니다.


 
파티션 테이블 생성


CREATE TABLE emp_range_list
       (EMPNO NUMBER NOT NULL,
        ENAME VARCHAR2(10),
        JOB VARCHAR2(9),
        MGR NUMBER(4),
        HIREDATE DATE,
        SAL NUMBER(7, 2),
        COMM NUMBER(7, 2),
        DEPTNO NUMBER(2))
PARTITION BY RANGE (deptno)
SUBPARTITION BY LIST (job)
(PARTITION emp_p1 VALUES LESS THAN (11)
  (SUBPARTITION sub1_job_p1 VALUES (’MANAGER’) TABLESPACE ASSM_TBS1,
   SUBPARTITION sub1_job_p2 VALUES (’SALESMAN’) TABLESPACE ASSM_TBS2,
   SUBPARTITION sub1_job_p3 VALUES (’ANALYST’) TABLESPACE ASSM_TBS3,
   SUBPARTITION sub1_job_p4 VALUES (’PRESIDENT’, ’CLERK’) TABLESPACE ASSM_TBS4),
 PARTITION emp_p2 VALUES LESS THAN (21)
  (SUBPARTITION sub2_job_p1 VALUES (’MANAGER’) TABLESPACE ASSM_TBS1,
   SUBPARTITION sub2_job_p2 VALUES (’SALESMAN’) TABLESPACE ASSM_TBS2,
   SUBPARTITION sub2_job_p3 VALUES (’ANALYST’) TABLESPACE ASSM_TBS3,
   SUBPARTITION sub2_job_p4 VALUES (’PRESIDENT’, ’CLERK’) TABLESPACE ASSM_TBS4),
 PARTITION emp_p3 VALUES LESS THAN (31)
  (SUBPARTITION sub3_job_p1 VALUES (’MANAGER’) TABLESPACE ASSM_TBS1,
   SUBPARTITION sub3_job_p2 VALUES (’SALESMAN’) TABLESPACE ASSM_TBS2,
   SUBPARTITION sub3_job_p3 VALUES (’ANALYST’) TABLESPACE ASSM_TBS3,
   SUBPARTITION sub3_job_p4 VALUES (’PRESIDENT’, ’CLERK’) TABLESPACE ASSM_TBS4) ,
 PARTITION emp_p4 VALUES LESS THAN (41)
  (SUBPARTITION sub4_job_p1 VALUES (’MANAGER’) TABLESPACE ASSM_TBS1,
   SUBPARTITION sub4_job_p2 VALUES (’SALESMAN’) TABLESPACE ASSM_TBS2,
   SUBPARTITION sub4_job_p3 VALUES (’ANALYST’) TABLESPACE ASSM_TBS3,
   SUBPARTITION sub4_job_p4 VALUES (’PRESIDENT’, ’CLERK’) TABLESPACE ASSM_TBS4)   
);
  



 - deptno를 Range Partition을 하고, 2차로 job 컬럼 값을 List Partition에 의해 분리하여 데이터를 저장 합니다.


 
데이터 조작
 
아래와 같이 데이터를 INSERT 하고 저장된 데이터를 확인해 봅니다.


INSERT INTO emp_range_list VALUES(1, ’SMITH’,  ’CLERK’,     7902, SYSDATE,  800, NULL, 20);
INSERT INTO emp_range_list VALUES(2, ’ALLEN’,  ’SALESMAN’,  7698, SYSDATE, 1600,  300, 30);
INSERT INTO emp_range_list VALUES(3, ’WARD’,   ’SALESMAN’,  7698, SYSDATE, 1250,  500, 30);
INSERT INTO emp_range_list VALUES(4, ’JONES’,  ’MANAGER’,   7839, SYSDATE,  2975, NULL, 20);
INSERT INTO emp_range_list VALUES(5, ’MARTIN’, ’SALESMAN’,  7698, SYSDATE, 1250, 1400, 30);
INSERT INTO emp_range_list VALUES(6, ’BLAKE’,  ’MANAGER’,   7839, SYSDATE,  2850, NULL, 30);
INSERT INTO emp_range_list VALUES(7, ’CLARK’,  ’MANAGER’,   7839, SYSDATE,  2450, NULL, 10);
INSERT INTO emp_range_list VALUES(8, ’SCOTT’,  ’ANALYST’,   7566, SYSDATE, 3000, NULL, 20);
INSERT INTO emp_range_list VALUES(9, ’KING’,   ’PRESIDENT’, NULL, SYSDATE, 5000, NULL, 10);
INSERT INTO emp_range_list VALUES(10, ’TURNER’, ’SALESMAN’,  7698,SYSDATE,  1500,    0, 30);
INSERT INTO emp_range_list VALUES(11, ’ADAMS’, ’CLERK’, 7788,SYSDATE,1100,NULL,20);
INSERT INTO emp_range_list VALUES(12, ’JAMES’,  ’CLERK’,     7698, SYSDATE,   950, NULL, 30);
INSERT INTO emp_range_list VALUES(13, ’FORD’,   ’ANALYST’,   7566, SYSDATE,  3000, NULL, 20);
INSERT INTO emp_range_list VALUES(14, ’MILLER’, ’CLERK’,     7782,  SYSDATE, 1300, NULL, 10);  
COMMIT;

 


  아래와 같이 데이터를 확인해 보면 메인 파티션은 deptno를 기준으로 서브파티션은 job을 기준으로 데이터가 조회 됩니다.


SELECT empno FROM emp_range_list PARTITION (emp_p1); --> 7, 9, 14
SELECT empno FROM emp_range_list SUBPARTITION (sub1_job_p1); --> 7


DBA_PART_TABLES, USER_TAB_PARTITIONS, USER_TAB_SUBPARTITIONS 데이터 사전을 통하여 파티션 테이블 정보를 조회 할 수 있습니다.


 
파티션 추가


ALTER TABLE emp_range_list
   ADD PARTITION emp_p5 VALUES LESS THAN (51)
  (SUBPARTITION sub5_job_p1 VALUES (’MANAGER’) TABLESPACE ASSM_TBS1,
   SUBPARTITION sub5_job_p2 VALUES (’SALESMAN’) TABLESPACE ASSM_TBS2,
   SUBPARTITION sub5_job_p3 VALUES (’ANALYST’) TABLESPACE ASSM_TBS3,
   SUBPARTITION sub5_job_p4 VALUES (’PRESIDENT’, ’CLERK’) TABLESPACE ASSM_TBS4)



좀 더 자세한 파티션 관리는 오라클 문서의 파티션 관리 표를 참고 하시기 바랍니다.
http://download-west.oracle.com/docs/cd/B14117_01/server.101/b10739/partiti.htm#i1007638



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

'DB > Oracle 10g 강좌' 카테고리의 다른 글

RAC(Real Application Cluster)  (0) 2009.10.31
Partition Index  (0) 2009.10.31
Composite Range-Hash Partitioning  (0) 2009.10.31
List Partition  (0) 2009.10.31
Hash Partition  (0) 2009.10.31
Posted by 야동우
,

5.5. Composite Partition 이란


- Composite Partition 은 partition 의 partitioning 입니다.
- Range-Hash PartitioningRange-List Partitioning으로 구분 됩니다.



5.5.1 Composite Range-Hash Partitioning


 - Range 방식을 사용하여 데이터를 Partitioning하고 각각의 Partition 내에서 Hash 방식을 이용하여 Sub-Partitioning을 하는 방법 입니다.
 
 - Range와 Hash 두 Partitioning 방식의 장점을 이용하여 만든 개념 입니다.

 
 ① 파티션 테이블 생성

CREATE TABLE sales_range_hash
    (sales_no NUMBER,
     sale_year INT NOT NULL,
     sale_month INT NOT NULL,
     sale_day INT NOT NULL,
     customer_name  VARCHAR2(30),
     price NUMBER)
       PARTITION BY RANGE (sale_year, sale_month, sale_day)
       SUBPARTITION BY HASH(sales_no)
       SUBPARTITIONS 4
       STORE IN (ASSM_TBS1, ASSM_TBS2, ASSM_TBS3, ASSM_TBS4)
       (PARTITION sales_q1 VALUES LESS THAN (2005, 01, 01),
        PARTITION sales_q2 VALUES LESS THAN (2005, 07, 01),
        PARTITION sales_q3 VALUES LESS THAN (2006, 01, 01),
        PARTITION sales_q4 VALUES LESS THAN (2006, 07, 01) );
 


 - 년, 월, 일을 기준으로 데이터를 Range Partition을 하고, 2차로 sales_no 값을 Hash Partition에 의해 분리
하여 데이터를 저장 합니다.
 
 - 실제 데이터는 년, 월, 일로 분리된 후 Hash 함수에 의해 나누어져 저장 됩니다.
 
 - 어떤 분류에 속하는 지만 알 수 있을 뿐 실제 저장되어 있는 Segment는 개발자나 DBA가 알 수 없습니다



데이터 조작  

아래와 같이 데이터를 INSERT 하고 저장된 데이터를 확인해 봅니다.



INSERT INTO sales_range_hash VALUES(1, 2004, 06, 12, ’scott’, 2500);
INSERT INTO sales_range_hash VALUES(2, 2005, 06, 17, ’jones’, 4300);
INSERT INTO sales_range_hash VALUES(3, 2005, 12, 12, ’miller’, 1200);
INSERT INTO sales_range_hash VALUES(4, 2006, 06, 22, ’ford’, 5200);
INSERT INTO sales_range_hash VALUES(5, 2005, 01, 01, ’lion’, 2200);
COMMIT;
 


데이터가 아래와 같이 범위 분할 방식으로 나누어진 것을 확인 할 수 있습니다.


SELECT sales_no from sales_range_hash PARTITION (sales_q1); --> 1   
SELECT sales_no from sales_range_hash PARTITION (sales_q2); --> 2, 5
SELECT sales_no from sales_range_hash PARTITION (sales_q3); --> 3   
SELECT sales_no from sales_range_hash PARTITION (sales_q4); --> 4
 



파티션 추가
 
sales_range_hash 테이블에 sales_q5 Range-Hash Partition을 추가한 예제 입니다.



ALTER TABLE sales_range_hash ADD PARTITION sales_q5
VALUES LESS THAN (MAXVALUE, MAXVALUE, MAXVALUE)
SUBPARTITIONS 4
STORE IN (ASSM_TBS1, ASSM_TBS2, ASSM_TBS3, ASSM_TBS4);
 



좀 더 자세한 파티션 관리는 오라클 문서의 파티션 관리 표를 참고 하시기 바랍니다.
http://download-west.oracle.com/docs/cd/B14117_01/server.101/b10739/partiti.htm#i1007638




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

'DB > Oracle 10g 강좌' 카테고리의 다른 글

Partition Index  (0) 2009.10.31
Composite Range-List Partitioning  (0) 2009.10.31
List Partition  (0) 2009.10.31
Hash Partition  (0) 2009.10.31
Range Partition  (0) 2009.10.31
Posted by 야동우
,

List Partition

DB/Oracle 10g 강좌 2009. 10. 31. 08:44

5.4.1 List Partition 이란?


 
- 특정 Column의 특정 값으로 Partitioning을 하는 방법 입니다.

 - List partition의 장점은 연관되지 않은 데이터, 순서에 맞지 않는 데이터의 grouping 을 쉽게 할 수 있습니다.

 - 각 값 별로 분포도가 비슷하며, 많은 SQL에서 해당 Column의 조건이 많이 들어오는 경우 유용 합니다.

  
- 각 Partition의 분포도가 현격한 차이가 발생하지 않도록 해야 합니다.

 - 여러 컬럼으로 partition key 생성이 가능하지 않으며 오직 하나의 column으로 구성되어야 합니다.

 - Partition key 값은 NULL 값 또한 명시 가능하며, NULL 값을 포함한 어떠한 값이라도 한번만 명시할 수 있습니다.

 - 대소문자를 구분 함, 범위외 문자 입력 에러 발생.



5.4.2 List Partition 예제


파티션 테이블 생성


 CREATE TABLE emp_list_pt
      
(EMPNO NUMBER NOT NULL,
      
ENAME VARCHAR2(10),
       
JOB VARCHAR2(9),
       
MGR NUMBER(4),
       
HIREDATE DATE,
       
SAL NUMBER(7, 2),
       
COMM NUMBER(7, 2),
       
DEPTNO NUMBER(2))
 PARTITION BY LIST
(JOB)
 (PARTITION emp_list_pt1 VALUES (’MANAGER’) TABLESPACE ASSM_TBS1,
 
 PARTITION emp_list_pt2 VALUES (’SALESMAN’) TABLESPACE ASSM_TBS2,
  
PARTITION emp_list_pt3 VALUES (’ANALYST’) TABLESPACE ASSM_TBS3,
  
PARTITION emp_list_pt4 VALUES (’PRESIDENT’, ’CLERK’) TABLESPACE ASSM_TBS4);
 



데이터 조작

아래와 같이 데이터를 INSERT 하고 저장된 데이터를 확인해 봅니다.

INSERT INTO emp_list_pt VALUES(1, ’SMITH’,  ’CLERK’,     7902, SYSDATE,  800, NULL, 20);
INSERT INTO emp_list_pt VALUES(2, ’ALLEN’,  ’SALESMAN’,  7698, SYSDATE, 1600,  300, 30);
INSERT INTO emp_list_pt VALUES(3, ’WARD’,   ’SALESMAN’,  7698, SYSDATE, 1250,  500, 30);
INSERT INTO emp_list_pt VALUES(4, ’JONES’,  ’MANAGER’,   7839, SYSDATE,  2975, NULL, 20);
INSERT INTO emp_list_pt VALUES(5, ’MARTIN’, ’SALESMAN’,  7698, SYSDATE, 1250, 1400, 30);
INSERT INTO emp_list_pt VALUES(6, ’BLAKE’,  ’MANAGER’,   7839, SYSDATE,  2850, NULL, 30);
INSERT INTO emp_list_pt VALUES(7, ’CLARK’,  ’MANAGER’,   7839, SYSDATE,  2450, NULL, 10);
INSERT INTO emp_list_pt VALUES(8, ’SCOTT’,  ’ANALYST’,   7566, SYSDATE, 3000, NULL, 20);
INSERT INTO emp_list_pt VALUES(9, ’KING’,   ’PRESIDENT’, NULL, SYSDATE, 5000, NULL, 10);
INSERT INTO emp_list_pt VALUES(10, ’TURNER’, ’SALESMAN’,  7698,SYSDATE,  1500,    0, 30);
INSERT INTO emp_list_pt VALUES(11, ’ADAMS’, ’CLERK’, 7788,SYSDATE,1100,NULL,20);
INSERT INTO emp_list_pt VALUES(12, ’JAMES’,  ’CLERK’,     7698, SYSDATE,   950, NULL, 30);
INSERT INTO emp_list_pt VALUES(13, ’FORD’,   ’ANALYST’,   7566, SYSDATE,  3000, NULL, 20);
INSERT INTO emp_list_pt VALUES(14, ’MILLER’, ’CLERK’,     7782,  SYSDATE, 1300, NULL, 10); 
COMMIT;



 아래와 같이 데이터가 파티션 테이블 생성시 지정한 분할 방식으로 저장된 것을 확인 할 수 있습니다.


SELECT empno FROM emp_list_pt PARTITION (emp_list_pt1); --> 4,6,7
SELECT empno FROM emp_list_pt PARTITION (emp_list_pt2); --> 2,3,5,10
SELECT empno FROM emp_list_pt PARTITION (emp_list_pt3); --> 8,13
SELECT empno FROM emp_list_pt PARTITION (emp_list_pt4); --> 1,9,11,12,14
 



파티션 추가

 
추가되는 컬럼 값을 VALUES절 뒤에 기술을 해야 합니다.

  emp_list_pt 테이블에 emp_list_pt5 파티션을 추가하는 예제 입니다. 파티션 데이터는 job 컬럼의 데이터가 ’DBA’ 값을 가진 데이터만 저장 됩니다.


 ALTER TABLE
emp_list_pt
 ADD PARTITION
emp_list_pt5 VALUES (’DBA’) TABLESPACE ASSM_TBS5  NOLOGGING;
 




파티션 삭제

  Range Partition의 파티션 삭제 방법과 동일 합니다. 아래는 emp_list_pt 테이블의 emp_list_pt4 파티션을 삭제하는 예제 입니다.


 ALTER TABLE
emp_list_pt DROP PARTITION emp_list_pt5
 


좀 더 자세한 파티션 관리는 오라클 문서의 파티션 관리 표를 참고 하시기 바랍니다.
http://download-west.oracle.com/docs/cd/B14117_01/server.101/b10739/partiti.htm#i1007638




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

'DB > Oracle 10g 강좌' 카테고리의 다른 글

Composite Range-List Partitioning  (0) 2009.10.31
Composite Range-Hash Partitioning  (0) 2009.10.31
Hash Partition  (0) 2009.10.31
Range Partition  (0) 2009.10.31
Partition Table 이란?  (0) 2009.10.31
Posted by 야동우
,

Hash Partition

DB/Oracle 10g 강좌 2009. 10. 31. 08:44

5.3.1 Hash Partition 이란?


 
- Hash Partition은 Partitioning Key 값에 해시 함수를 적용하여 Data를 분할하는 방식으로 History Data의 관리의 목적 보다는 성능 향상의 목적으로 나온 개념 입니다

 
- Hash Partition 은 Range Partition 으로 만들기 힘든 사항 즉, 조건을 주기 힘든 경우, 각 파티션 이 고르게 나누어지지 않아 밸런스을 유지하기 힘든 경우라고 판단되는 경우에 유리합니다.

 
- Hash Partition 의 경우 각각 다른 파티션에 데이터가 고르게 분산시키기 위해서는 반드시 파티션 의 개수를 명시하여야 하며, 파티션의 수를 2 의 거듭 제곱수 (즉, 2,4,8,16 ….)로 설정하여야 합니다.

- NULL 값은 첫 번째 파티션에 위치하게 됩니다.



5.3.2 Hash Partition
예제

 파티션 테이블 생성
 


 -- 생성 예제 1

 CREATE TABLE sales_hash_exam
   
(sales_no NUMBER,
    
sale_year CHAR(4) NOT NULL,
  
  sale_month CHAR(2) NOT NULL,
    
sale_day CHAR(2) NOT NULL,
    
customer_name  VARCHAR2(30),
    
price NUMBER)
 PARTITION BY HASH
(sales_no)
 PARTITIONS 4
   --> 2 의 거듭제곱수로 지정
 STORE IN
(ASSM_TBS1, ASSM_TBS2, ASSM_TBS3, ASSM_TBS4);
 




-- 생성 예제 2
-- sales_hash1, sales_hash2..와 같이 파티션을 직접 지정 할 수 있다.
-- 하지만 각 파티션에  어떤 데이터가 지정될지 모르므로 무의미 할 수 있다.

 CREATE TABLE sales_hash
   
(sales_no NUMBER,
    
sale_year CHAR(4) NOT NULL,
    
sale_month CHAR(2) NOT NULL,
    
sale_day CHAR(2) NOT NULL,
    
customer_name  VARCHAR2(30),
    
price NUMBER)
 PARTITION BY HASH
(sales_no) 
 
( PARTITION sales_hash1 TABLESPACE ASSM_TBS1,
   
PARTITION sales_hash2 TABLESPACE ASSM_TBS2,
   
PARTITION sales_hash3 TABLESPACE ASSM_TBS3,
   
PARTITION sales_hash4 TABLESPACE ASSM_TBS4);
 


  위의 Partition Table 은 입력되는 sales_no의 값을 가지고 Hash 함수를 이용하여 각 Row가 저장될 Partition을 내부적으로 결정하게 된다.



데이터 조작

  아래와 같이 데이터를 INSERT 하고, 데이터가 저장된 파티션을 확인해 보자.


INSERT INTO sales_hash VALUES(1, 2004, 06, 12, ’scott’, 2500);
INSERT INTO sales_hash VALUES(2, 2005, 06, 17, ’jones’, 4300);
INSERT INTO sales_hash VALUES(3, 2005, 12, 12, ’miller’, 1200);
INSERT INTO sales_hash VALUES(4, 2006, 06, 22, ’ford’, 5200);
INSERT INTO sales_hash VALUES(5, 2005, 01, 01, ’lion’, 2200);
INSERT INTO sales_hash VALUES(6, 2006, 12, 22, ’tiger’, 3300);
COMMIT;
 


  데이터가 오라클 내부 해쉬 알고리즘에 위해서 파티션이 지정 되었음을 알 수 있다


SELECT sales_no FROM sales_hash PARTITION (sales_hash1); --> 6
SELECT sales_no FROM sales_hash PARTITION (sales_hash2); --> 레코드 없음
SELECT sales_no FROM sales_hash PARTITION (sales_hash3); --> 2,5
SELECT sales_no FROM sales_hash PARTITION (sales_hash4); --> 1,3,4
 



좀 더 자세한 파티션 관리는 오라클 문서의 파티션 관리 표를 참고 하시기 바랍니다
http://download-west.oracle.com/docs/cd/B14117_01/server.101/b10739/partiti.htm#i1007638



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

'DB > Oracle 10g 강좌' 카테고리의 다른 글

Composite Range-Hash Partitioning  (0) 2009.10.31
List Partition  (0) 2009.10.31
Range Partition  (0) 2009.10.31
Partition Table 이란?  (0) 2009.10.31
(10gR2)Full UNDO tablespace  (0) 2009.10.31
Posted by 야동우
,

5.2.1 Range Partition 이란?


 - Range Partition은 Column 값 의 범위를 기준으로 하여 행을 분할하는 형태로, 달, 분기 등의 logical 한 범위의 분산에 주로 사용 합니다.

   즉, 정해진 범위에 따라 비슷한 크기로 partition 이 예상되는 곳에 효율적입니다.


 
- Range Partition
을 생성할 때 어느 행을 기준으로 어느 만큼의 값의 범위로 분할 할지를 다음 두 절에서 정의하게 됩니다. 

 
☞ PARTITION BY RANGE (column list..)

       :  기본 Table에서 어느 Column을 기준으로 분할할지를 정합니다.  

  ·VALUES LESS THAN(value list.. ) :
       : 각 Partition이 어떤 값의 범위를 포함 할지 MAX Value값을 정합니다.

  
- PARTITION BY RANGE
절에서 지정 할 수 있는 Column은 한 개의 Column만으로 구성할 할 수도 있고 결합인덱스처럼 여러 개의 Column이 지정될 수 도 있습니다. (최대 16Column을 지원).



5.2.2 Range Partition 예제

 
파티션 테이블 생성


CREATE TABLE sales
   
(sales_no NUMBER,
    
sale_year INT NOT NULL,
    
sale_month INT NOT NULL,
    
sale_day INT NOT NULL,
    
customer_name  VARCHAR2(30),
    
price NUMBER)
      
PARTITION BY RANGE (sale_year, sale_month, sale_day)
      
(PARTITION sales_q1 VALUES LESS THAN (2005, 01, 01) TABLESPACE ASSM_TBS1,
       
PARTITION sales_q2 VALUES LESS THAN (2005, 07, 01) TABLESPACE ASSM_TBS2,
       
PARTITION sales_q3 VALUES LESS THAN (2006, 01, 01) TABLESPACE ASSM_TBS3,
       
PARTITION sales_q4 VALUES LESS THAN (2006, 07, 01) TABLESPACE ASSM_TBS4 );
 
  PARTITION BY RANGE 절에 어떤 column들을 기준으로 하여 Partition을 나눌 것인지 지정을 하고, Partition이 나누어 지는 범위는 VALUES LESS THAN 절에서 지정해 주면 됩니다.



 
데이터 조작

 아래와 같이 INSERT 문장을 실행 하면 파티션 테이블에서 지정한 범위에 따라서 자동으로 파티션이 지정 됩니다.

I
NSERT INTO sales VALUES(1, 2004, 06, 12, ’scott’, 2500);
INSERT INTO sales VALUES(2, 2005, 06, 17, ’jones’, 4300);
INSERT INTO sales VALUES(3, 2005, 12, 12, ’miller’, 1200);
INSERT INTO sales VALUES(4, 2006, 06, 22, ’ford’, 5200);
INSERT INTO sales VALUES(5, 2005, 01, 01, ’lion’, 2200); --> sales_q2
에 데이터가 INSERT
INSERT INTO sales VALUES(6, 2006, 12, 22, ’tiger’, 3300);
COMMIT;

INSERT INTO sales VALUES(6, 2006, 12, 22, ’tiger’, 3300); -->
범위 초과로 ORA-14400 에러 발생
1
행에 오류:
ORA-14400:
삽입된 분할 영역 키와 매핑되는 분할 영역이 없음
 


  각 파티션 마다 어떤 데이터가 INSERT 되었는지는 직접 SELECT 문으로 확인 해 보세요.

 

SELECT sales_no FROM sales PARTITION (sales_q1); --> 1
SELECT sales_no FROM sales PARTITION (sales_q2); --> 2, 5
SELECT sales_no FROM sales PARTITION (sales_q3); --> 3
SELECT sales_no FROM sales PARTITION (sales_q4); --> 4
 



③ 파티션 추가

 - Range Partition
에서 파티션 추가는 새로운 high 값을 기술해야 합니다.
 - MAXVALUE partition
이 존재하면 추가가 불가능 합니다.

sales
파티션 테이블에 새로운 파티션 sales_q5를 추가하는 예제 입니다.
 

 ALTER TABLE
sales
 ADD PARTITION sales_q5 VALUES LESS THAN (MAXVALUE, MAXVALUE, MAXVALUE )
 TABLESPACE ASSM_TBS5;
 


 
④ 파티션 삭제

 - Range, List 파티션만 가능 합니다.
 - 하나의 파티션은 반드시 남아 있어야 합니다.
 - 한번의 하나의 파티션만 삭제 가능 합니다. 여러 개의 파티션을 삭제하고자 할 때는 삭제 문장을 여러 번 실행 시켜야 합니다.

sales
테이블의 sales_q5 파티션을 삭제하는 예제 입니다.

ALTER TABLE
sales DROP PARTITION sales_q5;
 



⑤ 파티션 이름 변경

  sales 테이블의 sales_q4 파티션 이름을 sales_four로 변경하는 예제 입니다.

ALTER TABLE
sales RENAME PARTITION sales_q4 TO sales_four;
 



⑥ 파티션의 병합(MERGE)

 - 파티션 병합은 두 파티션의 데이터를 합치고, 하나의 파티션을 DROP 합니다.
 
- Hash Partition, Subpartition
MERGE 작업을 할 수 없습니다.

 sales_q1
파티션과 sales_q2 파티션을 sales_q2 파티션으로 병합하는 예제 입니다.
  ALTER TABLE sales
  MERGE PARTITIONS
sales_q1, sales_q2 INTO PARTITION sales_q2
   UPDATE INDEXES; --> Local Index를 갱신
 



⑦ 파티션의 분할(SPLIT)

 
 - SPLIT
작업은 하나의 파티션을 두 개의 새로운 파티션으로 분할 합니다.
  - Hash Partition, Subpartition
SPLIT 작업을 할 수 없습니다.

 sales
파티션 테이블의 sales_q2 파티션을 (2005,01,01) 값을 기준으로 sales_q1 sales_q2로 파티션을 분할하는 예제 입니다.

 ALTER TABLE
sales
 SPLIT PARTITION
sales_q2 AT (2005, 01, 01)
   INTO (PARTITION sales_q1 TABLESPACE ASSM_TBS1,
             
PARTITION sales_q2 TABLESPACE ASSM_TBS2)
 



⑧ 파티션의 변경(EXCHANGE)

 -
파티션의 EXCHAGEN는 파티션 데이터를 일반테이블로 생성하는 작업입니다.
   물론 일반 테이블의 데이터를 파티션 테이블의 데이터로 생성 할 수도 있습니다.

  아래 예제는 파티션 테이블의 데이터를 일반 테이블로 생성하는 예제 입니다.

  --
파티션 데이터를 일반테이블로 이동하기 위한 테이블을 생성 합니다.

 CREATE TABLE sales_ex

   
(sales_no NUMBER,

     sale_year INT NOT NULL,
     sale_month INT NOT NULL,
     sale_day INT NOT NULL,
     customer_name  VARCHAR2(30),
     price NUMBER)
     TABLESPACE ASSM_TBS1;


-- 파티션 데이터를 일반 테이블로 변경 합니다.
  ALTER TABLE sales
    EXCHANGE PARTITION sales_q1 WITH TABLE sales_ex;


-- 파티션 테이블의 데이터를 조회 해봅니다.
  SELECT sales_no FROM sales PARTITION (sales_q1); --> 선택된 레코드가 없습니다.


-- 파티션 데이터를 이동한 일반 테이블의 데이터를 조회 해봅니다.
SELECT sales_no FROM sales_ex;  --> 1
 



⑨ 파티션의 테이블스페이스 변경

   sales 테이블의 sales_q3 파티션의 테이블스페이스를 ASSM_TBS5로 변경하는 예제 입니다.

  ALTER TABLE
sales MOVE PARTITION sales_q3 TABLESPACE ASSM_TBS5;
 



⑩ 파티션 데이터 TRUNCATE

   sales 테이블의 sales_q3 파티션을 TRUNCATE 하는 예제 입니다.

 ALTER TABLE
sales TRUNCATE PARTITION sales_q3;
 




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

'DB > Oracle 10g 강좌' 카테고리의 다른 글

List Partition  (0) 2009.10.31
Hash Partition  (0) 2009.10.31
Partition Table 이란?  (0) 2009.10.31
(10gR2)Full UNDO tablespace  (0) 2009.10.31
Temporary Tablespace Group  (0) 2009.10.31
Posted by 야동우
,

5.1.1 파티션 테이블이란 ?
 
- Partitioning(분할)은 용량이 큰(지속적으로 증가하는) Table들을 Partition이라는 보다 작은 단위로 나눔으로써 성능이 저하되는 것을 방지하고 관리를 보다 수월하게 하고자 하는 개념 입니다.
 
- 각 Partition 은 별개의 Segment에 저장 되어 개별적으로 관리 가능하며, 다른 partition 에 독립적이기 때문에 더 나은 성능을 가져 옵니다.
 
  - 각 Partition은 열(Column)과 제약조건에 대한 정의를 공유하지만 별도의 SEGMENT로 저장되어 물리적인 속성인 PCTFREE, PCTUSED, TABLESPACE 및 STORAGE PARAMETER등은 다르게 지정할 수 있습니다.
 
  - Partition Table과 Index 는 VLDB(Very Large Databases) 즉, Data Warehouse(DW)시스템과 의사결정 시스템의 경우 성능과 관리에 많은 향상을 가져 옵니다.
 
  - Partition의 종류에는 Range partition, Hash partition, List partition, Composite partition이 있습니다.
 

 
5.1.2 파티션 테이블 장점
 
  - 데이터 액세스시 범위를 액세스 범위를 줄여 Performance 향상을 가져올 수 있습니다.

  - 여러 분할 영역으로 관리되어 데이터 훼손 가능성이 감소 되고, I/O 성능 향상을 가져 올 수 있습니다.

  - 각 분할 영역을 독립적으로 백업하고 복구 할 수 있습니다.







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

'DB > Oracle 10g 강좌' 카테고리의 다른 글

Hash Partition  (0) 2009.10.31
Range Partition  (0) 2009.10.31
(10gR2)Full UNDO tablespace  (0) 2009.10.31
Temporary Tablespace Group  (0) 2009.10.31
강좌 리스트  (0) 2009.10.29
Posted by 야동우
,

PURPOSE


10gR2 에서 UNDO tablespace 을 NO AUTOEXTEND로 생성한 경우 ,
transaction 이 실행중인 database 에서는 UNDO tablespace 가
FULL인 현상을 보게 됩니다.
이는 10gR2 에서 max retention 을 보장하는 undo retention 의
메카니즘이 소개되어 autoextend off 인 경우의 UNDO tablespace
에서 나타나는 현상입니다.
dba_undo_extents 에서 많은 UNEXPIRED undo segment 가 보이는 것이
확인되고 UNDO tablespace 가 100% full 인것처럼 나타나는 현상을 볼 수
있으며 그럼에도 불구하고 ORA-1555 나 ORA-30036 에러는 발생하지 않습니다.

Explanation


다음과 같이 많은 UNEXPIRED undo segment 가 조회됩니다.

SQL> select count(status) from dba_undo_extents where status = 'UNEXPIRED';

COUNT(STATUS)

463

SQL> select count(status) from dba_undo_extents where status = 'EXPIRED';

COUNT(STATUS)

20

SQL> select count(status) from dba_undo_extents where status = 'ACTIVE';

COUNT(STATUS)

21

dba_free_space 을 조회 결과 UNDO tablespace 의 free space 가 존재합니다.

SUM(BYTES)/(1024*1024) TABLESPACE_NAME


---------------------
3 UNDOTBS1
58.4375 SYSAUX
3 USERS3
4.3125 SYSTEM
103.9375 USERS04

Transaction 이 실행되면 UNDO tablespace 에 free space 가 조회되지 않는
FULL 인것처럼 보입니다.

SUM(BYTES)/(1024*1024) TABLESPACE_NAME
----------------
58.25 SYSAUX
98 USERS3
4.3125 SYSTEM
87.9375 USERS04


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
다음은 AUM 에서의 Undo Block 할당 알고리즘은 다음과 같습니다.

1. current extent 에 free block 이 있으면 다음 free block 이
할당됩니다.
2. 그러나, free block 이 없으면, next extent 가 expired 되었다면 next extent 을
warp 한후 그 next extent 의 처음 block 을 return 합니다.
3. 만약 next extent 가 expired 되지 않았다면 UNDO tablespace 로부터 먼저
space 을 찾습니다. 이때 free extent 가 존재한다면 이를 transaction table 에
할당하고 해당 next extent 의 첫번째 block 을 return 합니다.
4. 만약 UNDO tablespace 에 free extent 가 없다면 offline 된 transaction table
에서 steal 합니다.
offline 된 transaction table 에서 extent 을 deallocate 한후 이를
current transaction table 에 add한후 그 add 한 extent 의 첫번째 free block 을
return 합니다.
5. offline 된 transaction table 에서 찾을수 없으면 , online 되어 있는
transaction table 에서 steal 합니다. offline 된 transaction table 에서 extent 을
deallocate 한후 이를 current transaction table 에 add한후 , 그 add 한 extent 의
첫번째 free block 을 return 합니다.
6. 1번~5번 까지 하여도 free block 을 얻지 못하면 이제 UNDO tablespace 의 file 을
extend 합니다.
file 이 extend 된다면 이후 current transaction table 에 extent 을 add 한후 ,
그 extent 의 첫번째 free block 을 return 합니다.
7. 6번 에서 UNDO tablespace 의 file 을 extend 하지 못했다면 , 자기의 transaction table
에서 unexpired 된 extent 을 재사용합니다. 그런데 이때 모든 extent 가 busy 하다면
즉 모두 uncommitted 된 정보라면 8번으로 갑니다. 아니라면 wrap 하여 unexpired 된
extent 을 사용합니다.
8. offline 된 transaction table 에서 unexpired 된 extent 을 steal 합니다. 이것이
실패한다면 online 된 transaction table 에서 unexpired 된 extent 을 steal 합니다.
9. 8 번까지 수행하고도 free block 을 얻지 못하면 이때서야 오라클에서는
"ORA-30036 unable to extend segment by %s in undo tablespace '%s' " 에러를
뿌리며 실패합니다.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

fixed size UNDO tablespace 라 함은 autoextend 가 off 라 datafile 을 자동으로
더 이상 확장할 수 없음을 말합니다.
autoextend 가 off 인 경우 10.2 부터는 max retention 이 36 시간 입니다.
undo_retention 을 900 초(15 분) 으로 설정을 한다고 해도 10gR2 에서는
max retention 이 36 시간이라 이에 해당하는 undo extent 을 UNEXPIRED 으로 만듭니다.
그러나 이것이 가용한 undo extent 가 없다는 것이 아니고 , transaction 이 실행되게 되면
UNEXPIRED undo segment 을 재사용하게 됩니다.

References


< Note 413732.1 - Full UNDO Tablespace In 10gR2 >


Written by knam in Forums.Oracle.com

'DB > Oracle 10g 강좌' 카테고리의 다른 글

Hash Partition  (0) 2009.10.31
Range Partition  (0) 2009.10.31
Partition Table 이란?  (0) 2009.10.31
Temporary Tablespace Group  (0) 2009.10.31
강좌 리스트  (0) 2009.10.29
Posted by 야동우
,