본문 바로가기

Partition

파티션키 컬럼에 대해서 Update 를 하는 경우 (ORA-14402 에러) (Enable Row Movement) 오라클 파티션(Partition) 테이블에 대해서 Update 하려고 할때, 파티션 키컬럼에 대해서도 Update 하게 되는 경우가 있을 수 있습니다. 그런데, 파티션키 컬럼을 변경하는 것은 일반 컬럼값 변경하는 경우와는 조금 다르게 생각해야 합니다. 파티션테이블의 데이터들이 모두 파티션 키컬럼값에 따라 어느 파티션으로 들어갈지가 정해지는 것인데, 이걸 그냥 값만 Update 해버리면 안되겠죠~ Update 가 일어나는 순간 다른 적절한 파티션으로 옮겨져야 합니다. 이것을 가능하게 해주는 Table 옵션이 "Enable Row Movement" 입니다. 파티션 Table 에 이 옵션을 걸어주지 않고 그냥 파티션키값을 변경하려고 하면 아래와 같이 ORA-14402 에러가 발생합니다. (아래의 경우는 SAL.. 더보기
오라클 Virtual Column-Based Partitioning (가상컬럼을 파티션키로) Oracle Table 에 가상컬럼(Virtual Column)을 만들 수 있습니다. 기존에 있는 테이블의 컬럼들을 가지고 가상의 컬럼(Pseudo Column)을 만드는 것이죠. 가상컬럼이기 때문에 실제로 데이터가 들어있지는 않고, 매번 조회할 때마다 기존 컬럼들에 지정된 연산을 해서 데이터를 가져오는 방식이죠~ 사용자 입장에서는 해당 컬럼에 데이터가 있는 것처럼 보이지만, 실제로는 물리적으로 공간을 차지하지 않는 형태입니다. Oracle 11g DBMS 부터는 가상컬럼을 파티션키로 사용할 수 있습니다. create table SALES ( sales_no number, sale_date date, customer_name varchar2(30), customer_init as (substr(custo.. 더보기
오라클 파티션 인덱스 (Partition Index) 관련 팁, FAQ 정리 Oracle Partition Index 관련 제가 알고있는 수준의 정보들을 쉐어합니다. ㅎㅎ 어디까지나 제가 알고 있는 수준~~ 아주 미천하죠~ ㅋㅋ 가볍게 봐주세용. ♣ Local Index vs Global Index (로컬 인덱스 vs 글로벌 인덱스) 파티션 테이블(Partition Table)도 빠른 SQL처리를 위해서는 당연히 일반 테이블처럼 인덱스를 걸어야 합니다. 그런데, 파티션테이블의 경우 인덱스가 2종류가 있어서 헷갈리고 당황스럽죠~ 바로 Local Partitioned Index 와 Global Partitioned Index 입니다. 원래는 "파티션드(Partitioned)" 라는 말을 붙여야 하는데, 귀찮아서 그냥 제목처럼 로컬인덱스, 글로벌인덱스 라고 부르기도 합니다. 하지만, .. 더보기
오라클 Hash 파티션에서 Add / Drop / Truncate / Rename / Split / Merge 해시파티션(Hash Partition) 에서 Add / Drop 같은 게 가능할까요? 아니 필요할까요?? 뜬금없이 그런 생각이 들었는데, 얼핏 생각했을때는 당연히 필요없을 것으로 생각했었습니다. Range 파티션처럼 년도가 늘어나는 경우가 있는 것도 아니니 말입니다. 그런데, 4개로 해시파티션되어 있는 것을 5개, 6개... 로 늘릴 수도 있는거 아닐까요?? 이렇게 늘려주면 Disk I/O 분산도 더 좋아지고... 맞습니다..^^ 늘릴 수 있습니다. Add 커맨드 잘 동작합니다. SQL> create table SALES ( sales_no number, sale_year number, sale_month number, sale_day number, customer_name varchar2(30), bi.. 더보기
오라클 파티션테이블 기본개념 정리 (Oracle Partition Table Basics) 오라클 파티션테이블은 하나의 큰 테이블을 물리적으로 나눠놓은 것입니다. 물리적으로 나눠놨지만, 논리적으로는 하나의 테이블로 간주됩니다. 왼쪽 그림처럼 Sales 테이블에 1월데이터부터 5월데이터까지 하나의 통테이블에 몰아서 넣을수 있습니다. 하지만, 파티션테이블을 사용하게되면 오른쪽 그림처럼 월마다 다른 세그먼트에 Sales 데이터를 나눠서 넣을 수 있습니다. 이렇게 나눠서 넣어놔도 사용자는 1월~5월치 데이터가 마치 하나의 Sales 테이블에 들어있는 것처럼 사용할 수 있습니다. 오라클에서는 Object, Segment 라는 개념을 사용합니다. 저장공간을 가지는 개념이 Segment 에 해당합니다. 즉, 위 파티션된 Sales 테이블에서는 5개의 Segment 에 데이터가 나뉘어 들어가게 됩니다. 각각.. 더보기
오라클 복합파티션(Composite Partition) Hash + Range 샘플 (11g ~ ) 오라클은 Range, List, Hash 파티션을 지원하고, 이들간의 다양한 조합을 지원합니다. 이중에서 아래는 Hash Partition + Range Sub Partition 샘플입니다. create table SALES ( sales_no number, sale_year number, sale_month number, sale_day number, customer_name varchar2(30), birth_date date, price number, state varchar2(2) ) partition by hash (birth_date) subpartition by range (sales_no) subpartition template ( subpartition S1 values less than.. 더보기
오라클 복합파티션(Composite Partition) Hash + List 샘플 (11g ~ ) 오라클은 Range, List, Hash 파티션을 지원하고, 이들간의 다양한 조합을 지원합니다. 이중에서 아래는 Hash Partition + List Sub Partition 샘플입니다. create table SALES ( sales_no number, sale_year number, sale_month number, sale_day number, customer_name varchar2(30), birth_date date, price number, state varchar2(2) ) partition by hash (birth_date) subpartition by list (state) subpartition template ( subpartition S1 values ('MA','NY','CT.. 더보기
오라클 복합파티션(Composite Partition) Hash + Hash 샘플 (11g ~ ) 오라클은 Range, List, Hash 파티션을 지원하고, 이들간의 다양한 조합을 지원합니다. 이중에서 아래는 Hash Partition + Hash Sub Partition 샘플입니다. create table SALES ( sales_no number, sale_year number, sale_month number, sale_day number, customer_name varchar2(30), birth_date date, price number, state varchar2(2) ) partition by hash (birth_date) subpartition by hash (sales_no) subpartition template ( subpartition S1, subpartition S2, .. 더보기