사용자 도구

사이트 도구


dbms:oracle:concept:tablesizeanalyze

차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

다음 판
이전 판
dbms:oracle:concept:tablesizeanalyze [2008/02/14 01:46]
starlits 새로 만듬
dbms:oracle:concept:tablesizeanalyze [2010/01/29 09:27] (현재)
starlits
줄 1: 줄 1:
-====== TABLE 용량 분석 ======+====== TABLE 용량 분석 ======
  
 ===== 해당 Table에 할당되어 있는 크기 측정하는 방법 ===== ===== 해당 Table에 할당되어 있는 크기 측정하는 방법 =====
줄 9: 줄 9:
  
  
-===== High Water Mark 측정 ===== + 
-  - Table에 공간할당은 되었으나 아직 (전혀) 사용되지 않는 공간을 제외한 실제 사용되고 있는 공간을 확인하고자 하는 방법이다.+===== 실제 사용공간 측정 ===== 
 +  - Table에 공간할당은 되었으나 아직 (전혀) 사용되지 않는 공간을 제외한 실제 사용되고 있는 공간을 계산하는 방법이다.
   - 즉, High Water Mark(HWM) 아래의 공간을 측정하는 것이다.   - 즉, High Water Mark(HWM) 아래의 공간을 측정하는 것이다.
 +
  
 ==== 측정방법 ==== ==== 측정방법 ====
-  - 해당 Table을 Analyze 한다. <code sql> yze table <table_name> compute statistics; </code> +  - 해당 Table을 Analyze 한다. <code sql> analyze table <table_name> compute statistics; </code> 
-  - 해당 Table의 blocks를 구한다. <code sql> select blocks from dba_tables where table_name ='<table_name>'; </code> **blocks + 1(segment header block)** : 해당 Table 이 사용중인 database block count  +  - 해당 Table의 blocks를 구한다. <code sql> select blocks from dba_tables where table_name ='<table_name>'; </code> **blocks + 1(segment header block)** : 해당 Table 이 사용중인 database block count , HWM 
-  - 위의 계산에는 사용된 후 delete에 의해 현재 완전히 비어 있는 block도 사용하고 있는 block으로 인식하므로 \\ 완전히 비어 있는 block을 제거하기 위해서는 아래의 결과값을 빼주면 된다.+  - 위의 계산에는 사용된 후 delete에 의해 현재 완전히 비어 있는 block도 사용하고 있는 block으로 인식하므로 \\ 완전히 비어 있는 block을 제거하기 위해서는 아래의 결과값이 나온 block만 계산하면 된다.
     - rowid는 다음과 같이 구성되어 있다. <code>     - rowid는 다음과 같이 구성되어 있다. <code>
 object fil block row   object fil block row  
줄 22: 줄 24:
 AAABPW AAF AAAAv1 AAA AAABPW AAF AAAAv1 AAA
 </code> </code>
-    - 따라서 아래의 Query의 결과값 빼주면 된다. \\ HWM 아래 할당은 되었지만 완전히 비어 있는 block을 빼주면, 조금이라도 사용된 block count만 구할 수 있다. <code sql>+    - 따라서 아래의 Query를 실행하면 결과를 얻을 수 있다. \\ HWM 아래 할당은 되었지만 완전히 비어 있는 block은 계산에서 제외되고, 조금이라도 사용된 block count만 계산된다. <code sql>
 SELECT COUNT(1) SELECT COUNT(1)
 FROM (SELECT SUBSTR(ROWID,1,15) FROM <table_name> GROUP BY SUBSTR(ROWID,1,15) ); FROM (SELECT SUBSTR(ROWID,1,15) FROM <table_name> GROUP BY SUBSTR(ROWID,1,15) );
 </code> </code>
-  + 
 + 
 +===== 예제 ===== 
 +  - costs 라는 테이블의 실제 용량을 확인해 보자.  
 +==== 스크립트 ==== 
 + 
 +  - 통계분석 <code sql> 
 +SQL> analyze table costs compute statistics; 
 +Table analyzed.   
 +</code> 
 +  - block count를 알아낸다. <code> 
 +SQL> select blocks from user_tables where table_name='COSTS';   
 +BLOCKS   
 +----------   
 +2924 
 +</code> 2924는 HWM 아래 block count 이다. 
 +  - HWM 아래에 완전히 비어있는 block count를 알아낸다. <code sql> 
 +SQL> select count(1)from (select substr(rowid,1,15) from costs group by substr(rowid,1,15)); 
 +COUNT(1)   
 +----------   
 +2506 
 +</code> 2506은 HWM 아래 block 중 사용중인 block count 이다. 
 + 
 +===== 정리 ===== 
 +  - Table의 공간(크기)이란 아래 3가지 관점에서 값이 각각 다를수 있습니다.   
 + 
 +===  === 
 +^ 해당 Table에 할당된 크기  | Table에 할당되었지만 사용중 또는 미사용공간 전부 포함 
 +^ HWM 아래 크기  | 할당된 공간중에서 full table scan시 검색하는 부분까지만의 크기 \\ 즉 HWM이후 공간은 아직 한번도 사용이 안된 new block이다 | 
 +^ HWM 아래중 완전히 비어 있는 \\ block을 제외한 크기  | delete에 의해 block전체가 비어 있는 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)/1024/1024 TABLESIZE_MBYTES 
 +FROM USER_TABLES ; 
 +</code> 
  
  
dbms/oracle/concept/tablesizeanalyze.1202921205.txt.gz · 마지막으로 수정됨: 2008/02/14 01:46 저자 starlits