List Partitioning
range파티셔닝은 지정한 범위에 있는 값만 해당 파티션에 할당할 수 있고,
hash파티셔닝은 어느 파티션에 row를 할당할지 사용자가 컨트롤할 수 없다
list파티셔닝은 row를 지정된 파티션에 명시적으로 할당하는 것이 가능하고,
관련이 없는 데이터집합에 대해서 자연스럽게 그룹화와 조직화가 가능하다.
list파티셔닝은 multi컬럼 파티셔닝을 지원하지 않는다.
즉, 파티셔닝키는 단지 하나의 컬럼으로만 구성될 수 있다.
(range, hash에서는 가능하다.)
* 필자의 생각
아직도 파티셔닝키에 어떠한 조작을 못하는게 아쉽다.
예를 들어, substring한 컬럼값 선두 몇자리만 비교하여
해당 파티션에 할당할 수 없다.
list파티셔닝은 다른 파티션에 비해 제약이 많은것 같다.
CREATE TABLE sales_by_region
(
deptno number,
deptname varchar2(20),
quarterly_sales number(10, 2),
state varchar2(2)
)
PARTITION BY LIST (state)
(
PARTITION q1_northwest VALUES ('OR', 'WA'),
PARTITION q1_southwest VALUES ('AZ', 'UT', 'NM'),
PARTITION q1_northeast VALUES ('NY', 'VM', 'NJ'),
PARTITION q1_southeast VALUES ('FL', 'GA'),
PARTITION q1_northcentral VALUES ('SD', 'WI'),
PARTITION q1_southcentral VALUES ('OK', 'TX')
);
(10, 'accounting', 100, 'WA') q1_northwest파티션에 매핑
(20, 'R&D', 150, 'OR') q1_northwest파티션에 매핑
(30, 'sales', 100, 'FL') q1_southeast파티션에 매핑
(40, 'HR', 10, 'TX') q1_southwest파티션에 매핑
(50, 'systems engineering', 10, 'CA') 어느 파티션에도 매핑되지 않음
CREATE TABLE sales_by_region
(
item# INTEGER,
qty INTEGER,
store_name VARCHAR(30),
state_code VARCHAR(2),
sale_date DATE
)
STORAGE(INITIAL 10K NEXT 20K) TABLESPACE tbs5
PARTITION BY LIST (state_code)
(
PARTITION region_east VALUES ('MA','NY','CT','NH','ME','MD','VA','PA','NJ') STORAGE (INITIAL 20K NEXT 40K PCTINCREASE 50) TABLESPACE tbs8,
PARTITION region_west VALUES ('CA','AZ','NM','OR','WA','UT','NV','CO') PCTFREE 25 NOLOGGING,
PARTITION region_south VALUES ('TX','KY','TN','LA','MS','AR','AL','GA'),
PARTITION region_central VALUES ('OH','ND','SD','MO','IL','MI', null, 'IA')
);
실제 테이블생성해보자.
작성일: 2001-11-16
Oracle 9i EE(9.0.1.0.1)
Windows 2000 Advanced Server
Petium III 1Gz, 512MB
SQL> connect system/xxxxx
연결되었습니다.
-- 4개의 테이블스페이스를 생성
SQL> create tablespace ts_kyungsang
2 datafile 'd:\ts_kyungsang01.dbf' size 10m;
테이블 영역이 생성되었습니다.
SQL> create tablespace ts_junna
2 datafile 'd:\ts_junna01.dbf' size 10m;
테이블 영역이 생성되었습니다.
SQL> create tablespace ts_choongchung
2 datafile 'e:\ts_choongchung01.dbf' size 10m;
테이블 영역이 생성되었습니다.
SQL> create tablespace ts_kyungki
2 datafile 'e:\ts_kyungki01.dbf' size 10m;
테이블 영역이 생성되었습니다.
SQL> connect kang/xxxxxx
연결되었습니다.
SQL> CREATE TABLE member
2 (
3 id varchar(15),
4 name varchar(20),
5 birth date,
6 cellular varchar(13),
7 mail varchar(50),
8 city varchar(10)
9 ) storage( initial 5m next 1m pctincrease 0 ) tablespace users
10 partition by list(city)
11 (
12 partition kyung_sang_do values ('ULSAN', 'BUSAN', 'DAEGU') tablespace ts_kyungsang,
13 partition kyung_ki_do values ('SEOUL', 'INCHUN', 'KOYANG', 'SUNGNAM') tablespace ts_kyungki,
14 partition choong_chung_do values ('DAEJUN') tablespace ts_choongchung,
15 partition jun_na_do values ('GWANGJU') tablespace ts_junna
16 );
테이블이 생성되었습니다.
SQL> insert into member values
2 ('maddog', '강명규', to_date('19740509', 'YYYYMMDD'), '011830xxxx', 'kang@dbakorea.pe.kr', 'ULSAN');
1 개의 행이 만들어졌습니다.
SQL> insert into member values
2 ('maddog1', '아무개1', to_date('19740510', 'YYYYMMDD'), '011830xxx1', 'kang1@dbakorea.pe.kr', 'SEOUL');
1 개의 행이 만들어졌습니다.
SQL> insert into member values
2 ('maddog2', '아무개2', to_date('19740511', 'YYYYMMDD'), '011830xxx2', 'kang2@dbakorea.pe.kr', 'DAEJUN');
1 개의 행이 만들어졌습니다.
SQL> insert into member values
2 ('maddog3', '아무개3', to_date('19740512', 'YYYYMMDD'), '011830xxx3', 'kang3@dbakorea.pe.kr', 'GWANGJU');
1 개의 행이 만들어졌습니다.
-- 파티션키에 매칭되는 데이터가 아니면 에러 발생함
SQL> insert into member values
2 ('maddog4', '아무개4', to_date('19740513', 'YYYYMMDD'), '011830xxx4', 'kang4@dbakorea.pe.kr', 'NEWYORK');
insert into member values
*
1행에 오류:
ORA-14400: 삽입된 분할 영역 키와 매핑되는 분할 영역이 없음
SQL> connect system/xxxxxx
연결되었습니다.
SQL> col id format a10
SQL> col name format a10
SQL> col mail format a20
SQL> select * from kang.member;
ID NAME BIRTH CELLULAR MAIL CITY
---------- ---------- -------- ------------- -------------------- ----------
maddog 강명규 74/05/09 011830xxxx kang@dbakorea.pe.kr ULSAN
maddog1 아무개1 74/05/10 011830xxx1 kang1@dbakorea.pe.kr SEOUL
maddog2 아무개2 74/05/11 011830xxx2 kang2@dbakorea.pe.kr DAEJUN
maddog3 아무개3 74/05/12 011830xxx3 kang3@dbakorea.pe.kr GWANGJU
SQL> alter tablespace ts_kyungki offline;
테이블 영역이 변경되었습니다.
SQL> select * from kang.member;
ERROR:
ORA-00376: 현재 파일 12를 읽을 수 없습니다
ORA-01110: 12 데이터 파일: 'E:\TS_KYUNGKI01.DBF'
-- 해당파티션에 존재하지 않는 데이터들은 select 가능하다.
SQL> select * from kang.member where city in('ULSAN','DAEJUN','GWANGJU');
ID NAME BIRTH CELLULAR MAIL CITY
---------- ---------- -------- ------------- -------------------- ----------
maddog 강명규 74/05/09 011830xxxx kang@dbakorea.pe.kr ULSAN
maddog2 아무개2 74/05/11 011830xxx2 kang2@dbakorea.pe.kr DAEJUN
maddog3 아무개3 74/05/12 011830xxx3 kang3@dbakorea.pe.kr GWANGJU
SQL> select * from kang.member where city ='ULSAN';
ID NAME BIRTH CELLULAR MAIL CITY
---------- ---------- -------- ------------- -------------------- ----------
maddog 강명규 74/05/09 011830xxxx kang@dbakorea.pe.kr ULSAN
SQL> alter tablespace ts_kyungki online;
테이블 영역이 변경되었습니다.
-- 연습을 위해 생성된 것들을 삭제
SQL> connect kang/xxxxxx
연결되었습니다.
SQL> drop table member;
테이블이 삭제되었습니다.
SQL> connect system/xxxxxx
연결되었습니다.
SQL> drop tablespace ts_kyungki;
테이블 영역이 삭제되었습니다.
SQL> drop tablespace ts_kyungsang;
테이블 영역이 삭제되었습니다.
SQL> drop tablespace ts_junna;
테이블 영역이 삭제되었습니다.
SQL> drop tablespace ts_choongchung;
테이블 영역이 삭제되었습니다.
오라클이 테이블스페이스에 할당된 데이터 파일들을 지워주지 않으므로
OS상에서 해당 데이터파일들을 삭제한다.