Oracle 表压缩技术
Oracle 表压缩技术
适用版本:Oracle Database 9i / 10g / 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07
1. 概述
表压缩减少存储、提升 I/O 性能[1]:
| 类型 | 说明 |
|---|---|
| Basic Table Compression | OLAP |
| OLTP Table Compression | OLTP |
| 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. 最佳实践
- OLTP 用 OLTP 压缩:兼容
- OLAP 用 Basic:高压缩
- HCC 归档:Exadata
- 分区混合:灵活
- LOB 用 SECUREFILE:现代
- 测试压缩比:效益
- 监控 CPU:影响
- 索引压缩:复合索引
- 重建定期:碎片
- 平衡 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