Oracle 表压缩技术 SQL

Oracle 表压缩技术 SQL

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


1. 概述

表压缩节省空间[1]:

类型

  • Basic Table Compression
  • OLTP Table Compression
  • Advanced Row Compression
  • Hybrid Columnar Compression (HCC)

详细见:Oracle 表压缩技术


2. Basic Compression

2.1 创建

CREATE TABLE sales COMPRESS BASIC;

-- 或
CREATE TABLE sales (...) COMPRESS;

2.2 适用

  • 批量加载
  • 只读/少量更新
  • 数据仓库

2.3 限制

- 仅直接路径加载生效
- DML 不压缩
- 不适合 OLTP

3. OLTP Compression

3.1 创建

CREATE TABLE employees COMPRESS FOR OLTP;

3.2 适用

  • OLTP
  • 频繁 DML
  • 通用

3.3 特性

- DML 也压缩
- 性能影响小
- 节省 2-4x 空间

4. Advanced Row Compression(12c+)

4.1 创建

CREATE TABLE employees COMPRESS ADVANCED LOW;

4.2 特性

- OLTP 改进
- 低开销
- 高压缩

5. Advanced Compression HIGH

5.1 创建

CREATE TABLE sales COMPRESS ADVANCED HIGH;

5.2 适用

  • 数据仓库
  • 历史数据
  • 只读

6. HCC(Exadata)

6.1 类型

-- Query Low
CREATE TABLE sales COMPRESS FOR QUERY LOW;

-- Query High
CREATE TABLE sales COMPRESS FOR QUERY HIGH;

-- Archive Low
CREATE TABLE sales COMPRESS FOR ARCHIVE LOW;

-- Archive High
CREATE TABLE sales COMPRESS FOR ARCHIVE HIGH;

6.2 压缩比

类型压缩比性能
Query Low4-6x
Query High8-10x
Archive Low10-15x
Archive High15-30x极低

7. 修改压缩

7.1 ALTER

ALTER TABLE sales COMPRESS FOR OLTP;
ALTER TABLE sales NOCOMPRESS;

7.2 MOVE

-- 重建压缩
ALTER TABLE sales MOVE COMPRESS FOR OLTP;
ALTER TABLE sales MOVE COMPRESS FOR ARCHIVE HIGH;

7.3 在线索引

ALTER TABLE sales MOVE COMPRESS FOR OLTP ONLINE;

8. 分区压缩

8.1 不同分区不同压缩

CREATE TABLE sales (...)
PARTITION BY RANGE (sale_date) (
  PARTITION p2024 VALUES LESS THAN (...) COMPRESS FOR ARCHIVE HIGH,
  PARTITION p2025 VALUES LESS THAN (...) COMPRESS FOR QUERY LOW,
  PARTITION p2026 VALUES LESS THAN (...) COMPRESS FOR OLTP
);

8.2 修改

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

9. LOB 压缩

9.1 SecureFiles

CREATE TABLE docs (
  id NUMBER,
  content CLOB
) LOB(content) STORE AS SECUREFILE (
  COMPRESS HIGH
  DEDUPLICATE
  CACHE
);

9.2 修改

ALTER TABLE docs MODIFY LOB(content) (
  COMPRESS HIGH
);

10. 索引压缩

10.1 前缀压缩

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

10.2 高级

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

11. 压缩效果

11.1 查看

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

11.2 大小对比

SELECT 
  segment_name,
  bytes / 1024 / 1024 AS mb
FROM user_segments
WHERE segment_name IN ('SALES_COMP', 'SALES_NOCOMP');

11.3 压缩比

SELECT 
  table_name,
  num_rows,
  blocks,
  ROUND(num_rows / blocks, 2) AS rows_per_block
FROM user_tables
WHERE table_name LIKE 'SALES%';

12. 性能影响

12.1 优势

  • 空间节省
  • I/O 减少
  • Buffer Cache 高效
  • 查询快

12.2 开销

  • CPU 增加
  • DML 略慢
  • 解压 CPU

13. 压缩策略

13.1 OLTP

-- Advanced Row Compression
COMPRESS ADVANCED LOW

13.2 数据仓库

-- 活跃数据
COMPRESS FOR QUERY LOW

-- 历史数据
COMPRESS FOR ARCHIVE HIGH

13.3 归档

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

14. 常见坑与排错

14.1 压缩无效

-- Basic 仅直接路径
-- INSERT /*+ APPEND */ INTO ...

14.2 性能下降

-- 1. 高压缩 CPU
-- 2. 改 LOW
-- 3. 测试

14.3 MOVE 锁表

-- ONLINE
ALTER TABLE ... MOVE ... ONLINE;

15. 最佳实践

  1. OLTP 用 Advanced Row:兼容 DML
  2. 仓库用 Query:平衡
  3. 归档用 Archive:节省
  4. 分区不同压缩:分级
  5. 在线 MOVE:不影响业务
  6. LOB SecureFiles:现代
  7. 索引压缩:复合
  8. 测试验证:效果
  9. 监控空间:收益
  10. 文档化:策略

16. 参考资料

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