SQL ORACLE - Wie rausfinden, wie voll eine Tabelle noch ist?

h1ob

Ensign
Registriert
Juni 2010
Beiträge
220
Hallo zusammen,

ich habe aus einer Tabelle einer Oracle Datenbank große Mengen gelöscht.
Bekannterweise bleibt die Größe der Tabelle wegen der HWM bestehen. Um den Platz freizugeben, müsste man die Tabelle reorganisieren.

Mich interessiert nun, wie viel Daten nach der Löschung noch in der Tabelle sind.
Meine erste Idee war, dass das im view dba_segments stehen müsste. Leider zeigt der aber immernoch die HWM Größe und nicht die tatsächlich belegte Größe an.
Jemand eine Idee / Select?
 
Mach nen Count um zu sehen wie viele Zeilen noch vorhanden sind. Anschließend schau dir die Tabellendefinition an und errechne die Durchschnittsgröße einer einzelnen Zeile. Solange ihr keine Binary Felder verwendet, sollte das eine gute Schätzung liefern.
 
select sum(bytes)/(1024*1024)||' MB from dba_segments
where segment_type = 'TABLE'
and segment_name = '<tabellenname>';

PS.: Ich sollte den ersten Post demnächst genauer lesen. Das ist wohl nicht ganz was du suchst. Ich lasse es dennoch mal stehen.
Ergänzung ()

Was du suchst ist wohl eher sowas:
Code:
select num_rows "Approximate Number Of Rows", 
       b.blocks "Total Blocks Allocated",
       a.blocks "Total Blocks Containing Data", 
       empty_blocks "Empty Blocks", 
       avg_space "Average Free Space In Blocks",
       ((a.blocks * c.block_size_kb) - (a.blocks * (avg_space/1024)))/1024 "Size MB"
  from all_tables a
  join (select owner, segment_name, sum(blocks) blocks
          from dba_extents
         group by owner, segment_name) b
    on a.owner = b.owner
   and a.table_name = b.segment_name
 cross 
  join (select value/1024 block_size_kb
          from v$parameter
         where name like 'db_block_size') c
 where a.owner = '<owner hier>' 
   AND a.table_name = '<table name hier>' ;

Eventuell zuvor mal aktuelle Statistiken sammeln auf der Tabelle!
dbms_stats.gather_table_stats(ownname => '<owner name hier>', tabname => '<table name hier>', estimate_percent => 100);


Zumindest als Idee sollte es reichen.
 
Zuletzt bearbeitet:
Zurück
Oben