Истинный размер табличного пространства в Oracle - PullRequest
7 голосов
/ 05 февраля 2010

Мне нужно знать true размер табличного пространства в Oracle. У меня есть табличное пространство, и мне нужно знать, сколько места оно использует сейчас и сколько свободного места (и, возможно, процентов свободного пространства). Я нашел в сети некоторые sqls, но все они показали размер, основанный на водяном знаке ... который не является истинным местом, выделенным сейчас, но насколько я знаю, самое высокое значение, которое когда-либо достигалось ... Поэтому мне действительно нужно знать, достаточно ли у меня места для моих данных, которые постоянно записываются, и я должен знать, сколько из них я могу сохранить, прежде чем удалять некоторые из них.

Спасибо

Ответы [ 3 ]

20 голосов
/ 05 февраля 2010

Попробуйте это:

-- 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);
4 голосов
/ 12 октября 2010

Если вы хотите получить представление о размере файла данных, включая те, которые могут автоматически расширяться, попробуйте:

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 голосов
/ 21 ноября 2012

Надеюсь, это поможет вам,

 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;
...