Oracle没有ALTER STORAGE独立语句,修改已有表存储参数须用ALTER TABLE ... PCTFREE等子句,STORAGE仅在建表或MOVE时生效,本地管理表空间不支持DEFAULT STORAGE修改。
ALTER STORAGE 不能直接用于已存在表
oracle 没有 alter storage 这个独立语句。你查到的“alter storage”多半是误记或混淆了语法——实际修改已有表的存储参数,必须用 alter table ... storage 或更常见的 alter table ... pctfree 等子句。
常见错误现象:ORA-00900: invalid SQL statement 就是因为写了不存在的 ALTER STORAGE 命令。
- 创建表时才能用
STORAGE (INITIAL 64K NEXT 128K ...) - 修改已有表的存储参数,只能逐项调整:
PCTFREE、PCTUSED、FREELISTS、FREELIST GROUPS,或触发 extent 分配(如ALLOCATE EXTENT) -
STORAGE子句本身不可被ALTER TABLE直接重写;它只在建表或MOVE表时生效
修改 PCTFREE / PCTUSED 要看数据访问模式
这两个参数直接影响块内空间复用效率和 I/O 行为,不是调高/低就一定好。
- 高
PCTUSED(比如 80)→ 块稍一空就进 freelist → 更快复用空间,但插入时频繁找块,I/O 上升 - 低
PCTUSED(比如 10)→ 块要几乎清空才进 freelist → 插入更倾向扩展新 extent,减少争用,但浪费空间 -
PCTFREE太小(如 5)→ 容易产生 chained rows,尤其带LONG RAW或大字段时 - 典型值参考:
PCTFREE 10+PCTUSED 40是 OLTP 场景较平衡的起点
执行示例:ALTER TABLE scott.product PCTFREE 15 PCTUSED 45;
ALLOCATE EXTENT 不改变 NEXT_EXTENT 值
手动分配 extent 是为了立即获得物理空间,常用于避免高峰时动态分配延迟,但它不更新数据字典中预设的增长策略。
-
ALLOCATE EXTENT只按当前NEXT_EXTENT值(来自DBA_TABLES.NEXT_EXTENT)或表空间默认值分配,不会刷新该值 - 即使你后来改了表的
STORAGE参数,已分配的 extent 不受影响,新 extent 才会按新规则来 - 查询是否生效:用
SELECT SEGMENT_NAME, EXTENTS FROM DBA_SEGMENTS WHERE OWNER='SCOTT' AND SEGMENT_NAME='PRODUCT';
注意:本地管理表空间(LMT)下,ALLOCATE EXTENT 的 size 可能被自动对齐(如 AUTOALLOCATE 模式下强制为 64K/1M/8M),不受你指定影响。
本地管理表空间无法修改 DEFAULT STORAGE
如果你的表空间是本地管理(绝大多数 Oracle 10g+ 默认),ALTER TABLESPACE ... DEFAULT STORAGE 会报 ORA-25143 错误。
- 原因:LMT 使用位图管理空间,不再依赖
INITIAL/NEXT等传统 storage 参数 - 真正可控的是区大小策略:
AUTOALLOCATE(Oracle 自动选)或UNIFORM SIZE 1M - 想让某张表“看起来”有更大 initial,只能在
MOVE表时显式指定:ALTER TABLE t MOVE STORAGE(INITIAL 4M);
这点最容易被忽略:你在 DBA_TABLESPACES 里看到的 INITIAL_EXTENT 字段对 LMT 表空间只是兼容性展示,不参与实际分配逻辑。











