강좌

HOME > 강좌 >
강좌| 리눅스 및 오픈소스에 관련된 강좌를 보실 수 있습니다.
 
List Partitioning
조회 : 3,556  


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: s_kyungsang01.dbf' size 10m; 테이블 영역이 생성되었습니다. SQL> create tablespace ts_junna 2 datafile 'd: s_junna01.dbf' size 10m; 테이블 영역이 생성되었습니다. SQL> create tablespace ts_choongchung 2 datafile 'e: s_choongchung01.dbf' size 10m; 테이블 영역이 생성되었습니다. SQL> create tablespace ts_kyungki 2 datafile 'e: s_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상에서 해당 데이터파일들을 삭제한다. Copyleft(C) 명규의 DBAKOREA All rights free

[원글링크] : https://www.linux.co.kr/home2/board/subbs/board.php?bo_table=lecture&wr_id=730


이 글을 트위터로 보내기 이 글을 페이스북으로 보내기 이 글을 미투데이로 보내기

 
(주) 수퍼유저