2010-02-05 20 views
7

Ich muss wissen True Tablespace-Größe in Oracle. Ich habe etwas Tablespace und ich muss wissen, wie viel Platz es jetzt nutzt und wie viel Platz frei ist (und vielleicht Prozent des freien Speicherplatzes). Ich fand im Web einige sqls, aber alle von ihnen zeigten Größe basierend auf Wasserzeichen ... das ist jetzt nicht der wahre Platz zugewiesen, aber so weit ich weiß, der höchste Wert, der jemals erreicht wurde ... Also ist mein echtes Bedürfnis zu Ich weiß, ob ich genug Platz für meine Daten habe, die ständig geschrieben werden, und ich muss wissen, wie viele von ihnen ich speichern kann, bevor ich einige davon löschen muss.Wahre Tablespace-Größe in Oracle

Dank

Antwort

19

Versuchen Sie folgendes:

-- Available space, by tablespace 

SELECT * FROM 
    (SELECT tablespace_name FROM dba_tablespaces) 
LEFT OUTER JOIN 
    (SELECT tablespace_name, SUM(bytes) AS total_bytes 
    FROM dba_data_files 
    GROUP BY tablespace_name) 
    USING (tablespace_name) 
LEFT OUTER JOIN 
    (SELECT tablespace_name, sum(bytes) AS used_bytes 
    from dba_segments 
    GROUP BY tablespace_name) 
    USING (tablespace_name) 
LEFT OUTER JOIN 
    (SELECT tablespace_name, SUM(bytes) AS free_bytes 
    FROM dba_free_space 
    GROUP BY tablespace_name) 
    USING (tablespace_name); 
+0

Vielen Dank !!! Ich kann bestätigen, dass es funktioniert :) Vielleicht sollte ich registrieren und für Ihre Antwort abstimmen, weil es das Problem löst, das ich sehr schwer für viele Leute fand und das keine gute Antwort im Netz hat ... jetzt hat es :) – miki

4

Wenn Sie eine Idee von Daten Dateigröße einschließlich der Dateien erhalten möchten, die automatisch versuchen, erweitern können dann:

SELECT DISTINCT a.tablespace_name, 
      sum(a.bytes)/1024/1024 CurMb, 
      sum(decode(b.maxextend, null, a.bytes/1024/1024, b.maxextend*(SELECT value FROM v$parameter WHERE name='db_block_size')/1024/1024)) MaxMb, 
      round(100*(sum(a.bytes)/1024/1024 - round(c.free/1024/1024))/(sum(decode(b.maxextend, null, a.bytes/1024/1024, b.maxextend*(SELECT value FROM v$parameter WHERE name='db_block_size')/1024/1024)))) UPercent, 
      (sum(a.bytes)/1024/1024 - round(c.free/1024/1024)) TotalUsed, 
      (sum(decode(b.maxextend, null, a.bytes/1024/1024, b.maxextend*(SELECT value FROM v$parameter WHERE name='db_block_size')/1024/1024)) - (sum(a.bytes)/1024/1024 - round(c.Free/1024/1024))) TotalFree 
FROM dba_data_files a, 
    sys.filext$ b, 
    (SELECT d.tablespace_name , sum(nvl(c.bytes,0)) free 
    FROM dba_tablespaces d,dba_free_space c 
    WHERE d.tablespace_name = c.tablespace_name(+) 
    GROUP BY d.tablespace_name) c 
WHERE a.file_id = b.file#(+) 
    AND a.tablespace_name = c.tablespace_name 
GROUP BY a.tablespace_name, 
     c.free/1024 
0

dieses Hoffentlich würde Ihnen helfen,

SELECT a.tablespace_name, a.file_name, a.bytes allocated_bytes,b.free_bytes FROM dba_data_files a, 
(SELECT file_id, SUM(bytes) free_bytes FROM dba_free_space b GROUP BY file_id) b WHERE a.file_id=b.file_id 
ORDER BY a.tablespace_name;