개요
기존 테이블의 Free Space 확보 및 HWM(High Water Mark) 조절을 위해 move 명령을 실행할 경우, 기존 TABLESPACE로 이동하는 것과 새로운 TABLESPACE로 이동하는 것의 차이점을 설명합니다.
방법
기존 tablespace로 table move 실행
1. TEST용 Tablespapce 생성
CREATE TABLESPACE TEST_TS DATAFILE '/home/tibero7/datafile/test_ts.dtf' SIZE 2G AUTOEXTEND OFF;
Tablespace 'TEST_TS' created.
SQL
복사
2. TABLE 생성 후 data 삽입
SQL> CREATE TABLE TEST_TABLE (
ID NUMBER PRIMARY KEY,
NAME VARCHAR2(100),
DATA VARCHAR2(1010),
BIRTH DATE
) TABLESPACE TEST_TS;
Table 'TEST2_TABLE' created.
SQL> BEGIN
FOR i IN 1..300000 LOOP
INSERT INTO TEST2_TABLE VALUES (i, 'NAME_' || i, RPAD('DATA', 1000, 'X'), SYSDATE);
END LOOP;
COMMIT;
END;
/
SQL
복사
3. 기존 tablespace free space 확인
SQL> SELECT tablespace_name, file_id, block_id, bytes, blocks
FROM dba_free_space
WHERE tablespace_name = 'TEST_TS';
TABLESPACE_NAME FILE_ID BLOCK_ID BYTES BLOCKS
ㅡㅡㅡㅡㅡㅡㅡㅡㅡ ㅡㅡㅡㅡ ㅡㅡㅡㅡㅡ ㅡㅡㅡㅡㅡㅡ ㅡㅡㅡㅡㅡㅡ
TEST_TS 5 48391 1751121920 213760
1 row selected.
SQL
복사
4. 기존 tablespace로 table move 후 index rebuild
SQL> ALTER TABLE TEST_TABLE MOVE TABLESPACE TEST_TS;
Table 'TEST_TABLE' altered.
SQL> ALTER INDEX _TEST_CON121000125 REBUILD TABLESPACE TEST_TS;
Index '_TEST_CON121000125' altered.
SQL
복사
5. 기존 tablespace free space 확인
SQL> SELECT tablespace_name, file_id, block_id, bytes, blocks
FROM dba_free_space
WHERE tablespace_name = 'TEST_TS';
TABLESPACE_NAME FILE_ID BLOCK_ID BYTES BLOCKS
ㅡㅡㅡㅡㅡㅡㅡㅡㅡ ㅡㅡㅡㅡㅡ ㅡㅡㅡㅡㅡ ㅡㅡㅡㅡㅡㅡㅡ ㅡㅡㅡㅡㅡㅡ
TEST_TS 5 23 131072 16
TEST_TS 5 135 262144 32
TEST_TS 5 311 131072 16
TEST_TS 5 583 131072 16
TEST_TS 5 727 131072 16
TEST_TS 5 871 389283840 47520
TEST_TS 5 92423 1390411776 169728
7 rows selected.
SQL
복사
•
합 = 1780482048
•
기존 tablespace로 table move 시 1,751,121,920 -> 1,780,482,048로 free space 값은 증가했지만, 데이터 파편화 현상이 발생한 것을 확인할 수 있습니다.
새로운 tablespace로 table move 실행
1. TEST용 새로운 Tablespapce 생성
CREATE TABLESPACE NEW_TEST DATAFILE '/home/tibero7/datafile/new_test.dtf' SIZE 2G AUTOEXTEND OFF;
SQL
복사
2. TABLE MOVE and Index Rebuild 재 실행
ALTER TABLE TEST_TABLE MOVE TABLESPACE NEW_TEST;
Table 'TEST_TABLE' altered.
ALTER INDEX _TEST_CON121000125 REBUILD TABLESPACE NEW_TEST;
Index '_TEST_CON121000125' altered.
SQL
복사
3. 이동 후 새로운 tablespace free space 확인
SELECT tablespace_name, file_id, block_id, bytes, blocks
FROM dba_free_space
WHERE tablespace_name = 'NEW_TEST';
TABLESPACE_NAME FILE_ID BLOCK_ID BYTES BLOCKS
ㅡㅡㅡㅡㅡㅡㅡㅡㅡ ㅡㅡㅡㅡㅡ ㅡㅡㅡㅡㅡ ㅡㅡㅡㅡㅡㅡ ㅡㅡㅡㅡㅡㅡ
NEW_TEST 7 44807 1780482048 217344
1 row selected.
SQL
복사
•
합 = 1780482048
•
새로운 table space로 table move 시 1,780,482,048 bytes로 free space bytes의 값은 기존 tablespace로 move한 값과 같지만, 데이터 파편화 현상이 발생하지 않았음을 확인할 수 있습니다.
참고
Tibero는 table shrink를 공식적으로 지원하지 않으므로, 한 번 큰 Size로 할당된 Extent는 다시 작은 Size로는 할당되지 않기에 Extent 최적화 부분에서는 New tablespace로의 move가 관리 및 I/O 측면에서 더 효율적일 수 있습니다.