Skip to Main Content

 

Auswahl  

Tablespace Map as ASCII Ausgabe 

Oracle
DBA
RDBMS 18.1:RDBMS 19.1:RDBMS 21.1
18.01.21 (MP)
04.07.23(MP)
TBS Map, Tablespace Darstellung

Passende Schulungen zum Thema

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