파티션의 개념
데이터베이스 기술의 발전과 컴퓨터의 활용이 증가하면서 기업이 축적하고 있는 데이터량도 상상할 수 없을 정도로 방대하게 증가하게 되었다. 즉, H/W와 S/W 기술의 발전은 사용자로부터 더 많은 정보요구를 수용하게 되었고, 이렇게 축적된 정보량은 H/W와 S/W의 기술을 위협할 정도로 기하급수적으로 증가하게 되면서 이러한 대용량의 데이터를 안전하고 효율적으로 관리하기 위한 방안이 시급하게 요구되기 시작하였다.
요즈음 많은 기업들의 데이터베이스 관리자들은 수백기가바이트에서 테라 바이트에 이를 정도로 방대한 데이터를 관리하기 위해 골머리를 앓고있다. 데이터 액세스 효율성, 안정성 그리고 백업 등등 대용량의 데이터를 관리하기 위해 생각해야 하는 것이 한 두 가지가 아니다.
심각한 것은 대용량 데이터 베이스를 유지하고 관리하는 작업이 각 운영자가 단순히 열심히 철야를 하면서 유지하는 차원을 넘어서고 있다는 것이다. 그런데 대용량 데이터 베이스의 실체를 따져보면 실제 증가되는 데이터는 몇 개의 중요 Transaction Table에서 발생되고 있으며 그 이외의 기본 Table에서 데이터의 증가는 아주 미미한 정도다. 기업의 운영을 위한 기본 형태는 이미 정해져 있고 사업방향 및 운영방향에 따라 조금씩 추가되거나, 변경되는 정도 이므로 기본 Table에서 데이터의 급격한 증가는 발생하지 않는다. 그러나 기업의 활동상황을 표현,기록하는 Action Table들은 기업이 영업활동을 계속함에 따라 더욱더 지속적으로 증가하고 있다.
기업에서 운영하는 데이터 베이스의 대부분의 형태는 기본 Table을 중심으로 하여 영업(운영) 활동(Transaction)을 기록하고 관리하는 작업이다. 이 Transaction을 관리하는 Action Table은 비록 Table수에 있어서는 전체 데이터 베이스에서 차지하는 비중은 작지만 대부분의 업무가 이들을 경유하게 되고 데이터의 용량에 있어서도 거의 대부분을 차지하게 되므로 이들의 관리 여하에 따라 전체 데이터 베이스의 성능 및 관리작업이 심각한 영향을 받을 수 있다.
Partitioning(분할)은 이렇게 용량이 큰(지속적으로 증가하는) Table들을 Partition이라는 보다 작은 단위로 나눔으로써 성능이 저하되는 것을 방지하고 관리를 보다 수월하게 하고자 하는 개념이다.
현재 대용량을 다루고 있는 기업들 조차도 파티션을 적극적으로 활용하고 있지 않지만 조만간 파티션은 데이터베이스 기능 중에서 가장 많이 활용되고 가장 중요한 기능으로 자리매김을 하게 될 것이다. 본 연재에서 모든 DBMS의 파티션 기능을 다룰수 없으므로 오라클에서 제공하고 있는 파티션을 중심으로 아래와 같이 8회에 걸쳐 연재하고자 한다.
1회 : 파티션의 개념 및 소개 (본글)
2회 : 파티션키의 선정
3회 : 파티션 인덱스
4회 : 파티션의 관리
5회 : 파티션 활용 및 제한사항
6회 : 파티션 병렬처리
7회 : 파티션의 하드웨어적 관리
8회 : 파티션 확장
1. 파티션의 특징
Oracle에서 Table이나 Index에서 Partitioning(분할)을 하게 되면 하나의 Table이 동일한 논리적 속성을 공유하는 여러 개의 단위(Partition)로 나누어 지게 된다. 각 Partition은 열(Column)과 제약조건에 대한 정의를 공유하지만 별도의 SEGMENT로 저장되어 물리적인 속성인 PCTFREE, PCTUSED, INITRANS, MAXTRANS, TABLESPACE 및 STORAGE PARAMETER등은 다르게 지정할 수 있습니다. 이러한 특성으로 인해 Partitioned Table은 다음과 같은 장점이 있습니다.
Data 액세스시 범위를 액세스 범위를 줄여 Performance 향상을 가져올 수 있다.
여러 분할 영역으로 나눔으로써 전체 데이터의 훼손 가능성이 감소 하고, Data가용성이 향상된다.
각 분할 영역을 독립적으로 백업하고 복구할 수 있다.
Disk Striping으로 I/O Performance를 향상(Disk 암에 대한 경합의 감소)시킬 수 있다.
Oracle에서 Partition기법은 Version 8.0에서 처음 도입되었고, 이전 Version인 Oracle 7.3는 Partition View만을 지원하였다. Partition View는 큰 Table을 동일한 Template을 가진 여러 개의 다른 Table로 분할하고, Union All을 사용하여 View에서 묶은 형태다. 그러나 Partition View의 경우 관리의 어려움, 활용성의 부족, 성능등에 대한 문제점으로 인하여 잘 이용되지 않는 편이다.
Oracle에서 제공하는 Partitioning 방식에는 Range Partitioning (범위분할) , Hash Partitioning (해시분할), Composite Partitioning (조합분할) 의 세가지 Partitioning 방식이 있으며 Version 8.0에서는 Range Partitioning (범위분할) 만 지원되었으나 Oracle8i에서부터 Hash Partitioning (해시분할)과 Composite Partitioning (조합분할)을 지원하고 있다.
Range Partitioning (범위분할) : 지정한 열의 값을 기준으로 분할
Hash Partitioning (해시분할) : 해시 함수에 따라 데이터를 분할
Composite Partitioning (조합분할) : 범위분할에 의해 데이터를 분할한 다음 해시 함수를 적용하여 다시 분할하는 방식
2. 파티션의 종류
2-1. Range Partitioning
Range Partition(범위 분할)은 Column value의 범위를 기준으로 하여 행을 분할하는 형태로, 테이블 또는 인덱스에 어느 열을 기준으로 분할 할지를 지정하고, 각 분할 영역에서 포함할 Data의 영역을 Define하여 분할하는 방식으로 주로 Historical Data를 관리하는 Table에 적용할 때 유용하게 사용될 수 있다.
간단히 예를 들자면 "매출"이라는 Table이 있고 여기에는 몇 년 동안 축적된 자료가 쌓여 있다고 가정해 보자. 우리는 이것을 최근 5년간의 Data만 DB상에서 관리하고 그 이전의 Data는 다른 매체로 BackUp을 받으려고 하며, 또한 주로 Access 되는 대부분의 형태는 금년 및 전년도 Data가 대부분일 때, 우리는 이것은 각 년도별로 또는 각 월별로 분할하여 관리기간 이전 Data만 Backup하여 보관하고 현재 주로 액세스되는 Data를 조회하는 Application의 SQL 액세스 Path를 조정하여 전체 Data가 아닌 최근 정보를 가지고 있는 Partition만을 액세스 하도록 하여 액세스 성능을 향상 시키는 것을 고려해 볼 수 있다.
굳이 Partition을 사용하지 않더라도 많은 Site에서 Partition의 개념을 기존 Table에 적용( 매출_1999, 매출_1998, 매출_1997,… 과 같이 년도별로 분할된 Table을 생성하여 저장)하여 사용하고 있지만 사용상에 불편한 점이 많고 액세스 하는 SQL이 복잡해지는 단점이 있었다. Range Partition은 DBMS가 이러한 기능을 지원함으로써 보다 편리하게 사용할 수 있도록 하기 위해 만들어 졌다.
Range Partition을 할 때 어느 행을 기준으로 어느 만큼의 값의 범위로 분할 할지를 다음 두 절에서 정하게 된다.
PARTITION BY RANGE ( column_list ) : 기본 Table에서 어느 Column을 기준으로 분할할지를 정함.
VALUES LESS THAN ( value_list ) : 각 Partition이 어떤 값의 범위를 포함 할지 Upper Bound를 정함.
PARTITION BY RANGE에 나타나는 column_list를 Partitioning column이라고 하고 이 값이 Partitioning Key를 형성합니다. 이 Partitioning column은 한 개의 Column만으로 구성할 할 수도 있고 결합인덱스처럼 여러 개의 Column이 지정될 수 도 있습니다(최대 16개 Column을 지원). 여기에 나열된 Column의 값을 기준으로 하여 Table을 나누겠다는 의미이다.
VALUES LESS THAN절에서 나타나는 value_list는 Column_list에 표현된 Partitioning Column들에 할당되어 각 Partition의 영역(범위)을 나타내는 값들 이다. 여기서 나타내는 값은 Upper Limit를 표현 하도록 되어 있다. 즉 여기 지정된 값 보다 작은 값들을 저장하겠다는 의미가 된다.
즉 두절이 나타내는 의미는 PARTITION BY RANGE절에는 내가 어떤 column들을 기준으로 하여 Partition을 나눌 것인지 지정하게 되고, 각 Partition이 나누어 지는 범위는 VALUES LESS THAN 절에서 지정하여 주는 것이다.
아래의 Table 생성 Script는 1997년 Sales Data를 가지고 있는 Table Sales_1997을 분기별로 Partition을 수행하는 예다.
CREATE TABLE TS_SALES_1997_RANGE (
SERIAL NUMBER NOT NULL,
CODE VARCHAR2(4),
SALE_YEAR VARCHAR2(4),
SALE_MONTH VARCHAR2(2),
SALE_DAY VARCHAR2(2),
PRICE NUMBER ,
CONSTRAINT TS_SALES_1997_RANGE_PK
PRIMARY KEY ( SERIAL ) USING INDEX
TABLESPACE PKIS_DATA2 PCTFREE 10
STORAGE ( INITIAL 256K NEXT 256K PCTINCREASE 50 ))
TABLESPACE PKIS_DATA2 PCTFREE 5 PCTUSED 40
INITRANS 1 MAXTRANS 255
STORAGE (
INITIAL 2048K NEXT 1024K PCTINCREASE 0
MINEXTENTS 1 MAXEXTENTS 121 )
NOCACHE
PARTITION BY RANGE ( SALE_YEAR, SALE_MONTH, SALE_DAY )
( PARTITION TS_SALES_1997_RANGE_Q1 VALUES LESS THAN ('1997', '04', '01' ),
PARTITION TS_SALES_1997_RANGE_Q2 VALUES LESS THAN ('1997', '07', '01' ),
PARTITION TS_SALES_1997_RANGE_Q3 VALUES LESS THAN ('1997', '10', '01' ),
PARTITION TS_SALES_1997_RANGE_Q4 VALUES LESS THAN ('1998', '01', '01' )
TABLESPACE PKIS_DATA1 PCTFREE 10 PCTUSED 40
INITRANS 1 MAXTRANS 255
STORAGE ( INITIAL 1M NEXT 1M PCTINCREASE 0
MINEXTENTS 1 MAXEXTENTS 121 ) );
Primary Key 는 물론 Table 생성시 지정하지 않고 Table 생성 후 또는 Data Migration후 아래와 같이 지정하여 사용할 수 도 있다.
ALTER TABLE TS_SALES_1997_RANGE
ADD CONSTRAINT TS_SALES_1997_RANGE_PK PRIMARY KEY ( SERIAL )
USING INDEX
TABLESPACE PKIS_DATA2 PCTFREE 10
STORAGE ( INITIAL 256K NEXT 256K PCTINCREASE 50 );
위와 같이 Table을 Partitioning하는 경우 Base Table "TS_SALES_1997_RANGE"에 지정된 물리적 속성 및 Storage Parameter가 Table "TS_SALES_1997_RANGE"에 적용되는 것은 아니다.
"TS_SALES_1997_RANGE"은 Table이지만 실제 Segment를 갖지는 않는다. 여기서 지정한 물리적 속성들은 각 Partition들이 생성될 때 개별적으로 물리적 속성을 지정하지 않으면( Partition TS_SALES_1997_RANGE_Q1 ~ TS_SALES_1997_RANGE_Q3 ) TS_SALES_1997_RANGE에서 지정한 속성 값을 적용 받게 되는 것이다. 각 Partition별로 물리적인 속성을 지정하고자 하는 경우에는 Partition TS_SALES_1997_RANGE_Q4와 같이 별도로 지정해 주어야 한다.
그러므로, 위의 Script를 이용하여 Table을 생성하면 Partitioned Table TS_SALES_1997_RANGE_Q1 ~ TS_SALES_1997_RANGE_Q3은 Tablespace PKIS_DATA1에 생성이 되고, Partitioned Table TS_SALES_1997_RANGE_Q4는 TableSpace PKIS_DATA2에 생성된다.
2-2. Hash Partitioning
해시분할은 Partitioning columns의 Partitioning Key 값에 해시 함수를 적용하여 Data를 분할하는 방식으로 History Data의 관리의 목적 보다 성능 향상의 목적으로 나온 개념이다..
이력 Data의 범위분할 적용에서 나타나는 단점, 즉 각 Bound(범위)가 포함하는 Data의 양이 일정하지 않아 분포도가 일정하지 않고 각 Partition의 Size가 다르게 나타나는 것을 개선, 일정한 분포를 가진 Partition으로 나누고 균등한 Data 분포도를 이용한 병렬처리로 Performance를 보다 향상 시키고자 하는 개념이다.
다음은 Table을 해시분할 하는 것으로 해시분할의 모든 Partition은 동일한 물리적 특성을 가지므로 분할 영역에 대해 지정할 수 있는 유일한 속성은 Tablespace뿐이다.
아래의 Table 생성 Script는 1997년 Sales Data를 가지고 있는 Table Sales_1997을 4개의 Partition으로 분리하는 Hash Partition Table을 생성 Script 다.
CREATE TABLE TS_SALES_1997_HASH (
SERIAL NUMBER NOT NULL,
CODE VARCHAR2(4),
SALE_YEAR VARCHAR2(4),
SALE_MONTH VARCHAR2(2),
SALE_DAY VARCHAR2(2),
PRICE NUMBER ,
CONSTRAINT TS_SALES_1997_HASK_PK
PRIMARY KEY ( SERIAL )
USING INDEX
TABLESPACE PKIS_DATA2 PCTFREE 10
STORAGE ( INITIAL 256K NEXT 256K PCTINCREASE 50 ) )
TABLESPACE PKIS_DATA2
PARTITION BY HASH ( SALE_YEAR, SALE_MONTH, SALE_DAY )
( PARTITION TS_SALES_1997_HASH_Q1 ,
PARTITION TS_SALES_1997_HASH_Q2 ,
PARTITION TS_SALES_1997_HASH_Q3 ,
PARTITION TS_SALES_1997_HASH_Q4
TABLESPACE PKIS_DATA1 );
Primary Key 는 물론 Table 생성시 지정하지 않고 Table 생성 후 또는 Data Migration후 아래와 같이 지정하여 사용할 수 도 있다.
ALTER TABLE TS_SALES_1997_HASH
ADD CONSTRAINT TS_SALES_1997_HASH_PK PRIMARY KEY ( SERIAL )
USING INDEX
TABLESPACE PKIS_DATA2 PCTFREE 10
STORAGE ( INITIAL 256K NEXT 256K PCTINCREASE 50 );
위의 Script에 의해 생성된 Partition Table 은 입력되는 SALE_YEAR, SALE_MONTH, SALE_DAY 세 값을 가지고 Hash 함수를 이용하여 각 Row가 저장될 Partition을 내부적으로 결정하게 된다.
Partition Table TS_SALES_1997_HASH_Q1 ~ TS_SALES_1997_HASH_Q3는 Base Table에서 지정한 Tablespace PKIS_DATA2에 저장되고, TS_SALES_1997_HASH_Q4는 따로 지정한 Tablespace PKIS_DATA1에 저장됩니다.
Partition TS_SALES_1997_HASH_Q1에 저장되는 Data는 반드시 1/4분기의 Data가 입력되어 있지는 않습니다. Range Partition에서는 사용자가 각 값이 입력될 Partition을 지정해 주었으므로 TS_SALES_1997_RANGE_Q1에 정확히 1/4분기의 DATA가 입력되어 있습니다. 그러나 Hash Partition에서는 어떤 값이 어느 Partition에 저장되라고 지정한 것이 아니라, 전체의 Data를 4개의 Partition으로 나누어 저장하라고 만 지정한 것이다. 그러므로 DBMS는 PARTITION BY HASH절에 지정한 column 값들의 조합을 이용하여 자신의 Logic에 의해 4개의 Partition에 들어갈 값을 정하고 나누어 저장하게 된다. 특정 Partition을 정하여 전체 Data를 찾아보면 다양한 일자의 Data가 저장되어있음을 알 수 있다.
분할 영역을 분할, 삭제 및 병합하는 것은 개념적으로 해시 분할 영역에서는 적용되지 않는다. 그러나 ALTER TABLE 에서 ADD 또는 COALESCE를 사용하여 분할영역의 수를 증가 시키거나 감소시킬 수 있다. 또한 ALTER TABLE EXCHANGE PARTITION 을 사용하여 HASH PARTITION 이나 SUBPARTITION 을 NON-PARTITIONED으로 또는 그 반대로 전환할 수 있다.
2-3. Composite Partitioning
조합분할은 범위 방식을 사용하여 데이터를 분할하고 각각의 분할 영역 내에서 해시 방식을 사용하여 하위를 분할하는 방식으로 이 방식은 Partition Level에서 Historical Data 분할을 지원하고 SubPartition Level에서 병렬처리를 지원하는, 범위분할과 해시분할이 조합된 분할 방식을 말한다.
조합분할은 Range와 Hash 두 Partitioning 방식의 장점을 이용하여 만든 개념으로 다음과 같은 작업상의 이점을 얻을 수 있다.
범위분할의 장점인 관리의 용이성을 제공한다.
해시분할의 이점인 데이터의 배치 및 병렬화를 제공한다.
하위분할영역에 특정 Tablespace의 이름을 지정할 수 있다.
동일한 Tablespace에 저장된 SubPartition영역에 Local Index를 구축 할 수 있다.
범위분할에서 Base Table은 단지 논리적 구조이며 실제 Data는 분할영역(Partition Table)에 저장된 것과 같이, 조합분할에서도Base Table 및 Partition Table은 단지 분할을 위한 논리적인 구조이며 Data의 저장은 가장 말단인 SubPartition영역에 저장된다.
다음 예는 조합분할을 사용하여 테이블을 생성하는 SQL이다.
CREATE TABLE TS_SALES_1997_COMP (
SERIAL NUMBER NOT NULL,
CODE VARCHAR2(4),
SALE_YEAR VARCHAR2(4),
SALE_MONTH VARCHAR2(2),
SALE_DAY VARCHAR2(2),
PRICE NUMBER ,
CONSTRAINT TS_SALES_1997_COMP_PK
PRIMARY KEY ( SERIAL )
USING INDEX
TABLESPACE PKIS_DATA2 PCTFREE 10
STORAGE ( INITIAL 256K NEXT 256K PCTINCREASE 50 ) )
TABLESPACE PKIS_DATA2
PCTFREE 5 PCTUSED 40
INITRANS 1 MAXTRANS 255
STORAGE ( INITIAL 2048K NEXT 1024K PCTINCREASE 0
MINEXTENTS 1 MAXEXTENTS 121 )
PARTITION BY RANGE ( SALE_YEAR, SALE_MONTH )
SUBPARTITION BY HASH ( SALE_DAY )
SUBPARTITIONS 8 STORE IN ( PKIS_DATA1, PKIS_DATA2 )
( PARTITION SALES_1997_COMP_Q1 VALUES LESS THAN ('1997', '04'),
PARTITION SALES_1997_COMP_Q2 VALUES LESS THAN ('1997', '07')
STORE IN ( PKIS_IDX1, PKIS_IDX2 ) ,
PARTITION TS_SALES_1997_COMP_Q3 VALUES LESS THAN ('1997', '10')
( SUBPARTITION SALES_1997_COMP_Q3_S1 TABLESPACE PKIS_DATA1,
SUBPARTITION SALES_1997_COMP_Q3_S2 TABLESPACE PKIS_DATA2,
SUBPARTITION SALES_1997_COMP_Q3_S3 TABLESPACE PKIS_IDX1,
SUBPARTITION SALES_1997_COMP_Q3_S4 TABLESPACE PKIS_IDX2 ,
SUBPARTITION SALES_1997_COMP_Q3_S5 TABLESPACE PKIS_DATA2 ,
SUBPARTITION SALES_1997_COMP_Q3_S6 TABLESPACE PKIS_DATA2 ,
SUBPARTITION SALES_1997_COMP_Q3_S7 TABLESPACE PKIS_IDX2 ,
SUBPARTITION SALES_1997_COMP_Q3_S8 TABLESPACE PKIS_IDX2 ) ,
PARTITION TS_SALES_1997_COMP_Q4 VALUES LESS THAN ('1998', '01')
TABLESPACE PKIS_IDX2
PCTFREE 10 PCTUSED 40
INITRANS 1 MAXTRANS 255
STORAGE ( INITIAL 1M NEXT 1M PCTINCREASE 0
MINEXTENTS 1 MAXEXTENTS 121 ) );
위에서 제시한 Composite Partition Table을 생성하는 Script는 우선 PARTITION BY RANGE ( SALE_YEAR, SALE_MONTH ) 절에 명시된 SALE_YEAR, SALE_MONTH를 Partition Key로 하여 4개의 Range로 분할을 한 다음. SUBPARTITION BY HASH ( SALE_DAY ) 에 의해 범위분할 내에서 입력되는 SALE_DAY를 Hash 함수를 이용하여 다시 8개의 SubPartition으로 분할, 총 32개의 SubPartition 영역으로 나누는 Composite Partitioned Table을 생성한다.
Dictionary USER_OBJECTS에 Object_name에 새로 생성한 TS_SALES_1997_COMP을 조건으로 부여하여 조회해 보면, 위에서 설명한 내용을 확인해 볼 수 있다. 추출 결과인 [표 2-1 ]을 살펴보면 총 37개의 object가 생성 되었고, Object_Type을 보면 한 개의 Table(Base Table), 4개의 Table Partition(Range Partition) 및 32개의 Table SubPartition ( 4 * 8 )이 생성되었음을 알 수 있다. 또한 Table 및 Table Partition에는 Data_Object_Id가 없음을 알 수 있다. 실제 Data를 저장하는 Object가 아니라는 뜻으로 Data는 32개의 SubPartition에만 저장되고 이들만이 Table에 할당되는 물리적 속성을 갖는다는 것을 알 수 있다.
SELECT OBJECT_NAME, SUBOBJECT_NAME, OBJECT_ID,
DATA_OBJECT_ID, OBJECT_TYPE
FROM USER_OBJECTS
WHERE OBJECT_NAME = 'TS_SALES_1997_COMP';
[ 표 2-1 ]
OBJECTNAME SUBOBJECTNAME OBJECTID DATAOBJECT ID OBJECT_TYPE
TS_SALES_1997_COMP SYS_SUBP137 24231 24231 TABLE SUBPARTITION
TS_SALES_1997_COMP SYS_SUBP138 24232 24232 TABLE SUBPARTITION
TS_SALES_1997_COMP SYS_SUBP139 24233 24233 TABLE SUBPARTITION
TS_SALES_1997_COMP SYS_SUBP140 24234 24234 TABLE SUBPARTITION
TS_SALES_1997_COMP SYS_SUBP141 24235 24235 TABLE SUBPARTITION
TS_SALES_1997_COMP SYS_SUBP142 24236 24236 TABLE SUBPARTITION
TS_SALES_1997_COMP SYS_SUBP143 24237 24237 TABLE SUBPARTITION
TS_SALES_1997_COMP SYS_SUBP144 24238 24238 TABLE SUBPARTITION
TS_SALES_1997_COMP SYS_SUBP145 24239 24239 TABLE SUBPARTITION
TS_SALES_1997_COMP SYS_SUBP146 24240 24240 TABLE SUBPARTITION
TS_SALES_1997_COMP SYS_SUBP147 24241 24241 TABLE SUBPARTITION
TS_SALES_1997_COMP SYS_SUBP148 24242 24242 TABLE SUBPARTITION
TS_SALES_1997_COMP SYS_SUBP149 24243 24243 TABLE SUBPARTITION
TS_SALES_1997_COMP SYS_SUBP150 24244 24244 TABLE SUBPARTITION
TS_SALES_1997_COMP SYS_SUBP151 24245 24245 TABLE SUBPARTITION
TS_SALES_1997_COMP SYS_SUBP152 24246 24246 TABLE SUBPARTITION
TS_SALES_1997_COMP SYS_SUBP153 24255 24255 TABLE SUBPARTITION
TS_SALES_1997_COMP SYS_SUBP154 24256 24256 TABLE SUBPARTITION
.
.
.
TS_SALES_1997_COMP SALES_1997_COMP_Q3_S1 24247 24247 TABLE SUBPARTITION
TS_SALES_1997_COMP SALES_1997_COMP_Q3_S2 24248 24248 TABLE SUBPARTITION
TS_SALES_1997_COMP SALES_1997_COMP_Q3_S3 24249 24249 TABLE SUBPARTITION
TS_SALES_1997_COMP SALES_1997_COMP_Q3_S4 24250 24250 TABLE SUBPARTITION
TS_SALES_1997_COMP SALES_1997_COMP_Q3_S5 24251 24251 TABLE SUBPARTITION
TS_SALES_1997_COMP SALES_1997_COMP_Q3_S6 24252 24252 TABLE SUBPARTITION
TS_SALES_1997_COMP SALES_1997_COMP_Q3_S7 24253 24253 TABLE SUBPARTITION
TS_SALES_1997_COMP SALES_1997_COMP_Q3_S8 24254 24254 TABLE SUBPARTITION
TS_SALES_1997_COMP SALES_1997_COMP_Q4 24230 TABLE PARTITION
TS_SALES_1997_COMP 24226 TABLE
다음 예는 Partitioned Table에서 Data 조작을 위한 SQL Sample 이다. 위에서 생성한 Range, Hash, Composite Partitioned Table들은 조회 시 아래와 같이 Base Table만을 명시하여 사용 할 수 도 있고, Extended Table name을 명시하여 사용 할 수 도 있다.
SELECT
SELECT * FROM TS_SALES_1997_RANGE S
WHERE S.PRICE > 1000;
SELECT * FROM TS_SALES_1997_HASH S
WHERE S.PRICE > 1000;
SELECT * FROM TS_SALES_1997_RANGE PARTITION (TS_SALES_1997_RANGE_Q1) S
WHERE S.PRICE > 1000;
UPDATE
UPDATE TS_SALES_1997_RANGE PARTITION (TS_SALES_1997_RANGE_Q1) S
SET S.SERIAL = 4254480
WHERE S.SERIAL = 425448;
DELETE
DELETE FROM TS_SALES_1997_RANGE PARTITION (TS_SALES_1997_RANGE_Q1) S
WHERE S.SERIAL = 4254480;
INSERT
INSERT INTO TS_SALES_1997_RANGE PARTITION (TS_SALES_1997_RANGE_Q1)
SELECT * FROM SALES_1997_Q1;
INSERT INTO TS_SALES_1997_RANGE PARTITION (TS_SALES_1997_RANGE_Q1)
VALUES (...);
INSERT INTO TS_SALES_1997_RANGE PARTITION (TS_SALES_1997_RANGE_Q1)
(SERIAL, ..., PRICE)
VALUES (...);
PARTITION LOCK
LOCK TABLE TS_SALES_1997_RANGE PARTITION (TS_SALES_1997_RANGE_Q1) IN EXCLUSIVE MODE;
VIEW 생성
CREATE VIEW VW_SALES_1997_RANGE_Q1 AS
SELECT * FROM TS_SALES_1997_RANGE PARTITION (TS_SALES_1997_RANGE_Q1);
다음에 연재될 내용은 파티션키의 선정으로 실제 프로젝트에서 파티션을 사용하기 위해서 어떤 부분을 고려해야 되고 주의해야 하는지 방향을 제시할 것이다.
|