컴퓨터활용/오라클

오라클 테이블의 디스크 용량 예측

멜번초이 2011. 12. 5. 20:52

현재 테이블들이 얼마의 데이타를 사용하고 있는지는 테이블스페이스의 사용량을 보고 대략 짐작할 수 있다. 그러나 테이블의 각각의 레코드 사이즈에 데이타건수를 곱하여 세밀하고 조사하고 싶을 경우에는 아래와 같이 테이블의 레코드 사이즈를 구해볼 수 있다.

테이블의 디스크사용량이나 예측용량을 구하기 위하여  우선  아래의 sql를 사용할 수 있다. 물론 SYS 유저 이거나 system dictionary 테이블을 grant 받아서 조회가 가능해야 하겠다.


SELECT OWNER 소유자, TABLE_NAME 테이블ID, TABLE_COMMENT 테이블명, SUM(DATA_LENGTH) 레코드사이즈
FROM (
    SELECT A.OWNER OWNER,
           A.TABLE_NAME TABLE_NAME,
           B.COMMENTS
AS TABLE_COMMENT,
           A.COLUMN_NAME,
           C.COMMENTS
AS COLUMN_COMMENT,
           A.DATA_TYPE,
           A.DATA_LENGTH DATA_LENGTH,
           A.NULLABLE
AS NULLABLE,
           A.DATA_DEFAULT,
           A.DATA_PRECISION
AS PRECISION,
           A.DATA_SCALE
AS SCALE,
           B.TABLE_TYPE,
           A.COLUMN_ID
   
FROM   ALL_TAB_COLUMNS A,
           ALL_TAB_COMMENTS B,
           ALL_COL_COMMENTS C
WHERE  A.OWNER = B.OWNER(+)
   
AND    A.TABLE_NAME = B.TABLE_NAME(+)
   
AND    A.OWNER = C.OWNER(+)
   
AND    A.TABLE_NAME = C.TABLE_NAME(+)
   
AND    A.COLUMN_NAME = C.COLUMN_NAME(+)
--    AND    A.TABLE_NAME  LIKE 'TB%'
    ORDER BY A.OWNER ,
           A.TABLE_NAME ,
           A.COLUMN_NAME
  )

GROUP BY OWNER, TABLE_NAME, TABLE_COMMENT
ORDER BY OWNER, TABLE_NAME



그러면 아래와 같이 결과가 나온다. 소유자별로 테이블 별 레코드 사이즈가 나온다. 물론 CLOB나 BLOB 필드의 경우 이것을 보정해주는 로직이 별도로 필요하겠다. 참고로  DATE 타입의 경우 사이즈로 7 BYTE 로 잡고 있다. 

소유자

테이블ID

테이블명

레코드사이즈

SYS

ALL_STAT_EXTENSIONS

Optimizer statistics extensions

          4,099

SYS

ALL_STORED_SETTINGS

Parameter settings for objects

          4,124

SYS

ALL_STREAMS_COLUMNS

Streams unsupported columns

           213

SYS

ALL_STREAMS_GLOBAL_RULES

Global rules

          4,239

SYS

ALL_STREAMS_MESSAGE_RULES

Rules for Streams

          4,191

SYS

ALL_STREAMS_NEWLY_SUPPORTED

List of objects

           103

SYS

ALL_STREAMS_RULES

Rules used by streams processes

        12,469

SYS

ALL_STREAMS_SCHEMA_RULES

Rules created by streams

          4,269

SYS

ALL_STREAMS_TABLE_RULES

Rules created by streams

          8,306

SYS

ALL_STREAMS_TRANSFORM_FUNCTION

Rules-based transform functions

          8,071

SYS

ALL_STREAMS_UNSUPPORTED

List of all the tables

           102



이제 이 레코드사이즈 에다가 데이타 건수만 곱하면 전체 디스크용량이 나올 것이다.  5년치 용량을 원한다면 다시 곱하기 5, 왠지 용량에 자신감이 없다면 보정치로 1.2 정도를 더 곱해 주면 되겠다~~

마지막으로 추가로 고려해야 할 것이 INDEX 테이블의 용량을 고려한다.
테이블 용량의 보통 20%를 인덱스로 사용하게 된다고 보면 아까 곱한 것에다가 0.3을 더 보태서 보정치로 1.5를 곱하면 되지 않을까?

어디까지나 이것은 주먹구구식 계산방법이고 좀더 과학적인 방법은 인터넷의 다른 글을 참고하면 될 것이다. PCTFEE 뭐 이런거 고려하고 데이타 타입별 가중치 주고 하는 그런 계산법이 있는데 난 머리 아파서 그렇게 못 해!