Bigfile表空间不支持ALTER TABLESPACE ... RESIZE语法,仅能通过ALTER DATABASE DATAFILE ... RESIZE调整唯一数据文件;Smallfile表空间虽也不支持该语法,但可逐个调整多个数据文件,且支持ADD/DROP DATAFILE操作。

Bigfile 表空间不能和 Smallfile 表空间混用同一个 ALTER TABLESPACE ... RESIZE 语法 —— 这是最容易踩坑的地方。
Bigfile 表空间只允许一个数据文件,且不支持 RESIZE 表空间级操作
你执行 ALTER TABLESPACE big01 RESIZE 100G 会直接报错 ORA-02231: missing or invalid option,因为 Bigfile 表空间本身不接受表空间维度的大小调整。它只允许通过 ALTER DATABASE DATAFILE ... RESIZE 调整那个唯一的数据文件:
ALTER DATABASE DATAFILE '/u01/app/oracle/oradata/DEMO/bftbs01.dbf' RESIZE 100G;
而 Smallfile 表空间虽然也不能直接 RESIZE(会报 ORA-32773),但它是“多文件”的,所以你得逐个调整每个 DATAFILE;Bigfile 则省去了选文件这步,但代价是失去灵活性。
- Bigfile 表空间创建后,
ADD DATAFILE操作非法(ORA-32771) - Smallfile 表空间可以
ADD DATAFILE、DROP DATAFILE,但不能RESIZE TABLESPACE - 两者都支持
AUTOEXTEND ON,但 Bigfile 的自动扩展更关键——毕竟没别的文件可加
块地址(ROWID)寻址机制不同,直接影响最大文件尺寸
Smallfile 表空间的 ROWID 用 22 位存 block 号,最多支持 2^22 - 1 ≈ 4M 个块;Bigfile 改用 32 位,支持 2^32 ≈ 4G 个块。最终容量差异取决于 DB_BLOCK_SIZE:
- 若
DB_BLOCK_SIZE = 8K:Smallfile 单文件上限 ≈ 32G,Bigfile 单文件上限 ≈ 32TB - 若
DB_BLOCK_SIZE = 32K:Smallfile 上限 ≈ 128G,Bigfile 上限 ≈ 128TB - 实际能到多大,还受限于操作系统单文件大小限制(如旧版 NTFS 是 2TB,Linux XFS 通常支持 500TB+)
注意:这个 32 位寻址是硬编码在 Bigfile 表空间元数据里的,创建后不可变更。
管理开销与 SGA/控制文件影响明显
Bigfile 表空间把 1024 个 Smallfile 数据文件压缩成 1 个,带来的真实收益不是“省磁盘”,而是降低数据库内核负担:
- 控制文件里每条数据文件记录约占用 500 字节,1024 个文件 ≈ 500KB;换成 1 个 Bigfile,省下近 500KB 控制文件体积
- SGA 中的
X$KCFIO和V$DATAFILE相关结构体数量大幅减少,对超大库(比如数万 datafile)启动、checkpoint、DBWR 压力有可观改善 - 备份工具(如 RMAN)仍按文件粒度处理,Bigfile 单文件过大可能拖慢增量备份窗口,尤其当存储层不支持高效稀疏读时
创建时必须显式指定 BIGFILE,否则默认仍是 Smallfile
即使你在 10g+ 数据库中,CREATE TABLESPACE tbs1 DATAFILE ... 不写 BIGFILE,Oracle 仍按 Smallfile 创建。想强制用 Bigfile,必须写全:
CREATE BIGFILE TABLESPACE bftbs DATAFILE '/path/bftbs01.dbf' SIZE 1G AUTOEXTEND ON NEXT 1G MAXSIZE 32T;
反过来说,BIGFILE 关键字不能省略,也不能靠修改初始化参数全局切换;它只作用于当前语句。另外,BIGFILE 只适用于永久表空间和临时表空间,不能用于撤销表空间(UNDO)或系统表空间(SYSTEM、SYSAUX)。
真正容易被忽略的是:Bigfile 表空间一旦创建,其 BIGFILE 属性不可逆。你无法把它“降级”为 Smallfile,也无法把多个 Bigfile 合并。设计阶段就得想清楚——是追求管理简洁性,还是保留未来横向扩容的弹性。


















