Auswahl  

Die wahre Größe einer Tabelle mit LOB Spalten 

Oracle
DBA:Monitoring
RDBMS 10.x
06.07.18 (MP)
06.07.18 (MP)
Lobs, Tabellengröße, DBA_SEGMENTS

Body

Letztens bin ich über ein vermeintlich trivales Problem gestolpert: Ich wollte die Größe einer Tabelle berechnen. Nur war die vermeintlich nur sehr klein. Wo lag das Problem?

Wenn man in USER_SEGMENTS oder DBA_SEGMENTS nachschaut, steht dort beim Tabellen (Segment) Namen nur die Größe der Basistabelle (ohne Lob Spalten)

Als Eigentümer des Objekts kann man folgenden Befehl absetzen:
Hinweis: Ändern Sie bitte in der ersten Zeile den Namen der Tabelle ab.

WITH t as (select 'TEST_TAB' as table_name FROM dual)
select 'Tab: '||t.table_name as info,to_char(round(bytes/1024/1024,2),'999,999,9990.99')||' MB' as SIZE_MB
from user_segments s, t
where s.segment_name=t.table_name
UNION ALL
select 'LOB: '||column_name,to_char(round(u.bytes/1024/1024,2),'999,999,9990.99')||' MB'
from user_lobs l, user_segments u, t
where l.segment_name=u.segment_name
AND l.table_name=t.table_name
UNION ALL
select 'Zusammen: ',to_char(round(sum(u.bytes/1024/1024),2),'999,999,9990.99')||' MB'
from user_segments u, t
where u.segment_name IN (select segment_name FROM t,user_lobs ul WHERE ul.table_name=t.table_name)
OR u.segment_name=t.table_name
group by 'Zusammen: ';

Das Ergebnis könnte dann z.B so aussehen:

INFO SIZE_MB
------------------------------ -------------------
Tab: EMP_LOB 0.06 MB
LOB: BILD 4.19 MB
Zusammen: 4.25 MB

Wenn man als DBA das Ganze ansehen möchte:

WITH t as (select 'SCOTT' as owner, 'EMP_LOB' as table_name FROM dual)
select 'Tab: '||t.table_name as info,to_char(round(bytes/1024/1024,2),'999,999,9990.99')||' MB' as SIZE_MB
from dba_segments s, t
where s.segment_name=t.table_name AND s.owner=t.owner
UNION ALL
select 'LOB: '||column_name,to_char(round(u.bytes/1024/1024,2),'999,999,9990.99')||' MB'
from dba_lobs l, dba_segments u, t
where l.segment_name=u.segment_name
AND l.table_name=t.table_name AND l.owner=t.owner
UNION ALL
select 'Zusammen: ',to_char(round(sum(u.bytes/1024/1024),2),'999,999,9990.99')||' MB'
from dba_segments u, t
where u.segment_name IN (select segment_name FROM t,dba_lobs ul WHERE ul.table_name=t.table_name AND ul.owner=t.owner)
OR u.segment_name=t.table_name AND u.owner=t.owner
group by 'Zusammen: ';

Besuchen Sie uns doch bei einer unsere über 40 Oracle Schulungen in München - Unterhaching.