카테고리 없음

Table 크기의 추정 방법

OEasy 2006. 10. 18. 11:54
 
BULLETIN CATEGORY 
BULLETIN TOPIC
: RDBMS 
: Table 크기의 추정 방법

TABLE(NON-CLUSTED TABLE)의 초기 사용량을 추정하는 방법을 살펴보자. 
여기서는 ORACLE7 SERVER를 기준으로 하여 설명 하기 하며, TABLE의 초기 사용량을 계산하는 
단계를 다음과 같이 나눌수 있다. 

STEP 1 - 총 블럭 헤드 크기(BLOCK HEADER SIZE)를 계산 
STEP 2 - 데이타 블럭 당 사용 가능한 데이타 영역을 계산 
STEP 3 - 평균 ROW의 전체 컬럼의 길이(COMBINED COLUMN LENGTH)를 계산 
STEP 4 - 총 평균 ROW 크기를 계산 
STEP 5 - 데이타 블럭내의 평균 ROW 수를 계산 
STEP 6 - 테이블에서 요구되는 블럭과 바이트 수를 계산 
  

1. [ STEP 1 ] : 총 블럭 헤드 크기(TOTAL BLOCK HEADER SIZE)를 계산 

  1) total block header 

     total block header = block header, part A + block header, part B 
  
     block header, part A = (fixed header + variable transaction header)  
     block header, part B = (table directory + row directory) 
  
     ** fixed header          : 57 bytes (고정된 블럭 헤드) 
      variable transaction header : 23 * I (I는 해당 TABLE의 INITRANS의 값) 
      table directory       : 4 
      row directory        : 2 * R (R은 블럭의 ROW 수, STEP 5에서 계산) 

  2) 예를 들어, INITRANS = 1일때 경우의 total block header 
     total block header = (57 + (23*1)) + (4 + (2*R)) 
               = 80 + (4 + (2*R)) bytes 
  

2. [ STEP 2 ] : 데이타 블럭 당 사용 가능한 데이타 영역 
                (DATA SPACE PER DATA BLOCK)을 계산 

  1) available data space 

     available data space = (block size - total block header) - 
                ((block size - block header, part A) * (PCTFREE/100)) 
  
     ** block size  :  데이타베이스의 블럭 크기 
            (SQL*DBA의 SHOW PARAMETER에서 db_block_size를 확인) 
  
  2) 예를 들어, db_block_size=2K, PCTFREE=10 일 경우 
     available data space = 2048 - (80 + (4 + 2R)) - ((2048 - 80) * (10 / 100)) 
                          = (1964 - 2R) - (1968 * 0.1) 
                          = (1964 - 2R - 196) 
                          = (1768 - 2R) bytes 
  

3. [ STEP 3 ] : 평균 ROW의 전체 컬럼의 길이(COMBINED COLUMN LENGTH)를 계산 

  ROW 길이를 계산하기 위하여 TABLE 정의에서 컬럼 수, 각 컬럼의 데이타 타입, 가변 길이 
  컬럼의 평균 크기등을 참조한다. 

  1) D (data space/average row) : table T 가 다음의 스키마로 정의되어 있을 경우의 ROW의 
                  평균 길이 

     - create table T ( A char(10), B date, C number(10,2)) 

     D (data space/average row) = ( A + B + C ) 
  
     ** A(컬럼 A의 길이) : 10 bytes -----> CHAR 타입인 경우 fixed length 
        B(     B의 길이) :  7 bytes -----> DATE 타입인 경우 
        C(     C의 길이) :  5 bytes = (P / 2) + 1  
        -----> NUMBER 타입인 경우에는 PRECISION을 고려해서 계산됨 
                   (단, PRECISION에서 NUMBER의 길이를  나타내므로 SCALE은 무관함) 
  
  
4. [ STEP 4 ] : 총 평균 ROW 크기를 계산(TOTAL AVERAGE ROW SIZE) 
  
  여기서는 테이블의 ROW에 의해 요구되는 최소 사용 영역을 계산하는 공식을 제공한다. 

  1) bytes/row 

     bytes/row = row header + F + V + D 
  
   ** row header : ROW 당 3 bytes ( NON-CLUSTERED TABLE) 
      F : 250 bytes이하를 사용하는 컬럼의 TOTAL LENGTH BYTES(각 컬럼 당 1 bytes) 
      V : 250 bytes 이상을 사용하는 컬럼의 TOTAL LENGTH BYTES(각 컬럼 당 3 bytes) 
      D : [STEP 3]의 D (data space/average row) 

  2) 예를 들어, [STEP 3]의 테이블 T 의 TOATL AVERAGE ROW SIZE 
    - 250 byte 이하의 컬럼 수    = 3 
      250 byte 이상의 컬럼 수    = 0 
      D (data space/average row) = 22 인 경우 
    - avg. row size, table T = ( 3 + (1 * 3) + (3 * 0) + 22) 
                 = 28 bytes 
  

5. [ STEP 5 ] : 데이타 블럭내의 평균 ROW 수(AVERAGE ROWS PER BLOCK)를 계산 
   
  1) R (avg. # of rows/block) 

     R (avg. # of rows/block) = available space / average row size 
  
     ** available space  : [STEP 2]의 available data space 
        average row size : [STEP 4]의 bytes/row 

  2) 예를 들어, [STEP 2]의 available space가 (1768 - 2R) bytes이고, 
     [STEP 4]의 테이블 T의 bytes/row가 28bytes일 경우 

     -    R = (1768 - 2R)bytes / 28bytes 
        28R = 1768 - 2R 
        30R = 1768 
         R = 58 rows/block 
  
  

6. [ STEP 6 ] : 테이블에서 요구되는 블럭과 바이트 수를 계산 
                (NUMBER OF BLOCKS AND BYTES) 

  1) # blocks for table과 # bytes for table 

     # blocks for table = # rows  /  R 

     ** # rows  : TABLE의 ROW 수 
        R       : [STEP 5]의 R rows/block 

     # bytes for table = # blocks for table  *  2048 bytes/block 

     ** 2048 bytes/block : 데이타베이스의 블럭 크기 (db_block_size) 
  

  2) 예를 들어, 테이블 T가 10000개의 rows을 가질 경우의 테이블 당 블럭 수 
  
   - # blocks for table T = 10000 rows  /  58 rows/block 
                          = 173 blocks 

   - # bytes for table T  = 173 blocks  *  2048 bytes/block 
                          = 354304 bytes 
                          = 346 Kbytes 
 


Oracle Korea Customer Support Technical Bulletins