oracle查看表空间已分配和未分配空间的语句分享


在Oracle数据库中,要查看表空间(Tablespace)的已分配和未分配空间,可以使用多种数据字典视图,如`DBA_FREE_SPACE`、`DBA_DATA_FILES`和`DBA_TEMP_FILES`(对于临时表空间)等。但请注意,Oracle并没有直接提供一个视图来直接显示“已分配和未分配空间”的汇总信息,通常我们需要通过查询几个视图并做一些计算来得到这些信息。

以下是一个基于`DBA_DATA_FILES`和`DBA_TEMP_FILES`(假设我们只关心数据表空间和临时表空间)的示例SQL语句,用于获取每个表空间的已分配空间和可用空间(可视为未分配空间的一种估算,因为未分配空间还包括数据文件中的空闲碎片等):


SELECT
    df.tablespace_name,
    ROUND(SUM(df.bytes) / 1024 / 1024, 2) AS allocated_mb,
    ROUND(SUM(COALESCE(dfs.bytes, 0)) / 1024 / 1024, 2) AS free_mb
FROM
    dba_data_files df
LEFT JOIN
    dba_free_space dfs ON df.tablespace_name = dfs.tablespace_name
GROUP BY
    df.tablespace_name
UNION ALL
SELECT
    tf.tablespace_name,
    ROUND(SUM(tf.bytes) / 1024 / 1024, 2) AS allocated_mb,
    ROUND(SUM(COALESCE(tfs.bytes, 0)) / 1024 / 1024, 2) AS free_mb
FROM
    dba_temp_files tf
LEFT JOIN
    v$temp_space_header tfs ON tf.tablespace_name = tfs.tablespace_name
GROUP BY
    tf.tablespace_name
ORDER BY
    tablespace_name;

**注意**:

- 这个查询对于数据表空间(`dba_data_files`)和临时表空间(`dba_temp_files`)分别计算了已分配空间和可用空间(`dba_free_space` 和 `v$temp_space_header` 分别用于数据表空间和临时表空间的空闲空间查询)。

- 由于`v$temp_space_header`是一个动态性能视图,它可能不在所有Oracle安装中都可用,具体取决于Oracle的版本和配置。如果`v$temp_space_header`不可用,您可能需要查找其他方法来估算临时表空间的未分配空间。

- 请根据您的Oracle数据库版本和具体需求调整此查询。

- 这个查询提供了每个表空间的已分配空间和可用空间(作为未分配空间的一种估算),但请注意,Oracle中的空间管理更加复杂,包括空闲空间、碎片、回滚段等,因此这里的“未分配空间”只是一个近似的概念。