Свободное пространство в объектах (индексы, таблицы)

dbstalker, 16 марта

Для этого я использую вот такой скрипт, найденный в свое время в интернете:

set serveroutput on
DECLARE
    cursor c_extents is
            (
                select  E.tablespace_name Tablespace_name, 
						E.owner owner, 
						E.segment_name segment_name, 
						E.segment_type segment_type, 
		        			count(distinct E.file_id) Anzahl_DBF, 
        					count(E.extent_id) Anzahl_extents
				from dba_extents E
				where E.segment_type in ('TABLE','INDEX')
				group by E.tablespace_name , E.owner, E.segment_name , E.segment_type
		            );
    v_c_extents c_extents%ROWTYPE;
 v_i number;
 v_round_pr NUMBER;   
 v_total_blocks NUMBER; 
 v_total_bytes NUMBER; 
 v_unused_blocks NUMBER; 
 v_unused_bytes NUMBER; 
 v_last_used_extent_file_id NUMBER; 
 v_last_used_extent_block_id NUMBER; 
 v_last_used_block NUMBER;
 
BEGIN
    v_i := 0; 
    for v_c_extents in c_extents
        LOOP
            v_unused_bytes := 0;
            v_total_bytes  := 1;
            DBMS_SPACE.UNUSED_SPACE
                            ( 
                                segment_owner               => v_c_extents.owner, 
                                segment_name                => v_c_extents.segment_name, 
                                segment_type                => v_c_extents.segment_type, 
                                total_blocks                => v_total_blocks, 
                                total_bytes                 => v_total_bytes, 
                                unused_blocks               => v_unused_blocks, 
                                unused_bytes                => v_unused_bytes, 
                                last_used_extent_file_id    => v_last_used_extent_file_id, 
                                last_used_extent_block_id   => v_last_used_extent_block_id, 
                                last_used_block             => v_last_used_block
                            );
                DBMS_OUTPUT.enable(100000000000);
                v_i := v_i +1;
                v_round_pr := round(v_unused_bytes/v_total_bytes*100,2);
                DBMS_OUTPUT.put_line (v_i||';'||   v_c_extents.segment_type||';'||
                                        v_c_extents.owner||';'||v_c_extents.tablespace_name||';'||
                                        v_c_extents.segment_name||';'||'Total Mb='||v_total_bytes||';'||
                                        'Unused Mb='||v_unused_bytes||';'||'% unused='||v_round_pr||' % ;'||
                                        v_c_extents.anzahl_extents||';'||v_c_extents.Anzahl_DBF);  END LOOP;END;
/


Суть скрипта - используйте процедуру DBMS_SPACE.UNUSED_SPACE.

9 комментариев

Прокоментировать

bandyn
20 марта 2009 г. в 14:35

Что именно делает этот скрипт?

dbstalker
20 марта 2009 г. в 16:28

рекламирует DBMS_SPACE.UNUSED_SPACE, показывает неиспользуемое пространство в сегментах

Андрей
10 апреля 2009 г. в 07:43

И что дальше делать с этим свободным местом? Это плохо? Если да, то как его уменьшить?

dbstalker
10 апреля 2009 г. в 09:06

чем плохо резервировать место , но его не использовать? Табличные пространства немеряно растут. Самый простой способ борьбы: импорт-экспорт с перенастройкой таблиц и индексов.

Александр
5 мая 2009 г. в 06:10

Ну насчёт импорта-экспорта это вы погорячились: достаточно создать новое табличное пространство и дать команду alter table ... move tablespase....

dbstalker
5 мая 2009 г. в 09:54

а как в этом случае перенастроить свойства таблиц и индексов?

Алексей
23 апреля 2009 г. в 16:13

мелкое замечание, выдаются значения в байтах - указан Мб

Михаил
6 мая 2009 г. в 18:11

А этим запросом не проще

select * from
table(dbms_space.asa_recommendations('FALSE', 'FALSE', 'FALSE'))
order by reclaimable_space desc

AlexNB
17 сентября 2010 г. в 10:51

Похожий скрипт, показывает дырки в файлах данных (>1гб)

select * from (
select
b.file_name
,round(b.BYTES/1024/1024/1024) Gb
,lag(a.block_id,1,a.block_id) over (order by file_id, block_id)||' - '||a.block_id window
,round((a.block_id - lag(a.block_id,1,a.block_id) over (order by file_id, block_id))*8/1024/1024) size_gb --для блока 8к
from dba_extents a join dba_data_files b using (FILE_ID)
where b.TABLESPACE_NAME = 'SLOLP_WSLOG')-- order by file_id, block_id)
where size_gb>1
order by size_gb desc

 

Новый комментарий

Я не спамер: введите суму 6+4



 

От авторов блога

О Блоге - прочитай перед началом.

Задать вопрос и получить ответ - уже решено 94 вопросов

Глоссарий - список терминов и сокращений


 
 

Бизнес форум