达梦DM8查表空间使用率需执行SQL:SELECT a.tablespace_name, ROUND(a.bytes/1024/1024,2) AS "sum_mb", ROUND((a.bytes-b.bytes)/1024/1024,2) AS "used_mb", ROUND(b.bytes/1024/1024,2) AS "free_mb", ROUND((a.bytes-b.bytes)/a.bytes*100,2) AS "percent_used" FROM (SELECT tablespace_name, SUM(bytes) bytes FROM dba_data_files GROUP BY tablespace_name) a JOIN (SELECT tablespace_name, SUM(bytes) bytes FROM dba_free_space GROUP BY tablespace_name) b ON a.tablespace_name = b.tablespace_name;须确保用户有DBA_DATA_FILES和DBA_FREE_SPACE查询权限,驱动类为dm.jdbc.driver.DmDriver。

能直接查,但方式取决于你连的是哪种数据库——MySQL、PostgreSQL、达梦(DM)、Oracle 的系统视图和函数完全不同,DBeaver 本身不内置统一的空间统计逻辑,它只是执行你写的 SQL 或展示驱动返回的元数据。
MySQL:用 SHOW TABLE STATUS 或 information_schema.tables
MySQL 没有“表空间”概念(InnoDB 默认共享表空间,5.7+ 支持独立表空间但不暴露为可查的逻辑单位),所以实际查的是单表或库级大小:
-
SHOW TABLE STATUS LIKE 'your_table_name';返回Data_length、Index_length、Data_free等字段,单位是字节 - 更灵活的写法是查
information_schema.tables:SELECT TABLE_NAME AS table_name, ROUND((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024, 2) AS size_mb, TABLE_ROWS AS rows FROM information_schema.tables WHERE TABLE_SCHEMA = 'your_db_name' AND TABLE_NAME = 'your_table_name';
- 注意
TABLE_ROWS是估算值,MyISAM准确,InnoDB可能偏差大;Data_free不代表可用空间,而是已分配但未使用的空间
PostgreSQL:靠 pg_total_relation_size() 系列函数
PostgreSQL 表空间(tablespace)是真实存在的物理目录,但单表大小统计通常不跨表空间聚合,而是按表/索引/TOAST 分层看:
-
pg_total_relation_size(relid)包含表数据 + 所有索引 + TOAST 表;pg_relation_size(relid)只算主表数据 - 常用查询示例:
SELECT schemaname AS schema, relname AS table_name, pg_size_pretty(pg_total_relation_size(oid)) AS total_size, pg_size_pretty(pg_relation_size(oid)) AS data_size, pg_size_pretty(pg_total_relation_size(oid) - pg_relation_size(oid)) AS index_toast_size FROM pg_class WHERE relkind = 'r' AND schemaname NOT IN ('pg_catalog', 'information_schema'); - 要查某个表空间整体使用率,得先查出该表空间下所有对象,再 sum 大小;没有现成视图,需 join
pg_tablespace和pg_class
达梦 DM8:查 DBA_DATA_FILES 和 DBA_FREE_SPACE
达梦兼容 Oracle 风格的表空间管理,所以可用标准 DBA 视图查使用率:
- 执行以下语句即可得到每个表空间的已用/剩余/使用率:
SELECT a.tablespace_name, ROUND(a.bytes / 1024 / 1024, 2) AS "sum_mb", ROUND((a.bytes - b.bytes) / 1024 / 1024, 2) AS "used_mb", ROUND(b.bytes / 1024 / 1024, 2) AS "free_mb", ROUND((a.bytes - b.bytes) / a.bytes * 100, 2) AS "percent_used" FROM (SELECT tablespace_name, SUM(bytes) bytes FROM dba_data_files GROUP BY tablespace_name) a JOIN (SELECT tablespace_name, SUM(bytes) bytes FROM dba_free_space GROUP BY tablespace_name) b ON a.tablespace_name = b.tablespace_name;
- 确保当前用户有访问
DBA_DATA_FILES和DBA_FREE_SPACE的权限,普通用户可能只能查USER_TABLESPACES或需切换到SYSDBA - 达梦默认端口是
5236,驱动类必须设为dm.jdbc.driver.DmDriver,否则元数据查询会失败或返回空
为什么图形界面点“属性”有时看不到大小?
DBeaver 的“属性”面板是否显示大小,完全取决于 JDBC 驱动是否实现了对应元数据接口:
- MySQL 驱动(Connector/J)对
information_schema的封装较全,右键表 → Properties → “Statistics” 标签页通常能显示行数和大小(但依赖SHOW TABLE STATUS的结果) - PostgreSQL 驱动(pgjdbc)不主动拉取
pg_size_*函数结果,所以“属性”里一般只显示 OID、Owner、Comment,不显示磁盘大小 - 达梦驱动若版本旧或未正确加载,Properties 里可能连“Storage”标签都不出现——此时必须走 SQL 查询
- 别依赖界面自动刷新:即使查过一次,换库、切用户、重启 DBeaver 后,缓存元数据可能过期,需手动重查
真正容易被忽略的是权限和驱动版本匹配问题:同一个 SQL,在命令行能跑通,在 DBeaver 里报错或返回空,八成是驱动没选对,或者当前连接用户没被授 SELECT_CATALOG_ROLE(达梦)或 pg_read_all_data(PG)。先确认驱动类名和 URL 模板对不对,再查权限,比反复改 SQL 有效得多。










