Oracle Table Compression 详解
Oracle Table Compression 详解
适用版本:Oracle Database 10g / 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07
1. 概述
表压缩减少存储空间[1]:
详细见:Oracle Advanced Compression 详解、Oracle 数据块结构与 PCTFREE PCTUSED。
2. 压缩类型
2.1 Basic
- 直接路径
- 10g+
- 压缩比 2-4x
2.2 OLTP
- 所有操作
- 11g+
- Advanced Compression
2.3 Warehouse
- 仓库
- Exadata HCC
- 压缩比 3-5x
2.4 Archive
- 归档
- Exadata HCC
- 压缩比 10-20x
3. 创建
3.1 创建时
CREATE TABLE emp (
id NUMBER,
name VARCHAR2(100)
) COMPRESS FOR OLTP;
3.2 修改
ALTER TABLE emp COMPRESS FOR OLTP;
ALTER TABLE emp MOVE COMPRESS FOR OLTP;
ALTER TABLE emp MOVE COMPRESS FOR OLTP ONLINE;
3.3 分区
ALTER TABLE sales MODIFY PARTITION p2025_01
COMPRESS FOR OLTP;
4. 原理
4.1 符号表
- 重复值
- 符号
- 引用
4.2 块级
- 块内压缩
- 独立
- 不跨块
4.3 OLTP
- 直接路径 + DML
- 自动
- 控制
5. 参数
5.1 COMPRESS
COMPRESS
COMPRESS BASIC
COMPRESS FOR OLTP
COMPRESS FOR QUERY
COMPRESS FOR ARCHIVE
5.2 PCTFREE
- 压缩块 PCTFREE 0
- 建议
- DML
6. 查看
6.1 视图
SELECT table_name, compression, compress_for
FROM user_tables;
SELECT table_name, partition_name, compression, compress_for
FROM user_tab_partitions;
6.2 大小
SELECT segment_name, bytes/1024/1024 AS mb
FROM user_segments;
7. 性能
7.1 优势
- I/O 减少
- Buffer Cache
- 网络
7.2 开销
- CPU
- DML
- 监控
7.3 平衡
- I/O 受限:好
- CPU 受限:评估
- 监控
8. 压缩比
8.1 计算
-- 压缩前
SELECT SUM(bytes) FROM user_segments WHERE segment_name = 'EMP';
-- 压缩后
SELECT SUM(bytes) FROM user_segments WHERE segment_name = 'EMP';
8.2 估算
- Basic:2-4x
- OLTP:2-4x
- Query:3-5x
- Archive:10-20x
9. 应用场景
9.1 OLTP
- FOR OLTP
- DML
- 节省
9.2 仓库
- FOR QUERY
- 大表
- 性能
9.3 归档
- FOR ARCHIVE
- 历史
- 节省
10. 监控
10.1 压缩
SELECT table_name, compression, compress_for, num_rows, blocks
FROM user_tables
WHERE compression = 'ENABLED';
10.2 性能
SELECT name, value FROM v$sysstat
WHERE name LIKE '%compress%';
11. 常见问题
11.1 DML 慢
- OLTP 压缩
- CPU
- 监控
11.2 压缩比低
- 数据类型
- 评估
11.3 重新压缩
- MOVE
- ONLINE
- 监控
12. 最佳实践
- OLTP:FOR OLTP
- 仓库:FOR QUERY
- 归档:FOR ARCHIVE
- MOVE ONLINE:生产
- 监控:CPU/IO
- 测试:性能
- PCTFREE:调整
- 分区:按需
- 文档:配置
- 演练:定期
13. 参考资料
[1] Oracle Database Administrator’s Guide 19c, “Table Compression” https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/