Advanced Compression 选件必须授权启用,查 V$OPTION 返回 TRUE 才生效;否则 COMPRESS FOR OLTP 等语法仅存元数据,不触发字典构建、不减块数、无性能提升。

Advanced Compression 选件必须先确认已授权并启用,否则所有压缩语法都只是元数据摆设
查 V$OPTION 确认 Advanced Compression 是否真正生效
执行 SELECT VALUE FROM V$OPTION WHERE PARAMETER = 'Advanced Compression',返回值必须是 TRUE。若为 FALSE,哪怕后续 ALTER TABLE ... COMPRESS FOR OLTP 执行成功,Oracle 仍按 BASIC 压缩处理——不触发字典构建、不减少物理块数、查询性能无提升。
- 常见误判:看到 DDL 不报错,就以为压缩已启用;其实
USER_TABLES.COMPRESS_FOR可能仍是空或ENABLED,而非具体级别(如OLTP) - Standard Edition 数据库即使打补丁也无法启用该选项,仅 Enterprise Edition + 单独许可有效
- 重启实例后需重新验证,某些补丁或升级可能重置该标志
COMPRESS FOR OLTP 和 COMPRESS FOR QUERY LOW 的本质区别
COMPRESS FOR OLTP(即 Advanced Row Compression)支持在线 DML 压缩维护,而 COMPRESS FOR QUERY LOW 属于 Hybrid Columnar Compression(HCC),只在直接路径操作中触发物理压缩,且仅限 Exadata 或启用 In-Memory 选项的环境。
-
COMPRESS FOR OLTP:适用于频繁更新的 OLTP 表,压缩在 INSERT/UPDATE/DELETE 时由 SMON 后台进程逐步清理未压缩行;V$SESSION_LONGOPS可观察清理进度 -
COMPRESS FOR QUERY LOW:仅在INSERT /*+ APPEND */、CREATE TABLE AS SELECT或ALTER TABLE MOVE时生效;普通 INSERT 不压缩已有数据 - 分区表可混用:
PARTITION p1 COMPRESS FOR OLTP+PARTITION p2 COMPRESS FOR QUERY LOW,但后者要求对应分区执行过直接路径加载
验证压缩是否真正落地的三个关键指标
不能只看 USER_TABLES.COMPRESS_FOR 或 DDL 是否成功,要结合段级物理变化和 I/O 行为判断:
-
DBA_SEGMENTS.BYTES显著下降(相比未压缩前同量级数据) -
V$SEGMENT_STATISTICS.PHYSICAL_READS_DIRECT升高(HCC 触发直接路径读) -
DBA_TAB_PARTITIONS.COMPRESS_FOR显示具体值(如OLTP、QUERY LOW),而非空或ENABLED - 注意:
COMPRESS(无修饰)等价于 BASIC 压缩,不依赖 Advanced Compression 许可,但也不具备 DML 自动维护能力
最容易被忽略的是:Advanced Compression 是一个独立许可项,不是数据库版本自带功能;哪怕你在 19c 中写了 COMPRESS FOR ARCHIVE HIGH,只要 V$OPTION 返回 FALSE,它就压根没走 HCC 引擎,连压缩比都不会变。


















