오라클자바커뮤니티에서 설립한 개발자실무교육6년차 오엔제이프로그래밍 실무교육센터
(신입사원채용무료교육, 오라클, SQL, 튜닝, 자바, 스프링,
Ajax, jQuery, 안드로이드, 아이폰, 닷넷, C#, ASP.Net)
스프링3.X게시판&오라클힌트,SQL튜닝,사례연구
www.onjprogramming.co.kr
스프링3.X게시판&오라클힌트,SQL튜닝,사례연구
www.onjprogramming.co.kr
HWM(High Water Mark)
모든 세그먼트는 세그먼트안에 데이타를 포함하고 있는 상위 경계선을 가지는데 이 상위 경계선을 "high water mark" 또는 HWM 라고 부른다. High water mark 는 세그먼트에 할당된 블럭을 표시한다, High water mark 는 일반적으로 5개의 데이타 블럭씩 한번에 옮겨간다. Truncate 명령으로 인하여 High wator mark 아래에는 빈 블럭이 존재할수 있으며 또한 delete로 인하여 빈 공간이 있을 수 있다. Delete할 때 오라클은 HWM을 아래로 내리지 않으며 또한 테이블을 shrink하지도 않는다.
다음을 보고 HWM을 이해하자.
TABLE_A 의 EXTENT구조
EXTENT1 EXTENT2 EXTENT3
|-------------|--------A-------|---------B--------|
A.현재 DATA가 차있는 위치
B.HIGH WATER MARK
TABLE이 생성된 이후 DATA가 INSERT되어 B지점까지 공간을 점유하고 있었다고 가정을 하자.
이후 DATA가 DELETE되어 현재 DATA들이 점유하고 있는 위치는 A라고 하면 B지점이 HIGH WATER MARK가 된다.
DEALLOCATE작업을 하면 HIGH WATER MARK위의 공간만이 FREE되며,
HIGH WATER MARK아래의 공간들 (B-A)은 이후 DATA가 다시 INSERT될 것을 예상하여 그대로 빈 공간으로 남겨두게 된다.
1. DEALLOCATE의 대상이 되는 공간이 어느 정도 존재하는지 파악하는 방법
# 통계정보를 수집
SQL>ANALYZE TABLE table_name COMPUTE STATISTICS ;
# 데이터 사전을 조회.
SQL>SELECT EMPTY_BLOCKS, BLOCKS
FROM DBA_TABLES
WHERE TABLE_NAME ='table_name' ;
EMPTY_BLOCKS BLOCKS
------------- ------
6530 2400
EMPTY_BLOCKS : OBJECT에 할당된 총 SPACE중 HIGH WATER MARK 위의 공간
BLOCKS : OBJECT에 할당된 총 SPACE중 HIGH WATER MARK 아래의 공간
여기서 EMPTY_BLOCKS + BLOCKS(해당 OBJECT의 총 SPACE)에 비해서EMPTY_BLOCKS 이
과도하게 크고 앞으로 더이상의 DATA INSERT도 일어나지 않을 계획이라면
DEALLOCATE를 하는 것이 좋다.
3. SYNTAX
ALTER TABLE table_name DEALLOCATE UNUSED [KEEP integerK] ;
ALTER INDEX index_name DEALLOCATE UNUSED [KEEP integerK] ;
ALTER CLUSTER cluster_name DEALLOCATE UNUSED [KEEP integerK] ;
KEEP절을 사용하면 KEEP절에 정의된 크기만큼은 남겨두고 DEALLOCATE를 한다.
# 테이블 DEALLOCATE 작업을 수행
ALTER TABLE table_name DEALLOCATE UNUSED ;
를 수행하고 다시 통계정보를 생성하고 SPACE를 조회해 보면..
ANALYZE TABLE table_name COMPUTE STATISTICS ;
SQL>SELECT EMPTY_BLOCKS, BLOCKS
FROM DBA_TABLES
WHERE TABLE_NAME ='table_name' ;
EMPTY_BLOCKS BLOCKS
------------ ------
0 2400
위의 조회 결과를 보면 HIGH WATER MARK위 부분(EMPTY_BLOCKS)은 FREE되어 0으로 표시 되고 HIGH WATER MARK아래부분(BLOCKS)은 그대로(2400) 남아있습니다.
[예제]
SQL>conn / as sysdba
SQL> ANALYZE TABLE scott.emp3 COMPUTE STATISTICS;
테이블이 분석되었습니다.
SQL> SELECT EMPTY_BLOCKS, BLOCKS
2 FROM DBA_TABLES
3 WHERE TABLE_NAME ='EMP3';
EMPTY_BLOCKS BLOCKS
------------ ----------
25 5991
SQL> ALTER TABLE scott.emp3 DEALLOCATE UNUSED ;
테이블이 변경되었습니다.
SQL> SELECT EMPTY_BLOCKS, BLOCKS
2 FROM DBA_TABLES
3 WHERE TABLE_NAME ='EMP3';
EMPTY_BLOCKS BLOCKS
------------ ----------
25 5991
SQL> ANALYZE TABLE scott.emp3 COMPUTE STATISTICS;
테이블이 분석되었습니다.
SQL>
SQL> SELECT EMPTY_BLOCKS, BLOCKS
2 FROM DBA_TABLES
3 WHERE TABLE_NAME ='EMP3';
EMPTY_BLOCKS BLOCKS
------------ ----------
1 5991
SQL> truncate table scott.emp3;
테이블이 잘렸습니다.
SQL> ANALYZE TABLE scott.emp3 COMPUTE STATISTICS;
테이블이 분석되었습니다.
SQL> SELECT EMPTY_BLOCKS, BLOCKS
2 FROM DBA_TABLES
3 WHERE TABLE_NAME ='EMP3';
EMPTY_BLOCKS BLOCKS
------------ ----------
8 0
모든 세그먼트는 세그먼트안에 데이타를 포함하고 있는 상위 경계선을 가지는데 이 상위 경계선을 "high water mark" 또는 HWM 라고 부른다. High water mark 는 세그먼트에 할당된 블럭을 표시한다, High water mark 는 일반적으로 5개의 데이타 블럭씩 한번에 옮겨간다. Truncate 명령으로 인하여 High wator mark 아래에는 빈 블럭이 존재할수 있으며 또한 delete로 인하여 빈 공간이 있을 수 있다. Delete할 때 오라클은 HWM을 아래로 내리지 않으며 또한 테이블을 shrink하지도 않는다.
다음을 보고 HWM을 이해하자.
TABLE_A 의 EXTENT구조
EXTENT1 EXTENT2 EXTENT3
|-------------|--------A-------|---------B--------|
A.현재 DATA가 차있는 위치
B.HIGH WATER MARK
TABLE이 생성된 이후 DATA가 INSERT되어 B지점까지 공간을 점유하고 있었다고 가정을 하자.
이후 DATA가 DELETE되어 현재 DATA들이 점유하고 있는 위치는 A라고 하면 B지점이 HIGH WATER MARK가 된다.
DEALLOCATE작업을 하면 HIGH WATER MARK위의 공간만이 FREE되며,
HIGH WATER MARK아래의 공간들 (B-A)은 이후 DATA가 다시 INSERT될 것을 예상하여 그대로 빈 공간으로 남겨두게 된다.
1. DEALLOCATE의 대상이 되는 공간이 어느 정도 존재하는지 파악하는 방법
# 통계정보를 수집
SQL>ANALYZE TABLE table_name COMPUTE STATISTICS ;
# 데이터 사전을 조회.
SQL>SELECT EMPTY_BLOCKS, BLOCKS
FROM DBA_TABLES
WHERE TABLE_NAME ='table_name' ;
EMPTY_BLOCKS BLOCKS
------------- ------
6530 2400
EMPTY_BLOCKS : OBJECT에 할당된 총 SPACE중 HIGH WATER MARK 위의 공간
BLOCKS : OBJECT에 할당된 총 SPACE중 HIGH WATER MARK 아래의 공간
여기서 EMPTY_BLOCKS + BLOCKS(해당 OBJECT의 총 SPACE)에 비해서EMPTY_BLOCKS 이
과도하게 크고 앞으로 더이상의 DATA INSERT도 일어나지 않을 계획이라면
DEALLOCATE를 하는 것이 좋다.
3. SYNTAX
ALTER TABLE table_name DEALLOCATE UNUSED [KEEP integerK] ;
ALTER INDEX index_name DEALLOCATE UNUSED [KEEP integerK] ;
ALTER CLUSTER cluster_name DEALLOCATE UNUSED [KEEP integerK] ;
KEEP절을 사용하면 KEEP절에 정의된 크기만큼은 남겨두고 DEALLOCATE를 한다.
# 테이블 DEALLOCATE 작업을 수행
ALTER TABLE table_name DEALLOCATE UNUSED ;
를 수행하고 다시 통계정보를 생성하고 SPACE를 조회해 보면..
ANALYZE TABLE table_name COMPUTE STATISTICS ;
SQL>SELECT EMPTY_BLOCKS, BLOCKS
FROM DBA_TABLES
WHERE TABLE_NAME ='table_name' ;
EMPTY_BLOCKS BLOCKS
------------ ------
0 2400
위의 조회 결과를 보면 HIGH WATER MARK위 부분(EMPTY_BLOCKS)은 FREE되어 0으로 표시 되고 HIGH WATER MARK아래부분(BLOCKS)은 그대로(2400) 남아있습니다.
[예제]
SQL>conn / as sysdba
SQL> ANALYZE TABLE scott.emp3 COMPUTE STATISTICS;
테이블이 분석되었습니다.
SQL> SELECT EMPTY_BLOCKS, BLOCKS
2 FROM DBA_TABLES
3 WHERE TABLE_NAME ='EMP3';
EMPTY_BLOCKS BLOCKS
------------ ----------
25 5991
SQL> ALTER TABLE scott.emp3 DEALLOCATE UNUSED ;
테이블이 변경되었습니다.
SQL> SELECT EMPTY_BLOCKS, BLOCKS
2 FROM DBA_TABLES
3 WHERE TABLE_NAME ='EMP3';
EMPTY_BLOCKS BLOCKS
------------ ----------
25 5991
SQL> ANALYZE TABLE scott.emp3 COMPUTE STATISTICS;
테이블이 분석되었습니다.
SQL>
SQL> SELECT EMPTY_BLOCKS, BLOCKS
2 FROM DBA_TABLES
3 WHERE TABLE_NAME ='EMP3';
EMPTY_BLOCKS BLOCKS
------------ ----------
1 5991
SQL> truncate table scott.emp3;
테이블이 잘렸습니다.
SQL> ANALYZE TABLE scott.emp3 COMPUTE STATISTICS;
테이블이 분석되었습니다.
SQL> SELECT EMPTY_BLOCKS, BLOCKS
2 FROM DBA_TABLES
3 WHERE TABLE_NAME ='EMP3';
EMPTY_BLOCKS BLOCKS
------------ ----------
8 0
댓글 없음:
댓글 쓰기