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;
'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 |