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 뷰를 사용
- 세그먼트 기준 Free Space 확인
SELECT segment_name, segment_type, bytes/1024/1024 AS mb FROM user_segments WHERE segment_name = '테이블명';- -> 이는 테이블이 실제로 점유 중인 전체 공간입니다.
- 세그먼트 안의 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` 패키지와 관련 뷰를 이용