본문 바로가기

개발/오라클

오라클 테이블 사이즈, 인덱스 사이즈 구하기



오라클 테이블 크기와 인덱스 크기 구하는 방법입니다. 많은 자료 입력하려고 보니 에러가 발생해서 차지하고 있는 데이타의 양을 알아보고 싶어졌습니다. 오라클의 구조를 모르기 때문에 각 테이블에서 쓰이는 명칭은 모르지만, 오라클 구조에 대해서도 관심을 가져 알아보면 좋다고 생각합니다. 그럼 테이블 크기 구하는 방법에 대해서 알아보겠습니다.


10g에서 테스트했습니다.


-- 과거 통계자료를 지운다.
ANALYZE TABLE comczipnm DELETE STATISTICS;

-- 현재 시점으로 통계자료를 구성한다.
ANALYZE TABLE comczipnm COMPUTE STATISTICS;

-- 한 개의 BLOCK에 Available 한 Bytes : 1958
-- INI_TRANS : 
-- PCT_FREE : Table 의 pct_free 값(default 10)
-- ADJ_ROW_SIZE : 각 row 의 평균 SIZE 추정치
-- ROW_COUNT : table 의 row 의 갯수
-- BLOCK_SIZE : 1 block의 크기 (단위: K)
SELECT GREATEST(4, CEIL(NUM_ROWS/ ((ROUND(((1958-(INI_TRANS*23))*((100 - PCT_FREE)/100))/AVG_ROW_LEN)))) * 2048)/1024/1024 "테이블 크기(MB)"
  FROM USER_TABLES
 WHERE TABLE_NAME = '테이블명(대문자)';





-- NUM_ROWS : table의 행 갯수(SELECT COUNT(*) FROM 테이블;)
-- 한 개의 block에 available 한 bytes : ( 1935 or 2048 - 113 )
-- INI_TRANS : 
-- PCT_FREE : Index 의 PCT_FREE 값(default 10)
-- number_col_index : Index column 의 수(1, 2, 3, 4, ...)
-- total_col_length : Index 의 길이 추정치(인덱스 컬럼의 총합?)
-- UNIQUENESS : 만일 unique index 이면 1, non-unique index 이면 0 
-- BLOCK_SIZE : 1 block의 크기 (단위: K)
SELECT GREATEST(4, (1.01) * ((NUM_ROWS / ((floor(((2048 - 113 - (INI_TRANS * 23)) *  (1 - (PCT_FREE/100)))  / ( (10 + uniqueness) + number_col_index +  (total_col_length) ) ) ) ) ) *  2048))/1024/1024 "인덱스 크기(MB)"
  FROM USER_TABLES
 WHERE TABLE_NAME = '테이블명(대문자)';