본문 바로가기

Oracle/Admin

[Oracle] Row Size 구하기

728x90

No. 10699

ROW SIZE 계산방법

=================

Row Header의 구성은( cf. " Concepts Manual 5-5 " )

(a) +-Row Overhead(2Byte) +

(b) | Number of columns(1Byte) +

(c) | Cluster key ID(if clustered,1Byte) +

(d) +- ROWID of chained row piece(if any, 6Byte)

1. One table 에는 block 을 위해

57 byte + 23* INITRANS + 4 (table directory) + 2* (1block 의 ROW수) 이 할당.

각 Row 의 overhead 는 3 byte (a+b) 입니다.

각 column 의 overhead 는 1 byte 입니다.

(단 250 byte 이하 인 경우, 또는 이상이면3byte)

(e) 단 null 컬럼들이 맨 뒤에 있으면 이 column들의 overhead는 save됩니다. (*)

 

Tuning 요소

==== ex1)

A varchar2(10), B number, C char(10) ,D char(10), E varchar2(10), F char(10)

이고

('a',null,null,null,null,null)의 data가 들어 있으면

=>

3B(a+b) +

2B(for data 'a',column overhead(1byte)포함) = 5 Byte 입니다.

; 이것이 10개 record 라면 50 byte 입니다.

 

==== ex2)

A varchar2(10), B number, C char(10) ,D char(10), E varchar2(10), F char(10)

이고

('a',null,null,'d',null,null)의 data가 들어 있으면

=>

3B(a+b) +

2B(for data 'a',column overhead포함) +

2B(for two null columns ) +

11B(for data 'd',column overhead(1byte)포함) = 18 Byte 입니다.

 

==== ex3)

A varchar2(10), B number 이고

('a',1000000000)의 data가 들어 있으면

=>

3B(a+b) +

2B(for data 'a',column overhead포함) +

3B(for data 1000000000,column overhead(1byte)포함) = 8 Byte 입니다.

; 숫자 1000000000은 내부적으로 1*E9 으로변환 (정수,소수,지수) -> 2byte

; 숫자 1000000001은 내부적으로 (?)

-> 6 byte

data가 많이 들어 있다면 다음 block 으로 의 chain 을 위해 x byte 가 증가되며,

이값을 user_tables의 avg_row_len 으로 구해 보았다면

이 값은 row의 평균 size 이므로 훨씬 많은 byte 일 것입니다.

(사용가능한 space / avg_row_len) 입니다.

 

* 사용가능한 space 는

(block size - block header) - (block size - block header) * 0.1 입니다.

( 만약 pctfree 가 10% 라면)......

 

 

2. One Row가 one Block 에 들어가지 못하는 경우에는 체인이 발생하고

그로 인한 오버헤드는 row header부분에 체인된 블럭을 가리키는 ROWID(6바이트)가 추가됩니다.

체인된 블럭으로 이어진 컬럼은 끊긴 자신의 길이 지정자 ( <= 250이면1B, > 250이면 3B )가 추가됩니다.

==== ex4)

SQL> create table Tbl1 ( c1 varchar2(2000)) pctfree 0;

SQL> Data insert ..

(a) (b) (d) (e)

(e) (Total Size)

; 1800개의 문자 입력(1 block) => 2 + 1 + 3 + 1800 =

1506 Byte

; 1900 " (2 block) => 2 + 1 + 6 + 3 + 약1850 + 1 + 50 =

1913 Byte

; pctfree가 50 이어도 일단 한 레코드가 들어가야 하므로

같은결과

 

analyze table Tbl1 compute statistics;

select table_name

        , num_rows

        , blocks

        , avg_row_len

from user_tables;

 

select vsize(c1)

  from Tbl1;

728x90
반응형

'Oracle > Admin' 카테고리의 다른 글

[Oracle] PASSWORD_VERIFY_FUNCTION  (4) 2024.08.13
[Oracle]ORA-08104  (0) 2024.08.01
[Oracle] ora.diskmon offline  (0) 2024.07.15
[Oracle] Mutex  (0) 2024.06.14
[Oracle] 커서 생성과 무효화  (0) 2024.06.14