메뉴 여닫기
개인 메뉴 토글
로그인하지 않음
만약 지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.

Oracle 테이블 사용공간 확인

  • Oracle 19c에서 ASM(Automatic Storage Management)을 사용하는 환경에서 테이블의 "비워져 있는 공간(Free Space)" 및 "재사용 가능한 공간(Reclaimable/Reusable Space)" 확인

테이블이 사용하는 공간 확인

테이블이 점유한 전체, 사용 중, 비어 있는 공간 확인

  • 현재 테이블의 전체 할당 공간, 사용 중인 공간, 비어 있는 공간(Free Space)을 볼 수 있습니다.
    SELECT
        a.table_name,
        a.num_rows,
        a.blocks,
        a.empty_blocks,
        (a.blocks - a.empty_blocks) * b.block_size AS used_bytes,
        a.empty_blocks * b.block_size AS empty_bytes
    FROM
        user_tables a,
        (SELECT value AS block_size FROM v$parameter WHERE name = 'db_block_size') b
    WHERE
        a.table_name = '테이블명';


blur_on 항목 설명
  • `blocks`: 테이블에 할당된 총 블록 수
  • `empty_blocks`: 비워져 있는 블록(사용되지 않은 블록) 수
  • `block_size`: 데이터베이스 블록 크기(보통 8192 Byte 등)
  • `used_bytes`: 실제 사용 중인 바이트 수
  • `empty_bytes`: 비어 있는 바이트 수



테이블의 가용(재사용) 공간 확인

  • Free space(재사용 가능 공간)를 구체적으로 보고 싶을 때:
  • DBA/USER/ALL_TABLES, DBA/USER/ALL_SEGMENTS, DBA/USER/ALL_EXTENTS 뷰를 사용
  1. 세그먼트 기준 Free Space 확인
    SELECT
        segment_name,
        segment_type,
        bytes/1024/1024 AS mb
    FROM
        user_segments
    WHERE
        segment_name = '테이블명';
    -> 이는 테이블이 실제로 점유 중인 전체 공간입니다.
  2. 세그먼트 안의 FREE 영역, FRAGMENTATION 확인
    SELECT
        fs.file_id,
        fs.block_id AS start_block,
        fs.blocks AS free_blocks,
        (fs.blocks * p.value)/1024 AS free_kb
    FROM
        dba_free_space fs,
        v$parameter p -- block size 확인시 
    WHERE
        p.name = 'db_block_size'
        AND fs.tablespace_name = '테이블이 속한 테이블스페이스명'
    ORDER BY
        fs.block_id;
  • 단일 테이블의 unused/free space는 `DBMS_SPACE` 패키지를 활용하여 보다 상세하게 조회할 수 있습니다.

DBMS_SPACE 패키지로 구체적인 사용/비사용 공간 확인

  • PL/SQL BLOCK을 이용하면 테이블의 Used, Free, Reclaimable Space
DECLARE
    v_unformatted_blocks     NUMBER;
    v_unformatted_bytes      NUMBER;
    v_fs_blocks              NUMBER;
    v_fs_bytes               NUMBER;
    v_full_blocks            NUMBER;
    v_full_bytes             NUMBER;
BEGIN
    DBMS_SPACE.SPACE_USAGE(
        segment_owner      => '스키마명',
        segment_name       => '테이블명',
        segment_type       => 'TABLE',
        unformatted_blocks => v_unformatted_blocks,
        unformatted_bytes  => v_unformatted_bytes,
        fs_blocks          => v_fs_blocks,
        fs_bytes           => v_fs_bytes,
        full_blocks        => v_full_blocks,
        full_bytes         => v_full_bytes
    );
    DBMS_OUTPUT.PUT_LINE('Unformatted blocks: ' || v_unformatted_blocks);
    DBMS_OUTPUT.PUT_LINE('Unformatted bytes: ' || v_unformatted_bytes);
    DBMS_OUTPUT.PUT_LINE('Free blocks: ' || v_fs_blocks);
    DBMS_OUTPUT.PUT_LINE('Free bytes: ' || v_fs_bytes);
    DBMS_OUTPUT.PUT_LINE('Full blocks: ' || v_full_blocks);
    DBMS_OUTPUT.PUT_LINE('Full bytes: ' || v_full_bytes);
END;
blur_on {{{1}}}



결론

    attach_file* ASM 사용 여부와 무관하게** 데이터베이스 레벨에서 공간 정보는 기존 데이터 딕셔너리 뷰 및 `DBMS_SPACE` 패키지로 확인
  • 간편하게는 `user_segments`, `user_tables`의 데이터로 전체/사용/빈 공간을 관찰하고, 더 세밀한 정보는 `DBMS_SPACE.SPACE_USAGE` 패키지와 관련 뷰를 이용