10 мая 2011 г.

oracle: dbms_space

DBMS_SPACE

The DBMS_SPACE package enables you to analyze segment growth and space requirements.

Посмотреть свободное место можно DBMS_SPACE.UNUSED_SPACE и DBMS_SPACE.FREE_BLOCKS.


DBMS_SPACE.UNUSED_SPACE возвращает количество блоков выше HWM в сегменте,
т.е. количество блоков которые никогда не использовались ранее.



То же самое можно получить из DBA_TABLES.EMPTY_BLOCKS после анализа таблицы:
analyze table t compute statistics;
select empty_blocks from dba_tables where table_name='T';

Пример использования:
-- создадим таблицу
create table t as select * from all_objects;
-- соберём статистику
analyze table t compute statistics;

 -- dbms_space.unused_space
declare
total_blocks number;
total_bytes number;
unused_blocks number;
unused_bytes number;
last_used_extent_file_id number;
last_used_extent_block_id number;
last_used_block number;
partition_name number;
begin
    DBMS_SPACE.UNUSED_SPACE('GUPPI', 'T','TABLE',total_blocks,total_bytes,unused_blocks,unused_bytes,
    last_used_extent_file_id,last_used_extent_block_id,last_used_block,partition_name);
    dbms_output.put_line('Total blocks = '||total_blocks);
    dbms_output.put_line('Total bytes = '||total_bytes);
    dbms_output.put_line('Unused blocks = '||unused_blocks);
    dbms_output.put_line('Unused bytes = '||unused_bytes);
end;
==================
Total blocks = 646
Total bytes = 5292032
Unused blocks = 113
Unused bytes = 925696

То же самое можно получить из dba_tables, dba_segments:

select * from dba_tables where table_name='T';
select * from dba_segments where segment_name='T';



DBMS_SPACE.FREE_BLOCKS возвращает кол-во блоков ниже HWM, у которых кол-во строк меньше PCTUSED, т.е. список блоков в которые можно вставлять строки.

То же самое можно получить из DBA_TABLES.NUM_FREELIST_BLOCKS после анализа таблицы:
analyze table t compute statistics;
select NUM_FREELIST_BLOCKS from dba_tables where table_name='T';


create table t as select * from all_objects;
analyze table t compute statistics;


-- посмотрим HWM
select empty_blocks from dba_tables where table_name='T';
===============
113

-- dbms_space.free_blocks
declare
free_blocks number;
begin
    DBMS_SPACE.FREE_BLOCKS('GUPPI', 'T','TABLE',0,free_blocks);
    dbms_output.put_line('Nb of free blocks = '||free_blocks);
end;
/
===============
Nb of free blocks = 0

delete from guppi.t where owner='ARBOR';
commit;

снова запускаем dbms_space.free_blocks
===============
Nb of free blocks = 76

HWM при это остаётся неизменным
select empty_blocks from dba_tables where table_name='T';
===============
113