oracle分区表和物化视图均不自动压缩,必须显式启用compress;分区级压缩独立生效,建表时compress仅影响后续分区,已有分区需alter modify;物化视图需在create时显式加compress,且底层为独立表,不继承基表压缩属性。
oracle分区表本身不自动压缩,物化视图也不自带压缩能力;要省空间,必须显式启用 compress,且需分清「对哪个对象压」「在哪一级压」——表级压缩和物化视图基表压缩效果不叠加,但分区级压缩可精细控制冷热数据。
分区表上开启 COMPRESS 必须按分区指定
Oracle 的表压缩(COMPRESS)在分区表中不是全局开关,而是每个分区独立生效。建表时若只写 COMPRESS,仅影响后续新增分区;已有分区仍为 DISABLED。
- 创建带压缩的范围分区表:
CREATE TABLE sales_part ( sale_id NUMBER, sale_date DATE, amount NUMBER ) COMPRESS PARTITION BY RANGE (sale_date) ( PARTITION p_2025q1 VALUES LESS THAN (DATE '2025-04-01') COMPRESS, PARTITION p_2025q2 VALUES LESS THAN (DATE '2025-07-01') NOCOMPRESS );
- 对已存在分区补压缩:
ALTER TABLE sales_part MODIFY PARTITION p_2025q1 COMPRESS;
- 查压缩状态:
SELECT partition_name, compression FROM user_tab_partitions WHERE table_name = 'SALES_PART';
注意:COMPRESS 在 10g/11g 中默认是 BASIC 级别,不支持 OLTP 压缩(需 Enterprise Edition + Advanced Compression 选件),否则 ALTER TABLE ... COMPRESS FOR OLTP 会报错 ORA-64307。
物化视图基表用压缩,物化视图本身不继承压缩属性
物化视图(MATERIALIZED VIEW)本质是一张物理表,它的存储行为完全独立于其基表。即使基表所有分区都启用了 COMPRESS,物化视图默认仍是未压缩的。
- 正确做法:显式在
CREATE MATERIALIZED VIEW语句中加COMPRESS:CREATE MATERIALIZED VIEW mv_sales_daily COMPRESS BUILD IMMEDIATE REFRESH ON DEMAND AS SELECT TRUNC(sale_date) dt, SUM(amount) amt FROM sales_part GROUP BY TRUNC(sale_date);
- 如果物化视图已存在,不能直接
ALTER MATERIALIZED VIEW ... COMPRESS;只能DROP后重建,或用ALTER TABLE mv_sales_daily COMPRESS(因为 MV 底层就是普通表)。 - 验证:
SELECT table_name, compression FROM user_tables WHERE table_name = 'MV_SALES_DAILY';—— 这里查的是 MV 对应的底层表名,不是 MV 名。
常见误判:看到基表压缩了,就以为 MV 查询快、占空间小。实际 MV 表空间可能比基表还大,尤其含大量聚合字段时,没压缩就白搭。
分区 + 压缩 + 物化视图组合的典型陷阱
三者叠在一起,最容易忽略的是「数据移动」和「刷新时机」对压缩率的影响。
-
ENABLE ROW MOVEMENT必须开:如果分区键列(如sale_date)后续被更新,且新值跨分区,Oracle 需把行物理迁移。没开此选项,UPDATE 会报ORA-14402;开了但没配压缩,迁移后新位置的数据不自动压缩。 - 物化视图刷新(
REFRESH)会重写整张 MV 表,原有压缩块会被打散重建。若刷新频繁且没在CREATE时声明COMPRESS,每次刷新后压缩失效。 - 不要对高频更新的分区启用
COMPRESS:压缩表的 DML 开销明显上升,特别是BASIC压缩在 UPDATE/DELETE 时需解压-修改-再压缩,容易引发enq: TX - row lock contention。
真正省空间的关键不在“堆功能”,而在“分而治之”:冷数据分区(如 2024 年前)全开 COMPRESS,热数据分区(当季)保持 NOCOMPRESS,物化视图单独按查询模式压缩——比如只存天粒度聚合,字段少、重复高,COMPRESS 效果往往比明细表还好。











