表压缩新功能 compress for oltp ROW STORE COMPRESS ADVANCED ONLINE
ALTER TABLE ... COMPRESS FOR OLTP 对已有分区无效因仅设置元数据标记而不重写物理块压缩已有数据须用 MOVE PARTITION ... ROW STORE COMPRESS ADVANCED ONLINE 并重建索引。不能直接用alter table ... compress for oltp让已有分区数据变小——它只影响后续 dml不重写物理块。为什么 ALTER TABLE COMPRESS FOR OLTP 对已有分区无效执行ALTER TABLE t1 COMPRESS FOR OLTP后DBA_TAB_PARTITIONS.COMPRESS_FOR会显示ADVANCED但分区段segment大小完全不变。这是因为该语句仅设置“未来插入/更新时启用压缩”的元数据标记Oracle 不会自动扫描并重写已存在的数据块。常见误判是看到COMPRESS_FOR变了就以为压缩生效了实际空间一点没省。已有数据仍按原格式存储块内无压缩、无空闲空间回收新插入或更新的行才会被压缩进新块可能触发ROW MOVEMENT若表无主键/唯一约束后续MOVE PARTITION可能导致全局索引失效在线压缩单个分区必须用 MOVE PARTITION ONLINE真正压缩已有数据必须触发物理重写。Oracle 12c 支持在线移动分区对业务影响可控但需满足前提条件先执行ALTER TABLE t1 ENABLE ROW MOVEMENT否则报错ORA-14102目标分区不能有长事务阻塞查V$TRANSACTION和V$SESSION确认无未提交 DML使用ROW STORE COMPRESS ADVANCED ONLINE不是COMPRESS FOR OLTP后者在MOVE中不被识别命令示例ALTER TABLE t1 MOVE PARTITION p2ROW STORE COMPRESS ADVANCED ONLINE;执行期间支持 SELECT/INSERT/UPDATE/DELETE但会短暂持有 TX 锁通常毫秒级且要求表有主键或唯一索引以保证全局索引可维护。MOVE 后必须重建局部索引全局索引要检查状态局部索引LOCAL不会自动跟随分区移动必须显式重建对应分区ALTER INDEX idx_local REBUILD PARTITION p2;全局索引GLOBAL默认自动维护但可能进入UNUSABLE状态尤其当未启用ROW MOVEMENT或约束缺失时务必查DBA_INDEXES.STATUS和DBA_IND_PARTITIONS.STATUS确认全部为VALID漏掉这步会导致后续查询走全表扫描或报ORA-01502。验证压缩是否真实生效的三个硬指标别只看元数据盯住这三个值才说明压缩落地了DBA_SEGMENTS.BYTES同一分区移动前后对比MB 级下降才算数例如从 104 MB → 68 MBDBA_TAB_PARTITIONS.COMPRESS_FOR确认是ADVANCED不是BASIC或空DBA_TABLESPACE_USAGE_METRICS或V$SEGSTAT观察该分区段的logical reads是否随数据密度提升而下降间接反映压缩带来的 I/O 减少如果BYTES没变哪怕其他两项都对也等于没压缩——物理块根本没动过。