物化视图必须在CREATE时显式指定COMPRESS,ALTER MATERIALIZED VIEW不支持修改压缩属性,唯一方法是DROP重建或对底层表执行ALTER TABLE COMPRESS;压缩类型需按刷新频率和版本选COMPRESS FOR OLTP(企业版)或COMPRESS BASIC,并配合分区级压缩、基表压缩及日志清理才能真正节省空间。
物化视图必须在 create 时显式加 compress,否则哪怕建在压缩表空间里,数据块仍是未压缩的——这是最常被忽略的前提。
Oracle 不允许用 ALTER MATERIALIZED VIEW ... COMPRESS 修改压缩属性。物化视图底层是一张普通表,但 DDL 层不开放压缩切换。试图执行会报错:ORA-00922: missing or invalid option。
DROP 后重建,或退而求其次:对底层表执行 ALTER TABLE mv_name COMPRESS FOR OLTP(需注意权限和锁)ON COMMIT 类型的 MV 重建期间基表 DML 会阻塞mv_sales_daily,其实际存储表名通常也是 MV_SALES_DAILY(可通过 SELECT mview_name, table_name FROM user_mviews 验证)选错压缩类型会导致空间节省失效,甚至影响刷新性能。
COMPRESS BASIC:仅对直接路径操作(如 INSERT /*+ APPEND */)生效;普通 INSERT 或 UPDATE 会解压整块,后续 FAST 刷新可能反复膨胀COMPRESS FOR OLTP:支持常规 DML 压缩,适合频繁刷新的场景;但要求企业版 + Advanced Compression 选件,否则报 ORA-64307
SELECT table_name, compression, compress_for FROM user_tables WHERE table_name = 'MV_SALES_DAILY' —— 注意 compress_for 字段值单纯给整个 MV 加 COMPRESS 效果有限;分区级压缩才能切片释放冷数据。
sale_date 范围分区,MV 也得用 TRUNC(sale_date, 'MM') 分区PARTITION p_202501 COMPRESS FOR OLTP,已有分区用 ALTER MATERIALIZED VIEW mv_name MODIFY PARTITION p_202501 COMPRESS FOR OLTP
DROP PARTITION 清理,比 DELETE 或 TRUNCATE 更快且不产生大量 undo/redo加了 COMPRESS 还占满空间,大概率不是压缩没生效,而是其他环节在“偷偷吃空间”。
MLOG$)堆积:FAST 刷新依赖日志表,长期不 DBMS_MVIEW.PURGE_LOG 会导致日志膨胀,这部分不参与 MV 的 COMPRESS
COMPLETE:全量重建期间旧段未释放,临时占用双倍空间;建议改用 FAST 或 FORCE,并确保基表有日志压缩不是一劳永逸的开关,它依赖基表结构、刷新机制、分区设计三者协同;单独改 MV 的 COMPRESS 参数,就像只换轮胎不调四轮定位——能跑,但跑不远。