-- EMPNO 컬럼을 파티션 키로 하고 별도 테이블스페이스에 두개의 해시 파티션을 가지는 EMP 테이블을 생성한다.
CREATE TABLE emp
(
empno number,
ename varchar2(20)
)
PARTITION BY HASH (empno)
(
partition part_1 tablespace P1,
partition part_2 tablespace P2
)
/
Table created.
SQL>insert into emp select empno, ename from scott.emp;
14 rows created.
-- 테이블의 파티션 명(partition-extended table name)을 사용하여 각 파티션의 내용을 조회
SQL>select * from emp partition (part_1) ;
EMPNO ENAME
---------- --------------------
7369 SMITH
7499 ALLEN
7654 MARTIN
7698 BLAKE
7782 CLARK
7839 KING
7876 ADAMS
7934 MILLER
8 rows selected.
SQL>select * from emp partition (part_2) ;
EMPNO ENAME
---------- --------------------
7521 WARD
7566 JONES
7788 SCOTT
7844 TURNER
7900 JAMES
7902 FORD
6 rows selected.
-- 해시 키 값의 해싱한 결과를 기준으로 파티션을 결정하기 때문에 데이터를 어느 파티션에 위치할지를 지정할 수 없다.
SQL> alter tablespace p1 offline;
Tablespace altered.
SQL> select * from emp ;
select *from emp
*
ERROR at line 1:
ORA-00376: file 12 cannot be read at this time
ORA-01110: data file 12:
'/data/data01.dbf'
- 바인드변수를 사용하여 실행계획 수립시 어떤 파티션을 액세스할 것인지 알지 못하도록 하더라고, 런타임시 파티션 제외를 수행할 수 있다.
SQL>variable n number
SQL>exec :n := 7844;
PL/SQL procedure successfully completed.
SQL>select * from emp where empno = :n ;
EMPNO ENAME
---------- --------------------
7844 TURNER
-- 일반 테이블 생성 : BIG_TABLE1
SQL> CREATE TABLE BIG_TABLE1
( ID, OWNER, OBJECT_NAME, SUBOBJECT_NAME,
OBJECT_ID, DATA_OBJECT_ID,
OBJECT_TYPE, CREATED, LAST_DDL_TIME,
TIMESTAMP, STATUS, TEMPORARY,
GENERATED, SECONDARY )
TABLESPACE BIG1
AS
SELECT ID, OWNER, OBJECT_NAME, SUBOBJECT_NAME,
OBJECT_ID, DATA_OBJECT_ID,
OBJECT_TYPE, CREATED, LAST_DDL_TIME,
TIMESTAMP, STATUS, TEMPORARY,
GENERATED, SECONDARY
FROM BIG_TABLE.BIG_TABLE ;
Table created.
-- 해쉬파티션 테이블 생성 : BIG_TABLE2
SQL> CREATE TABLE BIG_TABLE2
( ID, OWNER, OBJECT_NAME, SUBOBJECT_NAME,
OBJECT_ID, DATA_OBJECT_ID,
OBJECT_TYPE, CREATED, LAST_DDL_TIME,
TIMESTAMP, STATUS, TEMPORARY,
GENERATED, SECONDARY )
partition by hash(id)
( partition part_1 tablespace big2,
partition part_2 tablespace big2,
partition part_3 tablespace big2,
partition part_4 tablespace big2,
partition part_5 tablespace big2,
partition part_6 tablespace big2,
partition part_7 tablespace big2,
partition part_8 tablespace big2
)
AS
SELECR ID, OWNER, OBJECT_NAME, SUBOBJECT_NAME,
OBJECT_ID, DATA_OBJECT_ID,
OBJECT_TYPE, CREATED, LAST_DDL_TIME,
TIMESTAMP, STATUS, TEMPORARY,
GENERATED, SECONDARY
FROM BIG_TABLE.big_table;
Table created.
SQL> select b.tablespace_name,
mbytes_alloc,
mbytes_free
from ( select round(sum(bytes)/1024/1024) mbytes_free,
tablespace_name
from dba_free_space
group by tablespace_name ) a,
( select round(sum(bytes)/1024/1024) mbytes_alloc,
tablespace_name
from dba_data_files
group by tablespace_name ) b
where a.tablespace_name(+) = b.tablespace_name
and b.tablespace_name in ( 'BIG1','BIG2' ) ;
TABLESPACE_NAME MBYTES_ALLOC MBYTES_FREE
------------------------------ ------------ -----------
BIG1 1496 344
BIG2 1496 344
-- big_table1 복사본을 저장할 수 있는 공간이 없어서 에러발생
SQL> alter table big_table1 move ;
alter table big_table1 move
*
ERROR at line 1:
ORA-01652: unable to extend temp segment by 1024 in tablespace BIG1
-- 파티션 테이블은 각 파티션별로 move할 수 있다
SQL> alter table big_table2 move;
alter table big_table2 move;
*
ERROR at line 1:
ORA-14511: cannot perform operation on a partitioned object
SQL> alter table big_table2 move partition part_1 ;
Table altered.
SQL> alter table big_table2 move partition part_2 ;
Table altered.
SQL> alter table big_table2 move partition part_3 ;
Table altered.
SQL> alter table big_table2 move partition part_4 ;
Table altered.
SQL> alter table big_table2 move partition part_5 ;
Table altered.
SQL> alter table big_table2 move partition part_6 ;
Table altered.
SQL> alter table big_table2 move partition part_7 ;
Table altered.
SQL> alter table big_table2 move partition part_8 ;
Table altered.
begin
for x in ( select partition_name
from user_tab_partitions
where table_name ='BIG_TABLES2')
loop
execute immediate
'alter table big_table2 move partition ' ||
x.partition_name ;
end loop ;
end;
/
PL/SQL procedure successfully completed.
- 강좌 URL : http://www.gurubee.net/lecture/4058
- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^
- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.