Ein Bild sagt ja bekanntlich mehr als 1001 Worte, deswegen ist es manchmal ganz praktisch sich die Belegung seines Tablespace mal grafisch anzuzeigen.
WITH
FUNCTION tbs_map (
p_file_id IN NUMBER DEFAULT 1,
p_width IN NUMBER DEFAULT 200,
p_blocks IN NUMBER DEFAULT 128)
RETURN CLOB
IS
t_clob CLOB:=empty_clob();
t_clob_out CLOB:=empty_clob();
t_clob_len INT;
tbs_name VARCHAR2(128);
tbs_free_space NUMBER;
tbs_file_size NUMBER;
tbs_block_size INT;
cnt INT:=0;
BEGIN
t_clob:=' ';
FOR c IN (select tablespace_name,round(sum(bytes)/1024/1024) sum_bytes
INTO tbs_name,tbs_free_space
from dba_free_space
where file_id=p_file_id
group by tablespace_name ) LOOP
tbs_name:=c.tablespace_name;
tbs_free_space :=c.sum_bytes;
END LOOP;
IF tbs_name IS NULL THEN
RETURN 'Datafile '||p_file_id||' not existing';
END IF;
FOR c IN (select round(bytes/1024/1024) file_size,block_size from v$datafile
where file#=p_file_id) LOOP
tbs_file_size := c.file_size;
tbs_block_size := c.block_size;
END LOOP;
t_clob_out :='Tablespace='||tbs_name ||', File='||p_file_id||', Size='||tbs_file_size||', MB Free='||tbs_free_space||
' MB, Blocks='||p_blocks||', (c) 2021 by Muniqsoft Training '||chr(10);
--t_clob:=' ';
FOR c IN (
SELECT block_seg,replace(lpad('.',ceil(sum_blocks/p_blocks)+1,CASE segment_type
WHEN 'TABLE' THEN 'T'
WHEN 'INDEX' THEN 'I'
WHEN 'INDEX PARTITION' THEN 'J'
WHEN 'LOBSEGMENT' THEN 'L'
WHEN 'LOB PARTITION' THEN 'L'
WHEN 'CLUSTER' THEN 'C'
WHEN 'TYPE2 UNDO' THEN 'U'
WHEN 'ROLLBACK' THEN 'U'
WHEN 'TABLE PARTITION' THEN 'P'
WHEN 'TABLE SUBPARTITION' THEN 'P'
WHEN 'LOBINDEX' THEN 'X'
WHEN 'NESTED TABLE' THEN 'N'
WHEN 'O' THEN 'O'
ELSE '?' END),'.','') as stype FROM (
SELECT block_seg,sum_blocks,segment_type ,row_number()
over (partition by block_seg order by sum_blocks desc) rn
from (
select floor(block_id/p_width) block_seg ,sum(blocks) sum_blocks,segment_type
from
(select block_id,blocks,segment_type from dba_extents where file_id=p_file_id
UNION ALL
select block_id, blocks, 'O' from dba_free_space where file_id=p_file_id
)
group by floor(block_id/p_width),segment_type
order by 1))
where rn=1)
LOOP
dbms_lob.writeAppend(t_clob,length(c.stype),c.stype);
cnt:=cnt+1;
END LOOP;
t_clob_len:= (dbms_lob.getlength(t_clob))/p_width;
FOR i IN 1 .. ceil(t_clob_len) LOOP
dbms_lob.writeAppend( t_clob_out, p_width+7, lpad(to_char((i-1)*p_width*tbs_block_size),5,'0')||' '||DBMS_LOB.SUBSTR(t_clob,p_width,(i-1)*p_width+6)||chr(10) );
END LOOP;
RETURN DBMS_LOB.SUBSTR(t_clob_out,dbms_lob.getlength(t_clob_out)-6,1)
|| chr(10)||'(O)=Leer, (T)able, (I)ndex, (J)ndex Partition, (P)artition, (U)ndo/Rollback, (C)luster, (L)obsegment, (N)ested Table, Lob Index(x)';
END;
select TBS_MAP(p_file_id =>2, p_blocks=>128,p_width=>128) from dual;
/
Folgende Parameter können übergeben werden:
p_file_id Nummer der Datendatei (aus v$DATAFILE)
p_blocks Anzahl der Blöcke, die zu einem Zeichen zusammengefasst werden sollen (Derzeit nur sinnvoll mit Wert 128 einsetzbar, andere Werte werden bald nachgereicht)
Das bedeutet, wenn 128 Tabellen Blöcke hintereinander leiegen , wird dafür ein (T) ausgegeben für 256 Tabellenblöche zwei (TT) u.s.w.
Liegen in diesen 128 Blöcken mehrere verschiedene Objekte, wird das größte nur angezeigt!
p_width= Ausgabebreite in Zeichen, alle mit Monitoren größer als 40" können da natürlich die Breite mehr ausreizen :-)
Sollte der SELECT lange laufen, fehlt ihnen evtl eine Statistik auf X$KTBFUE (siehe Link unten im Artikel)
Die Ausgabe sieht dann z.B. so aus
Tablespace=SYSAUX, File=2, Size=2304, MB Free=796 MB, Blocks=128, (c) 2021 by Muniqsoft Training
00000 LLIIIIILIITLIILLITTIIITTIIIIJILIIIILILIIILTIILITTTTTITIIJJJJJJJJTTIPIIITIPIIIPPIIIPTTIIPIIIIITPPIITITTTPPLLLLLLLLLLLLLLLLL
10485 LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLJJJJJITIIIIIIITILLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLILLIITILLTIIIIIIIIIIIIIII
20971 LLPPTIIITIIPPPIIIIIIPTPIIITIPIIIIIIILILLITPPPPPPJPIPIPLLLPPPPPPPPITPPPIIPPPIIPPPPPPPIIPCIPPIPIIPPITIIPPPPPIIPIIPPIPPIPITCPPPPPIP
31457 IPPIIPPIPIPPLIPPPPTPIIITTTPIPPIPIIPIPPPTIIPIIPTIIPPIPPIJPIIIPPITIIIIPIIPIILTTPJJPTPIIIIPITTIITIJPTIIIPIIPPPPPPPIIPPJTIIIJIPIJPPI
41943 ITTIPIIPIPIIPJPIPPPIIPTIITIPIPPPITIIPIIPIIIIPPPIIPTIIIJITJIIPIIIPPIPIITPITPIIIPPIIPIIIIIIIIIJPLIIJPPIPIIIJJILPTIIIIIIIIIIITOPIII
52428 ITJTTTIPIIIIIIIIIIIPIIITPPPITJPIIIIIIIIIPTPIIPTJIIPJIIIIIIIIIPIILTTIIPOIIIPIIIIIIIIPPIIIIIIPOPIIJIOTIIIIIIIIIITPIITIILITOTITPOII
62914 IIIIIOPIPIIIIOITIIIIIIIIIIIIPIPTPIPIIIIIIIIIIITIIIIIIIIPTPLTIIPPIIIIIIIIIJIPPTPTPTIIIIIIIIIIIIIIIIIITPIPTPPIPLPPIIIIIIIITPIPTPTT
73400 PPIIIIIIIITIIIIIIIIITPIITTIPIIIIIIIIITIIIITJIIIIIIIIIIPJIPPTPIIIIIIIIIIPPITTJTPIPTIIIIIIIIPTITITPPPTITPLTPPLPILLPPPLPPTPTPPPTTPL
83886 LOTTIIIIIIIIOTPITPIIPIIIIIIIIOOPTIIIIIIIIPITOOPPPPPPOIIIIIIIIPOTPPPPTITTTPPIPPTJPPILLLLLLLLLLLLLLLLILLLLLLLLLLLLLLLLLLLLLLLLLLLL
94371 LLLLILLLLLLLLIIIIILIIILLILIIIIIIIIIIIIIILLIIIIITLLLITLIIIIILIIIILIIIIILILLIIITLIILLTIIIILLLLLLLLLLLLLLLLLLLIIIIIIIILIIIIPIITIITI
10485 LLLLILTIIILIIIITTLTTTTLLTITTTLTILTLTTTILTTLTTTTTTIITTTILITITTTIITTTTITLTIILILLLLLLLLLLLLLLLLILLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL
11534 LLLLLLLLLLLLLLLLLLLLLLLLLLLLLIIILTIILIIIITOPOLOPPPPPPPOPPPPPPIPPJPPPLOPPOPOPPPPJPPPJTPPJOOOTOOOOOOOOIOOOOOOOOOOOOOOOOOOOOOOOOOOO
12582 OOOOOIOOOOOOOOOOOOOOLOOOOOOOOOOOIOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOTOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
13631 OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOTOOOIOOOOOOOOOOOOOOOOOOOTLOLOOOOOOOOOOTOOOOOOOIOOOOOOOOOOOOOOOOOOOOOOOOOOO
14680 OOOOOOOOOOOOOTOOOOIOOOOOOOOOOOOOOOOOOOOOOOOOOOOOLLLLLLLLLLLLLLLLOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
15728 OOOOOOOOOOOOOOTOOOOOOOOOOOOIIIIIIIIOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOTOOOOTOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
16777 OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
17825 OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
(O)=Leer, (T)able, (I)ndex, (J)ndex Partition, (P)artition, (U)ndo/Rollback, (C)luster, (L)obsegment, (N)ested Table, Lob Index(x)
So bekommt man doch gleich einen Überblick, ob eine Reorg sich auf dem Tablespace lohnt.
Un unserem Fall ja, weil viele (O) am Ende zu finden sind