Oracle 表压缩技术详解

Oracle 表压缩技术详解

适用版本:Oracle Database 10g / 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07


1. 概述

Oracle 表压缩节省存储空间[1]:

详细见:Oracle 表压缩技术 SQL


2. 压缩类型

2.1 Basic Table Compression(10g+)

CREATE TABLE t (...) COMPRESS;
-- 或
ALTER TABLE t COMPRESS;
ALTER TABLE t MOVE COMPRESS;
  • 直接路径操作
  • OLTP 不压缩

2.2 OLTP Table Compression(11g+)

CREATE TABLE t (...) COMPRESS FOR OLTP;
-- 19c
CREATE TABLE t (...) COMPRESS FOR OLTP;
-- 或
CREATE TABLE t (...) ROW STORE COMPRESS ADVANCED;
  • 所有 DML
  • OLTP 友好

2.3 Warehouse Compression(Hybrid Columnar)

CREATE TABLE t (...) COMPRESS FOR QUERY;
-- Exadata
CREATE TABLE t (...) COLUMN STORE COMPRESS FOR QUERY LOW;
CREATE TABLE t (...) COLUMN STORE COMPRESS FOR QUERY HIGH;
  • Exadata
  • 列式

2.4 Archive Compression

CREATE TABLE t (...) COMPRESS FOR ARCHIVE;
-- Exadata
CREATE TABLE t (...) COLUMN STORE COMPRESS FOR ARCHIVE LOW;
CREATE TABLE t (...) COLUMN STORE COMPRESS FOR ARCHIVE HIGH;
  • 压缩比最高
  • 历史数据

3. 压缩比

类型压缩比DML
Basic2-4x直接路径
OLTP2-3x支持
Query Low4x限制
Query High6x限制
Archive Low8x限制
Archive High15x限制

4. 使用

4.1 创建

-- OLTP 压缩
CREATE TABLE employees (
  id NUMBER,
  name VARCHAR2(100),
  salary NUMBER
) COMPRESS FOR OLTP;

-- 归档
CREATE TABLE sales_archive (
  ...
) COMPRESS FOR ARCHIVE HIGH;

4.2 修改

-- 启用压缩
ALTER TABLE employees COMPRESS FOR OLTP;

-- 压缩现有数据
ALTER TABLE employees MOVE COMPRESS FOR OLTP;

-- 在线
ALTER TABLE employees MOVE COMPRESS FOR OLTP ONLINE;

-- 分区
ALTER TABLE sales MOVE PARTITION p2024 COMPRESS FOR ARCHIVE HIGH ONLINE;

4.3 LOB

CREATE TABLE t (
  id NUMBER,
  doc CLOB
) LOB (doc) STORE AS SECUREFILE (
  COMPRESS HIGH
  DEDUPLICATE
);

5. 索引

5.1 索引压缩

CREATE INDEX idx_emp ON employees(dept_id, name) COMPRESS 1;

-- 修改
ALTER INDEX idx_emp REBUILD COMPRESS 1;

5.2 前缀

- COMPRESS 1:第 1 列前缀
- COMPRESS 2:前 2 列前缀

6. 查看

6.1 表

SELECT table_name, compression, compress_for 
FROM user_tables 
WHERE compression = 'ENABLED';

6.2 分区

SELECT table_name, partition_name, compression, compress_for 
FROM user_tab_partitions 
WHERE compression = 'ENABLED';

6.3 索引

SELECT index_name, compression 
FROM user_indexes 
WHERE compression = 'ENABLED';

7. 性能影响

7.1 写

- 压缩开销
- OLTP 略低
- 批量 OK

7.2 读

- 减少 I/O
- 提高性能
- 缓冲区高效

7.3 CPU

- 压缩/解压 CPU
- I/O 减少补偿
- 平衡

8. 应用场景

8.1 OLTP

-- OLTP 压缩
CREATE TABLE employees (...) COMPRESS FOR OLTP;

8.2 数据仓库

-- Warehouse(Exadata)
CREATE TABLE sales (...) COMPRESS FOR QUERY HIGH;

8.3 归档

-- 历史数据
CREATE TABLE sales_2020 (...) COMPRESS FOR ARCHIVE HIGH;

8.4 LOB

-- 文档压缩
CREATE TABLE docs (...) LOB (content) STORE AS SECUREFILE (COMPRESS HIGH);

9. 在线操作

9.1 MOVE ONLINE

ALTER TABLE employees MOVE COMPRESS FOR OLTP ONLINE;
-- 业务不中断

9.2 分区

ALTER TABLE sales 
  MOVE PARTITION p2024 
  COMPRESS FOR ARCHIVE HIGH 
  ONLINE;

详细见:Oracle 在线重定义详解


10. 监控

10.1 空间

SELECT segment_name, 
       bytes/1024/1024 AS mb,
       blocks
FROM user_segments 
WHERE segment_name = 'EMPLOYEES';

10.2 压缩效果

-- 未压缩大小 vs 压缩大小
-- DBMS_SPACE.COMPRESS_RATIO

11. 常见坑与排错

11.1 DML 性能

- OLTP 压缩影响小
- Basic 仅直接路径

11.2 索引失效

ALTER TABLE t MOVE COMPRESS;
-- 索引失效
ALTER INDEX idx REBUILD;
-- 或 ONLINE + UPDATE INDEXES
ALTER TABLE t MOVE COMPRESS ONLINE UPDATE INDEXES;

11.3 Exadata 特性

- HCC 仅 Exadata
- 普通 DB 不支持
- Pillar / Storage

12. 最佳实践

  1. OLTP 压缩:OLTP
  2. Warehouse:仓库
  3. Archive:历史
  4. SECUREFILE LOB:大对象
  5. 索引压缩:复合
  6. MOVE ONLINE:业务
  7. UPDATE INDEXES:索引
  8. 分区压缩:选择性
  9. 监控:空间
  10. 测试:验证

13. 参考资料

[1] Oracle Database Administrator’s Guide 19c, “Table Compression” https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/