2010-02-05 11 views
7

Necesito saber verdadero tamaño del espacio de tabla en Oracle. Tengo algo de espacio de tabla y necesito saber cuánto espacio usa ahora y cuánto espacio hay libre (y tal vez un porcentaje del espacio libre). Encontré en la web algunos archivos sqls, pero todos ellos mostraron el tamaño basado en la marca de agua ... que no es verdadero espacio asignado ahora, pero hasta donde sé el valor más alto que se haya alcanzado ... Así que mi verdadera necesidad es saber si tengo suficiente espacio para mis datos que constantemente están escritos y debo saber cuánto de ellos puedo almacenar antes de tener que eliminar algunos de ellos.Tamaño verdadero del espacio de tabla en el oráculo

Gracias

Respuesta

19

Prueba esto:

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

Muchas gracias! Puedo confirmar que funciona :) Tal vez debería registrarme y votar por su respuesta porque resuelve el problema que me pareció muy difícil para muchas personas y que no tiene una buena respuesta en la web ... ahora lo tiene :) – miki

4

Si quieres tener una idea del tamaño del archivo de datos que incluye los archivos que se pueden extender de auto luego tratar:

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

de esperar que esta lo ayudaría,

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; 
Cuestiones relacionadas