문서의 선택한 두 판 사이의 차이를 보여줍니다.
양쪽 이전 판 이전 판 다음 판 | 이전 판 | ||
dbms:oracle:concept:tablesizeanalyze [2008/02/14 01:47] starlits |
dbms:oracle:concept:tablesizeanalyze [2010/01/29 09:27] (현재) starlits |
||
---|---|---|---|
줄 1: | 줄 1: | ||
- | ====== TABLE 사용량 분석 ====== | + | ====== TABLE 용량 분석 ====== |
===== 해당 Table에 할당되어 있는 크기 측정하는 방법 ===== | ===== 해당 Table에 할당되어 있는 크기 측정하는 방법 ===== | ||
줄 11: | 줄 11: | ||
===== 실제 사용공간 측정 ===== | ===== 실제 사용공간 측정 ===== | ||
- | - Table에 공간할당은 되었으나 아직 (전혀) 사용되지 않는 공간을 제외한 실제 사용되고 있는 공간을 | + | - Table에 공간할당은 되었으나 아직 (전혀) 사용되지 않는 공간을 제외한 실제 사용되고 있는 공간을 계산하는 방법이다. |
- 즉, High Water Mark(HWM) 아래의 공간을 측정하는 것이다. | - 즉, High Water Mark(HWM) 아래의 공간을 측정하는 것이다. | ||
+ | |||
==== 측정방법 ==== | ==== 측정방법 ==== | ||
- | - 해당 Table을 Analyze 한다. <code sql> | + | - 해당 Table을 Analyze 한다. <code sql> |
- | - 해당 Table의 blocks를 구한다. <code sql> select blocks from dba_tables where table_name ='< | + | - 해당 Table의 blocks를 구한다. <code sql> select blocks from dba_tables where table_name ='< |
- | - 위의 계산에는 사용된 후 delete에 의해 현재 완전히 비어 있는 block도 사용하고 있는 block으로 인식하므로 \\ 완전히 비어 있는 block을 제거하기 위해서는 아래의 결과값을 빼주면 된다. | + | - 위의 계산에는 사용된 후 delete에 의해 현재 완전히 비어 있는 block도 사용하고 있는 block으로 인식하므로 \\ 완전히 비어 있는 block을 제거하기 위해서는 아래의 결과값이 나온 block만 계산하면 된다. |
- rowid는 다음과 같이 구성되어 있다. < | - rowid는 다음과 같이 구성되어 있다. < | ||
object fil block row | object fil block row | ||
줄 23: | 줄 24: | ||
AAABPW AAF AAAAv1 AAA | AAABPW AAF AAAAv1 AAA | ||
</ | </ | ||
- | - 따라서 아래의 Query의 결과값 빼주면 된다. \\ HWM 아래 할당은 되었지만 완전히 비어 있는 block을 빼주면, 조금이라도 사용된 block count만 | + | - 따라서 아래의 Query를 실행하면 |
SELECT COUNT(1) | SELECT COUNT(1) | ||
FROM (SELECT SUBSTR(ROWID, | FROM (SELECT SUBSTR(ROWID, | ||
</ | </ | ||
- | | + | |
+ | |||
+ | ===== 예제 ===== | ||
+ | - costs 라는 테이블의 실제 용량을 확인해 보자. | ||
+ | ==== 스크립트 ==== | ||
+ | |||
+ | - 통계분석 <code sql> | ||
+ | SQL> analyze table costs compute statistics; | ||
+ | Table analyzed. | ||
+ | </ | ||
+ | - block count를 알아낸다. < | ||
+ | SQL> select blocks from user_tables where table_name=' | ||
+ | BLOCKS | ||
+ | ---------- | ||
+ | 2924 | ||
+ | </ | ||
+ | - HWM 아래에 완전히 비어있는 block count를 알아낸다. <code sql> | ||
+ | SQL> select count(1)from (select substr(rowid, | ||
+ | COUNT(1) | ||
+ | ---------- | ||
+ | 2506 | ||
+ | </ | ||
+ | |||
+ | ===== 정리 ===== | ||
+ | - Table의 공간(크기)이란 아래 3가지 관점에서 값이 각각 다를수 있습니다. | ||
+ | |||
+ | === === | ||
+ | ^ 해당 Table에 할당된 크기 | ||
+ | ^ HWM 아래 크기 | ||
+ | ^ HWM 아래중 완전히 비어 있는 \\ block을 제외한 크기 | ||
+ | |||
+ | |||
+ | ===== 생각해보자 ===== | ||
+ | - USER_SEGMENTS 의 BYTES는 실데이타 공간이 아니라 할당영역을 나타낸 것이다. \\ 빈 블럭도 포함이 된다 | ||
+ | - 만일 UNUSED 블럭을 제외한 실제 데이타 공간을 구하려면 아래와 같이 구하면 된다. \\ 쿼리상의 8192는 show parameter의 DB_BLOCK_SIZE의 값이다. \\ 이 구문 역시 정확한 값을 얻기 위해서는 **ANALYZE TABLE** 을 해 주어야 한다. <code sql> | ||
+ | SELECT TABLE_NAME, | ||
+ | GREATEST(4, CEIL(NUM_ROWS / | ||
+ | ((ROUND(((8192 - (INI_TRANS * 23)) * | ||
+ | ((100 - PCT_USED) /100)) / AVG_ROW_LEN)))) * | ||
+ | 8192)/ | ||
+ | FROM USER_TABLES ; | ||
+ | </ | ||