Postgres相当于Oracle的DBA_FREE_SPACE和DBA_DATA_FILES

时间:2017-05-22 06:49:28

标签: sql postgresql postgresql-9.1 postgresql-9.3 postgresql-9.2

这是sql查询。我需要转换成postgres查询

SELECT a.tablespace_name,
       a.maxbytes,
       a.mbytes,
       (a.maxbytes - a.mbytes),
       ROUND(((a.maxbytes - a.mbytes) / a.maxbytes)*100,2) AS fieldvalues
FROM (
  SELECT tablespace_name,
         SUM(maxbytes / 1024 / 1024) maxbytes,
         SUM(bytes / 1024 / 1024) mbytes
  FROM dba_data_files
  WHERE tablespace_name IN (SELECT tablespace_name
                            FROM dba_segments
                            WHERE OWNER = 'TEST')
  GROUP BY tablespace_name
) a,
  (SELECT tablespace_name,
         SUM(bytes / 1024 / 1024) mbytes
  FROM dba_free_space
  WHERE tablespace_name IN (SELECT tablespace_name
                            FROM dba_segments
                            WHERE OWNER = 'TEST')
  GROUP BY tablespace_name
) b
WHERE a.tablespace_name = b.tablespace_name
ORDER BY a.tablespace_name

1 个答案:

答案 0 :(得分:3)

简短回答:Postgres中没有等效的查询。

Postgres中的表空间概念完全与Oracle的表空间概念不同。 Postgres没有容器文件。 As documented in the manual每个表都存储在特定于该表的一个(或多个文件)中。表空间只不过是硬盘上的一个目录。

因此,在Postgres中不存在(或必要)DBA_FREE_SPACE之类的东西。

要计算单个数据库的大小,您可以使用例如

select pg_database_size('my_database_name');

要计算架构中所有表的大小,请使用

select table_schema,
       table_name,
       pg_size_pretty(pg_total_relation_size (format('%I.%I', table_schema, table_name)))
from information_schema.tables
where table_schema not in ('information_schema', 'pg_catalog')
order by pg_total_relation_size(format('%I.%I', table_schema, table_name)) desc;