为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
DM Database Server 64 V8
8.1
企业版
DB Version: 0x7000d
03134284488-20260408-321389-20200
Msg Version: 1
Gsu level(5) cnt: 102
页大小16k
从表空间数据文件视图中查找空闲空间大小, 乘以页大小后换算为MB
select CLIENT_PATH, free_size * 1.0, free_size * 1.0 * SF_GET_PAGE_SIZE() / 1024 /1024 from SYS.V$DATAFILE where GROUP_ID=5;
得到结果
通过manager管理工具查看表空间数据文件属性
为什么有的数据文件大小向上取整有的向下取整, 这个规则到底是什么样的
补充相关数据
select tablespace_name, file_name, BYTES, USER_BYTES, MAXBYTES from DBA_DATA_FILES;
| tablespace_name | file_name | BYTES | USER_BYTES | MAXBYTES |
|---|---|---|---|---|
| MAIN | /opt/dmdbms/data/DAMENG/MAIN.DBF | 134217728 | 100139008 | 35184371040256 |
| TEST1 | /opt/dmdbms/data/DAMENG/test11.dbf | 67108864 | 33030144 | 3103784960 |
| TEST1 | /opt/dmdbms/data/DAMENG/test12.DBF | 72351744 | 71827456 | 177209344 |
| TEST1 | /opt/dmdbms/data/DAMENG/test13.dbf | 73400320 | 72876032 | 177209344 |
| TEST1 | /opt/dmdbms/data/DAMENG/test14.dbf | 74448896 | 73924608 | 177209344 |
| TEST1 | /opt/dmdbms/data/DAMENG/test15.dbf | 75497472 | 74973184 | 177209344 |
| TEST1 | /opt/dmdbms/data/DAMENG/test16.dbf | 76546048 | 76021760 | 177209344 |
| ROLL | /opt/dmdbms/data/DAMENG/ROLL.DBF | 134217728 | 76021760 | 35184371040256 |
| SYSTEM | /opt/dmdbms/data/DAMENG/SYSTEM.DBF | 134217728 | 18874368 | 35184371040256 |
| TEMP | /opt/dmdbms/data/DAMENG/TEMP.DBF | 67108864 | 31981568 | 35184371040256 |
select tablespace_name, file_name, ROUND((bytes - user_bytes) * 1.0 / bytes * 100, 2) usedPer, Round((bytes - user_bytes) / MAXBYTES * 100, 2) maxPer from DBA_DATA_FILES;
| tablespace_name | file_name | usedPer | maxPer |
|---|---|---|---|
| MAIN | /opt/dmdbms/data/DAMENG/MAIN.DBF | 25.39 | 0 |
| TEST1 | /opt/dmdbms/data/DAMENG/test11.dbf | 50.78 | 1.1 |
| TEST1 | /opt/dmdbms/data/DAMENG/test12.DBF | 0.72 | 0.3 |
| TEST1 | /opt/dmdbms/data/DAMENG/test13.dbf | 0.71 | 0.3 |
| TEST1 | /opt/dmdbms/data/DAMENG/test14.dbf | 0.7 | 0.3 |
| TEST1 | /opt/dmdbms/data/DAMENG/test15.dbf | 0.69 | 0.3 |
| TEST1 | /opt/dmdbms/data/DAMENG/test16.dbf | 0.68 | 0.3 |
| ROLL | /opt/dmdbms/data/DAMENG/ROLL.DBF | 43.36 | 0 |
| SYSTEM | /opt/dmdbms/data/DAMENG/SYSTEM.DBF | 85.94 | 0 |
| TEMP | /opt/dmdbms/data/DAMENG/TEMP.DBF | 52.34 | 0 |
这种情况只在页大小为16k的情况下出现了, 4k 8k 32k都是好的

根本原因:浮点精度导致的截断
关键在于 free_size * 1.0 * SF_GET_PAGE_SIZE() 这个计算。以 free_size=4576 为例:
同理 free_size=4640:
实际精确值并不是恰好 72.5 或 71.5,而是略低于这些值。

结论
管理工具对数据文件空闲大小的显示采用的是四舍五入到整数的规则:
根本原因是两层精度处理的叠加: