这是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
答案 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;