Korean English Japanese Chinese (Simplified) Chinese (Traditional)

 

 

 

본 실습: 5-1 챕터에서 생성한 파티션 테이블 사용. 

https://yooliberalhouse.tistory.com/94

 

5-1 Data Warehouse Management - Partitioned tables and indexes using appropriate methods and keys

SELECT partition_name, table_name, tablespace_name, subpartition_count FROM dba_tab_partitions 난이도: ★☆☆☆☆ 문제 1: Range Partitioned Table (10분) CREATE TABLE range_part (id NUMBER, name VARCHAR2(20), surname VARCHAR2(20), ddate DATE) PAR

yooliberalhouse.tistory.com

 

 

 

난이도: 

문제 1:  range, hash, list 파티션 테이블에 새 파티션을 추가하라. 그리고 파티션 테이블을 interval partitioned table로 변환시켜 보아라. (7분)

 

ALTER TABLE ref_part ADD PARTITION p3 VALUES LESS THAN (30);

ALTER TABLE list_part ADD PARTITION part_sapporo VALUES ('SAPPORO');

ALTER TABLE tbl_hash_part1 ADD PARTITION;

/* 파티션 테이블을 Interval 파티션 테이블로 변환하기 */
ALTER TABLE range_part SET INTERVAL (NUMTOYMINTERVAL(1,'YEAR'));

 

 

 

 

 

난이도: 

문제 2:  range-list partitioned table에 새 파티션과 sub파티션을 추가하라. (7분)

 

CREATE TABLE tbl_list_range_test
(
	id		NUMBER,
	course	VARCHAR2(10)
)
PARTITION BY LIST (course)
	SUBPARTITION BY RANGE (id)
(
PARTITION part1 VALUES ('Oracle')
	(
	 SUBPARTITION part1_sub1 VALUES LESS THAN (10)
	)
);




ALTER TABLE tbl_list_range_test ADD PARTITION part2 VALUES ('PLSQL');
ALTER TABLE tbl_list_range_test MODIFY PARTITION part1 ADD SUBPARTITION part1_sub2 VALUES LESS THAN (20);

 

 

 

 

 

난이도: 

문제 3: 파티션 테이블에서 파티션과 sub파티션을 drop하여라. (4분)

ALTER TABLE tbl_list_range_test DROP PARTITION part2;
ALTER TABLE tbl_list_range_test DROP SUBPARTITION part1_sub2;


ALTER TABLE tbl_list_range_test DROP SUBPARTITION part1_sub2 UPDATE INDEXES;

 

 

 

 

 

난이도: 

문제 4:  hash 파티션에서 파티션을 coalescing하여라. (4분)

 

SELECT	COUNT(*)
FROM	dba_tab_partitions
WHERE	table_name = 'HASH_PART';


ALTER TABLE hash_part COALESCE PARTITION;


SELECT	COUNT(*)
FROM	dba_tab_partitions
WHERE	table_name = 'HASH_PART';

 

 

 

 

 

난이도: 

문제 5:  list 파티션 테이블을 추가하고, non 파티션 테이블로 convert하여라. (4분)

CREATE TABLE tbl_range_part_exch (id NUMBER)
PARTITION BY RANGE (id)
(
PARTITION part1 VALUES LESS THAN (100),
PARTITION part2 VALUES LESS THAN (200)
);
INSERT INTO tbl_range_part_exch VALUES (1);
INSERT INTO tbl_range_part_exch VALUES (150);
SELECT * FROM tbl_range_part_exch;


CREATE TABLE tbl_non_part_exch (id NUMBER);

ALTER TABLE tbl_range_part_exch EXCHANGE PARTITION part1 WITH TABLE tbl_non_part_exch;

/* EXCHANGE SUBPARTITION 구문도 가능하다.*/

 

 

 

 

 

난이도: 

문제 6:  online redefinition 기능을 사용하여 non 파티션 테이블을 파티션 테이블로 바꾸어라. (8분)

더보기

DBMS_REDEFINITION.CAN_REDEF_TABLE

DBMS_REDEFINITION.START_REDEF_TABLE

DBMS_REDEFINITION.SYNC_INTERIM_TABLE

DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS  : (num_errors를 pls_integer로 출력할 필요)

DBMS_REDEFINITION.FINISH_REDEF_TABLE

CONN ryu/asdf0930k

CREATE TABLE tbl_non_part2 AS SELECT * FROM dba_objects;	
DELETE tbl_non_part2 WHERE object_id IS NULL;
ALTER TABLE tbl_non_part2 ADD CONSTRAINT table_pk PRIMARY KEY (object_id);


EXEC DBMS_REDEFINITION.CAN_REDEF_TABLE('RYU','TBL_NON_PART2');


CREATE TABLE tbl_partitioned_redef
PARTITION BY RANGE (object_id)
(
PARTITION part1 VALUES LESS THAN (100),
PARTITION part2 VALUES LESS THAN (1000),
PARTITION part3 VALUES LESS THAN (10000),
PARTITION part4 VALUES LESS THAN (maxvalue)
)
AS
SELECT * FROM dba_objects WHERE 1 = 2; 


EXEC DBMS_REDEFINITION.START_REDEF_TABLE('RYU','TBL_NON_PART2','TBL_PARTITIONED_REDEF');


EXEC DBMS_REDEFINITION.SYNC_INTERIM_TABLE('RYU','TBL_NON_PART2','TBL_PARTITIONED_REDEF');


DECLARE
	num_errors	PLS_INTEGER := 0;
BEGIN
	DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS('RYU','TBL_NON_PART2','TBL_PARTITIONED_REDEF',1,TRUE,TRUE,TRUE,FALSE,NUM_ERRORS,FALSE,FALSE);

	DBMS_OUTPUT.PUT_LINE('errors := ' || to_char(num_errors));

END;
/


EXEC DBMS_REDEFINITION.FINISH_REDEF_TABLE('RYU','TBL_NON_PART2','TBL_PARTITIONED_REDEF');




SELECT	table_name, partition_name
FROM	dba_tab_partitions
WHERE	table_name = 'TBL_PARTITIONED_REDEF';

 

 

 

 

 

 

난이도: 

문제 7: 4개의 파티션이 있는 Range 파티션을 생성하고, 2개를 merge하여라. (6분)

 

CREATE TABLE tbl_range_part_merge
PARTITION BY range (object_id)
(
PARTITION part1 VALUES LESS THAN (100),
PARTITION part2 VALUES LESS THAN (200),
PARTITION part3 VALUES LESS THAN (300),
PARTITION part4 VALUES LESS THAN (400)
)
AS
SELECT * FROM dba_objects WHERE object_id < 400;


ALTER TABLE tbl_range_part_merge MERGE PARTITIONS part3,part4 INTO PARTITION part3_new UPDATE INDEXES;


SELECT	table_name,partition_name
FROM	dba_tab_partitions
WHERE	table_name='TBL_RANGE_PART_MERGE';

 

 

 

 

 

난이도: 

문제 8:  파티션을 Rename하여라. (2분)

 

ALTER TABLE tbl_range_part_merge RENAME PARTITION part1 TO part1_new;

 

 

 

 

 

난이도: 

문제 9:  파티션을 Truncate하여라. (1분)

 

ALTER TABLE tbl_range_part_merge TRUNCATE PARTITION part1_new;


SELECT count(*) FROM tbl_range_part_merge PARTITION (part1_new);

 

 

 

 

 

난이도: 

문제 10:  새 테이블스페이스를 생성하고, 테이블의 일부 파티션을 이 테이블스페이스로 옮기고, 결과를 확인하라. (4분)

 

SELECT name FROM v$tablespace;

ALTER TABLE tbl_range_part_merge MOVE PARTITION part2 TABLESPACE users PARALLEL (DEGREE 2);


SELECT	table_name, partition_name, tablespace_name
FROM	dba_tab_partitions
WHERE	table_name='TBL_RANGE_PART_MERGE';

 

 

 

 

 

난이도: 

문제 11: MAXVALUE값이 있는 range 파티션테이블을 생성하고 2개의 서로 다른 파티션로 분할하라. (6분)

 

CREATE TABLE tbl_range_part_split
PARTITION BY RANGE (object_id)
(
PARTITION part1 VALUES LESS THAN (100),
PARTITION part2 VALUES LESS THAN (maxvalue)
)
AS
SELECT * FROM dba_objects;



SELECT count(*) FROM tbl_range_part_split PARTITION (part1);
ALTER TABLE tbl_range_part_split SPLIT PARTITION part1 AT (50) INTO (PARTITION part1_1, PARTITION part1_2);

SELECT count(1) FROM tbl_range_part_split PARTITION (part1_1);
SELECT count(1) FROM tbl_range_part_split PARTITION (part1_2);



SELECT count(*) FROM tbl_range_part_split PARTITION (part2);
ALTER TABLE tbl_range_part_split SPLIT PARTITION part2 AT (10000) INTO (PARTITION part2_1, PARTITION part2_2);



SELECT		partition_name, high_value
FROM		dba_tab_partitions
WHERE		table_name = 'TBL_RANGE_PART_SPLIT';
 

If you like this post, please give me a ❤️...!
 
✰Popular Posts✰
✰Recent Posts✰
 

❤ from Seoul, Daejeon, Tokyo, Fukuoka