oracle 19c中表空间默认压缩必须用default compress basic或default compress for oltp,row store compress非法;alter tablespace default compress for oltp可在线执行,仅影响后续新建表,不改变已有表,且建表时仍需避免nocompress显式覆盖。
oracle 19c 中不能用 row store compress 设置表空间默认压缩,该关键字在 ddl 中非法,直接写会报 ora-00922: missing or invalid option。真正有效的语法只有 default compress basic 或 default compress for oltp。
ALTER TABLESPACE DEFAULT COMPRESS FOR OLTP 能否在线执行
可以,只要表空间处于读写状态、不含只读数据文件,且数据库 compatible 参数 ≥ '12.2.0'(19c 默认满足),命令就无需停机:
-
ALTER TABLESPACE users DEFAULT COMPRESS FOR OLTP;立即生效,不影响当前连接或事务 - 已有表不受影响 —— 它只控制后续新创建的表的默认行为
- 如果表空间含加密或不可写的 datafile,语句会报错,需先修复状态
CREATE TABLESPACE 时指定 DEFAULT COMPRESS 的写法
建表空间时必须显式写出压缩类型,不能省略或模糊表达:
- ✅ 正确:
CREATE TABLESPACE tbs_comp DATAFILE '/u01/oradata/tbs_comp01.dbf' SIZE 100M DEFAULT COMPRESS FOR OLTP; - ❌ 错误:
CREATE TABLESPACE tbs_comp ... DEFAULT ROW STORE COMPRESS;(语法不识别) - ❌ 错误:
CREATE TABLESPACE tbs_comp ... DEFAULT COMPRESS;(缺少类型,报 ORA-00922) - BASIC 和 FOR OLTP 是仅有的两个合法后缀,
COMPRESS BASIC等价于老版本的COMPRESS
为什么新建表没压缩,明明表空间设了 DEFAULT COMPRESS
因为表级定义优先级高于表空间级,默认继承不是强制覆盖:
- ✅ 继承生效:
CREATE TABLE t1 (x INT) TABLESPACE users;(无压缩关键词,走表空间默认) - ❌ 不继承:
CREATE TABLE t1 (x INT) NOCOMPRESS TABLESPACE users;(显式禁用,覆盖表空间设置) - ❌ 不继承:
CREATE TABLE t1 (x INT) TABLESPACE users;但用户权限受限或初始化参数_use_default_compress被设为 FALSE(极少见,但存在) - 验证是否真启用:查
USER_TABLES的COMPRESSION和COMPRESS_FOR字段,别只看建表语句写了什么
COMPRESS FOR OLTP 对 UPDATE 性能的真实影响
它不是“开箱即用零代价”的压缩 —— 每次 UPDATE 都可能触发块内重组,带来隐性开销:
- 高并发单行更新场景(如订单状态频繁变更),容易引发
enq: TX - row lock contention和链式行(chained rows) - buffer busy waits 可能上升,尤其在热点块上
- 压缩收益取决于数据重复度:字段值越集中(如状态码、地区编码),空间节省越明显;随机 GUID 或加密字段几乎不压
- 测试必须用真实负载:仅看
SEGMENT_BYTES缩减比例不够,要监控 AWR 中db file sequential read和latch: cache buffers chains的变化
最容易被忽略的一点:表空间设了 DEFAULT COMPRESS FOR OLTP,不代表所有表自动获得压缩效果——你仍得检查每张表的 COMPRESSION 值是否为 ENABLED,否则可能白配。











