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 |
|---|---|---|
| Basic | 2-4x | 直接路径 |
| OLTP | 2-3x | 支持 |
| Query Low | 4x | 限制 |
| Query High | 6x | 限制 |
| Archive Low | 8x | 限制 |
| Archive High | 15x | 限制 |
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. 最佳实践
- OLTP 压缩:OLTP
- Warehouse:仓库
- Archive:历史
- SECUREFILE LOB:大对象
- 索引压缩:复合
- MOVE ONLINE:业务
- UPDATE INDEXES:索引
- 分区压缩:选择性
- 监控:空间
- 测试:验证
13. 参考资料
[1] Oracle Database Administrator’s Guide 19c, “Table Compression” https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/