흔히 테이블 사이즈는 요구 안해서 저도 가물가물 했습니다.
그래서 저도 많이 찾아야 했습니다.
그럼 시작 해보죠
-------------------------------------------------------
1. TABLE SIZE 계산 공식(ORACLE BLOCK SIZE : 2K 로 가정)
-------------------------------------------------------
$ sqlplus scott/tiger
SQL> SELECT GREATEST(4, ceil(ROW_COUNT /
((round(((1958 - (initrans * 23)) *
((100 - PCTFREE) /100)) / ADJ_ROW_SIZE)))) * BLOCK_SIZE)
TableSize_Kbytes
FROM dual;
*. 한 개의 BLOCK에 Available 한 Bytes - 1958
*. 각 initrans 는 23 Bytes
*. PCT_FREE : Table 의 pctfree 값(default 10)
*. ADJ_ROW_SIZE : 각 row 의 평균 SIZE 추정치
*. ROW_COUNT : table 의 row 의 갯수
*. BLOCK_SIZE : 1 block의 크기 (단위: K)
참고) 여기서 initrans가 햇갈리시죠.
● INITRANS
▶ Data block내의 raw를 동시에 접근할 수 있는 transaction을 위한 미리
할당된 공간의 예약
▶ 공간은 데이타 또는 인덱스와 관련된 모든 데이타블럭에 예약되어 있슴.
▶ Default : 1(for table), 2(for index and cluster)
■ 예1) 테이블의 크기가 크고 동시 사용자가 많지 않을 경우==>
INITRANS를 작게 설정
■ 예2) 하나의 테이블에 동시 사용자가 많을 경우==> INITRANS를 크게
설정하고 MAXTRANS 를 크게하여준다.(사용자의 wait time을 줄이기 위함)
만약 바꾸고 싶으시다면 초기파라미터를 수정하면되겠죠
TRANSACTION [Number]
예) table 이름이 EMP 일 경우
ROW_COUNT : select count(*) from emp;
ADJ_ROW_SIZE :
SQL> analyze table emp compute statistics;
(또는 건수가 매우 많을 때에는 compute 대신 estimate 사용)
SQL> select avg_row_len
from user_tables
where table_name='EMP';
SQL> select pct_incrase
from user_segments
where segment_name = 'EMP';
결론적으로....
SVRMGR> SELECT GREATEST(4, ceil(14 /
2> ((round(((1958 - (1 * 23)) *
3> ((100 - 50) /100)) / 40)))) * 2048)
4> TableSize_Kbytes
5> FROM DUAL;
TABLESIZE_
2048
1 row selected.
이렇게 하면 안될가요.....
좋은하루 되십시요.
>>정재 님께서 쓰시길<<
'emp'라는 테이블의 남은 용랑은 알수가 없는것 같아요..이걸 알수 있는 방법을 아시 면 답변부탁:: 드립니다...
|