Oracle 表压缩技术

Oracle 表压缩技术

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


1. 概述

表压缩减少存储、提升 I/O 性能[1]:

类型说明
Basic Table CompressionOLAP
OLTP Table CompressionOLTP
Row Level Compression行级
Columnar Compression列式
Hybrid Columnar Compression (HCC)Exadata

2. Basic 压缩

2.1 创建

CREATE TABLE sales (
  id NUMBER,
  sale_date DATE,
  amount NUMBER
) COMPRESS BASIC;

2.2 直接路径加载

-- 仅直接路径插入压缩
INSERT /*+ APPEND */ INTO sales SELECT * FROM sales_source;

2.3 限制

  • 仅直接路径插入
  • 普通 DML 不压缩

3. OLTP 压缩(11g+)

3.1 创建

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

3.2 优势

  • 所有 DML 压缩
  • 适合 OLTP

3.3 修改

ALTER TABLE employees COMPRESS FOR OLTP;
ALTER TABLE employees NOCOMPRESS;

4. 行级压缩

4.1 工作原理

  • 重复值存储一次
  • 符号表
  • 块内去重

4.2 压缩比

  • 2-4 倍

5. HCC(Exadata/Pillar)

5.1 类型

类型说明
COMPRESS FOR QUERY LOW查询优先低
COMPRESS FOR QUERY HIGH查询优先高
COMPRESS FOR ARCHIVE LOW归档低
COMPRESS FOR ARCHIVE HIGH归档高

5.2 创建

CREATE TABLE archive_sales (
  ...
) COMPRESS FOR ARCHIVE HIGH;

5.3 压缩比

  • 10-15 倍

5.4 限制

  • 仅 Exadata/Pillar
  • DML 性能影响

6. 索引压缩

6.1 前缀压缩

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

-- 重建
ALTER INDEX idx_emp REBUILD COMPRESS 1;

6.2 适用

  • 复合索引重复前缀
  • 节省空间

7. LOB 压缩(SECUREFILES)

7.1 创建

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

7.2 压缩级别

  • LOW:快
  • MEDIUM:默认
  • HIGH:压缩比高

8. 压缩效果

8.1 查看

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

8.2 压缩比

-- 1. 压缩前大小
SELECT segment_name, bytes FROM dba_segments WHERE segment_name = 'EMPLOYEES';

-- 2. 压缩
ALTER TABLE employees MOVE COMPRESS FOR OLTP;

-- 3. 压缩后大小
SELECT segment_name, bytes FROM dba_segments WHERE segment_name = 'EMPLOYEES';

-- 压缩比 = 压缩前 / 压缩后

9. 应用场景

9.1 历史数据归档

CREATE TABLE sales_history (
  ...
) COMPRESS FOR ARCHIVE HIGH
PARTITION BY RANGE (sale_date) (...);

9.2 OLTP 表

CREATE TABLE orders (
  ...
) COMPRESS FOR OLTP;

9.3 大表分区

CREATE TABLE sales (
  ...
) PARTITION BY RANGE (sale_date) (
  PARTITION p2025 VALUES LESS THAN (...) COMPRESS BASIC,
  PARTITION p2026 VALUES LESS THAN (...) COMPRESS FOR OLTP,
  PARTITION p2027 VALUES LESS THAN (...) NOCOMPRESS
);

10. 压缩与性能

10.1 优势

  • 减少 I/O
  • 提升扫描性能
  • 节省存储
  • Buffer Cache 利用率高

10.2 劣势

  • CPU 开销
  • DML 性能影响
  • 重建开销

11. 常见坑与排错

11.1 压缩不生效

-- 1. 检查 COMPRESS 选项
-- 2. 检查是否直接路径(Basic)
-- 3. MOVE 重新压缩
ALTER TABLE employees MOVE COMPRESS FOR OLTP;

11.2 性能下降

-- 1. CPU 高:减少压缩
-- 2. DML 慢:测试 OLTP 压缩
-- 3. 适当场景

11.3 索引失效

-- MOVE 导致索引失效
ALTER INDEX idx_name REBUILD;

12. 最佳实践

  1. OLTP 用 OLTP 压缩:兼容
  2. OLAP 用 Basic:高压缩
  3. HCC 归档:Exadata
  4. 分区混合:灵活
  5. LOB 用 SECUREFILE:现代
  6. 测试压缩比:效益
  7. 监控 CPU:影响
  8. 索引压缩:复合索引
  9. 重建定期:碎片
  10. 平衡 I/O vs CPU:整体

13. 参考资料

[1] Oracle Database Concepts 19c, “Table Compression” https://docs.oracle.com/en/database/oracle/oracle-database/19/cncpt/table-compression.html