Пакет DBMS_SPACE удобен для проверки того, сколько места занято и сколько свободного пространства осталось в различных сегментах, таких как сегменты таблиц, индексов и кластеров. Напомним, что представление словаря данных DBA_FREE_SPACE позволяет находить информацию о свободном месте в табличных пространствах и файлах данных, но не в объектах базы данных. Если пакет DBMS_SPACE не используется, сложно будет узнать, сколько свободного места есть в сегментах, выделенных различным объектам базы данных. Пакет DBMS_SPACE позволяет ответить на следующие вопросы:
- Сколько свободного пространства я могу использовать перед тем, как понадобится следующий экстент?
- Сколько блоков данных находятся выше маркера максимального уровня заполнения (high-water mark — HWM)?
Представления словаря данных DBA_EXTENTS и DBA_SEGMENTS предоставляют массу информации о месте, выделенном объектам, таким как таблицы и индексы, но вы не сможете узнать из них о том, сколько пространства занято и сколько осталось свободного. Если проанализировать таблицы, то столбец BLOCKS даст HWM — максимальный размер, которого достигала таблица. Однако если таблица подвергалась большому количеству операций вставки и удаления, то HWM не будет показательным индикатором реального использованного пространства. Пакет DBMS_SPACE идеален для нахождения использованного и свободного пространства, оставшегося в объектах.
Пакет DBMS_SPACE включает в себя три основных процедуры: процедура UNUSED_SPACE даст информацию о неиспользованном пространстве в сегменте объекта,процедура FREE_BLOCKS — информацию о количестве свободных блоков в сегменте, а процедура SPACE_USED — подробности об использованном пространстве в блоках.
Давайте внимательнее рассмотрим процедуру UNUSED_SPACE и посмотрим, как ее применять для получения детальной информации о неиспользованном пространстве.Процедура имеет три входных (IN) параметра (четвертый — параметр по умолчанию) и семь выходных (OUT) параметров. В листинге ниже показан вывод, полученный при выполнении процедуры UNUSED_SPACE.
SQL> DECLARE 2 v_total_blocks NUMBER; 3 v_total_bytes NUMBER; 4 v_unused_blocks NUMBER; 5 v_unused_bytes NUMBER; 6 v_last_used_extent_file_id NUMBER; 7 v_last_used_extent_block_id NUMBER; 8 v_last_used_block NUMBER; 9 BEGIN 10 dbms_space.unused_space (segment_owner => 'OE', 11 segment_name => 'PRODUCT_DESCRIPTIONS', 12 segment_type => 'TABLE', 13 total_blocks => v_total_blocks, 14 total_bytes => v_total_bytes, 15 unused_blocks => v_unused_blocks, 16 unused_bytes => v_unused_bytes, 17 last_used_extent_file_id => v_last_used_extent_file_id, 18 last_used_extent_block_id => v_last_used_extent_block_id, 19 last_used_block => v_last_used_block, 20 partition_name => NULL); 21 dbms_output.put_line ('Общее количество блоков : '||v_total_blocks); 22 dbms_output.put_line ('Количество байт : '||v_total_bytes); 23 dbms_output.put_line ('Количество неиспользованных блоков : '||v_unused_blocks); 24 dbms_output.put_line ('Количество неиспользованных байт : '||v_unused_bytes ); 25 END; Общее количество блоков : 384 Количество байт : 3145728 Количество неиспользованных блоков : 0 Количество неиспользованных байт : 0 PL/SQL procedure successfully completed. SQL>