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   : 23 * I

header                 ( 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

 

 

  1. [ 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

 

  1. [ 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은 무관함)

 

  1. [ 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

 

  1. [ 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

 

  1. [ 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

By haisins

오라클 DBA 박용석 입니다. haisins@gmail.com 으로 문의 주세요.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다