小伙伴们在日常建表和维护的时候,有没有尝试压缩功能,提高查询速度、压缩空间、导出导入快,功能是真香。OCM考试时候也是必考项目。SQL直接使用压缩字段即可,用sqldeveloper图形界面也可以选择,当时速度慢一些。
一、Oracle Advanced Compression 的特性主要功能
减少数据库存储
数据库存储减少 50%(或更多)使用 Oracle Advanced Compression 将整体数据库存储减少至少 2 倍,在实施过程中几乎不会中断。
推迟将来的数据库存储购买或租赁(上云就有体会了或是本地用上全闪的时候成本高)
减小应用程序数据库的总数据大小,以更好地利用现有数据库存储并降低未来的增长。
提高查询性能
数据在内存中保持压缩状态,在数据库中构建压缩功能使 Oracle Database 可以直接在内存中读取压缩数据和索引。
提高了缓冲区缓存效率
Oracle Database 压缩对读取作没有不利影响,并且数据库的缓冲区缓存在不增加内存的情况下存储更多数据,从而提高了效率。
更快的 RMAN 备份和恢复
在 RMAN 备份期间,数据保持压缩状态
压缩数据在 RMAN 备份期间保持压缩状态,无需在恢复前解压缩,从而减少备份存储需求,并可能缩短备份和还原时间。
其他级别的 RMAN 备份压缩
Oracle Advanced Compression 提供三个级别的 RMAN 备份压缩:低、中和高。节省的存储空间从低增加到高,并且通常比 RMAN 基本压缩使用的 CPU 资源少。
减少网络流量
网络压缩,高级网络压缩(Advanced Network Compression,也称为 SQL 网络数据压缩)在传输过程中压缩网络数据以减少网络流量。
Data Guard 重做传输压缩
Data Guard 重做传输服务将重做数据传输到备用站点。重做数据使用 Oracle Advanced Compression 进行压缩,然后以压缩形式传输。这减少了网络带宽消耗和重做数据的传输时间。
100% 应用程序透明度
无需更改应用程序或特殊硬件,Oracle Database 压缩内置于数据库中,无需更改应用程序即可运行 Oracle Advanced Compression。
二、使用场景:
- 历史数据归档优化
- 数据仓库中访问频率随年限急剧下降的历史数据(如5年前数据访问率<0.1%),通过高压缩比技术(如HCC归档压缩)解决存储成本倒挂问题。典型场景如医疗各种描述信息、缴费数据、费用清单等需长期留存但低频访问的数据,压缩比可达10-15倍。
- 数仓查询性能加速
- 针对海量数据的分析场景(如亿级销售报表查询),压缩技术通过减少物理I/O量(压缩后数据量可降至1/3)实现查询加速。关键原理:磁盘读取时间缩减量 > 内存解压耗时,整体查询性能提升30%-50%,特别适合BI报表、聚合分析等IO密集型操作。
- OLTP系统存储优化
- 高吞吐事务系统采用分层压缩策略:
- 热数据(当天产生):禁用压缩保障写入性能
- 温数据(近7天):启用OLTP压缩(3-4x)平衡性能与空间
- 冷数据(超30天):迁移至HCC压缩分区通过定时任务在业务低谷期执行压缩迁移(示例:每日凌晨ALTER TABLE MOVE分区转换压缩算法)
谨慎的场景:存在大字段(如CLOB备注)且需高频update的表,压缩将引发行迁移导致性能崩塌。必须采用"解压→更新→压缩"三步。
三、Oracle压缩技术
- 基础表压缩 (Basic Table Compression)
- 原理:在数据块级别消除重复值,仅对直接路径插入(如INSERT /*+ APPEND */)有效
- 适用场景:数据仓库批量加载
- 高级行压缩 (Advanced Row Compression)
- 原理:使用智能字典算法实时压缩所有DML操作
- 优势:OLTP场景友好,压缩率高达2-4倍
- 混合列压缩 (Hybrid Columnar Compression, HCC)
- 原理:结合行/列存储优势,按列组织相似数据
- 级别:
- QUERY LOW:平衡性能与压缩
- ARCHIVE HIGH:最高压缩比(10x+)
- 存储层级压缩 (Storage Tiering)
- 原理:基于数据冷热自动切换压缩级别
各个步骤示例:
-
CREATE TABLE sales COMPRESS BASIC AS SELECT * FROM raw_data; ALTER TABLE orders ROW STORE COMPRESS ADVANCED; CREATE TABLE logs COLUMN STORE COMPRESS FOR ARCHIVE HIGH; ALTER TABLE orders ILM ADD POLICY COLUMN STORE COMPRESS FOR QUERY AFTER 30 DAYS OF NO MODIFICATION;
四、压缩功能实操脚本SQL验证
也使用在建表时候用sqldeveloper图形化选择具体列的压缩选项
-- 创建OLTP压缩表
CREATE TABLE customer_orders_oltp (
order_id NUMBER PRIMARY KEY,
cust_id NUMBER NOT NULL,
order_date DATE DEFAULT SYSDATE,
order_desc VARCHAR2(2000)
) COMPRESS FOR OLTP;
-- 插入10万条测试数据
INSERT /*+ APPEND */ INTO customer_orders_oltp
SELECT
ROWNUM,
MOD(ROWNUM,1000),
SYSDATE - MOD(ROWNUM,365),
RPAD('ORDER',1000,'*')
FROM dual CONNECT BY LEVEL <= 100000;
COMMIT;
-- 验证压缩效果
SELECT
table_name,
compression,
compress_for,
blocks AS compressed_blocks
FROM user_tables
WHERE table_name = 'CUSTOMER_ORDERS_OLTP';
--
TABLE_NAME COMPRESSION COMPRESS_FOR COMPRESSED_BLOCKS
_______________________ ______________ _______________ ____________________
CUSTOMER_ORDERS_OLTP ENABLED ADVANCED
CUSTOMER_ORDERS_OLTP
ENABLED ADVANCED
-- 对比未压缩表
CREATE TABLE customer_orders_nocomp
NOCOMPRESS
AS
SELECT * FROM customer_orders_oltp WHERE 1=0;
INSERT /*+ APPEND */ INTO customer_orders_nocomp
SELECT * FROM customer_orders_oltp;
SELECT blocks AS nocomp_blocks
FROM user_tables
WHERE table_name = 'CUSTOMER_ORDERS_NOCOMP';
NOCOMP_BLOCKS
________________
-- 收集统计信息
EXEC DBMS_STATS.GATHER_TABLE_STATS(USER, 'CUSTOMER_ORDERS_OLTP');
EXEC DBMS_STATS.GATHER_TABLE_STATS(USER, 'CUSTOMER_ORDERS_NOCOMP');
-- 预期结果:
-- OLTP压缩表:COMPRESSION='ENABLED', COMPRESS_FOR='ADVANCED'
-- 非压缩表:COMPRESSION='DISABLED'
-- 查询压缩信息和块数
SELECT
table_name,
compression,
compress_for,
blocks AS compressed_blocks
FROM user_tables
WHERE table_name IN ('CUSTOMER_ORDERS_OLTP', 'CUSTOMER_ORDERS_NOCOMP');
TABLE_NAME COMPRESSION COMPRESS_FOR COMPRESSED_BLOCKS
_________________________ ______________ _______________ ____________________
CUSTOMER_ORDERS_NOCOMP DISABLED 14286
CUSTOMER_ORDERS_OLTP ENABLED ADVANCED 369
压缩组合使用
--更新测试
-- 测试OLTP压缩表更新
UPDATE customer_orders_oltp
SET order_desc = 'UPDATED_'||order_desc
WHERE order_id BETWEEN 10000 AND 10100;
-- 分区表压缩策略模板
CREATE TABLE tiered_storage (
id NUMBER,
create_date DATE,
data BLOB
)
PARTITION BY RANGE (create_date) (
PARTITION p_current VALUES LESS THAN (TO_DATE('2024-01-01','YYYY-MM-DD'))
COMPRESS FOR OLTP,
PARTITION p_warm VALUES LESS THAN (TO_DATE('2023-01-01','YYYY-MM-DD'))
COLUMN STORE COMPRESS FOR QUERY HIGH,
PARTITION p_cold VALUES LESS THAN (MAXVALUE)
COLUMN STORE COMPRESS FOR ARCHIVE HIGH
);
--压缩操作规范
--使用在线重定义减少停机
BEGIN
DBMS_REDEFINITION.START_REDEF_TABLE(
uname => 'SCOTT',
orig_table => 'SALES_OLD',
int_table => 'SALES_NEW'
);
END;
/
--并行压缩加速
ALTER TABLE sales_data MOVE PARTITION p_2023
COMPRESS FOR ARCHIVE HIGH PARALLEL 32;
五、Oracle压缩技术全景图
- 核心压缩技术对比
类型 |
适用版本 |
压缩原理 |
最佳场景 |
压缩比 |
基础行压缩 |
11g+ |
块内重复值替换 |
OLTP高频更新 |
2-4x |
OLTP压缩 |
12c+ |
动态符号表+避免行迁移 |
OLTP混合负载 |
3-5x |
HCC查询压缩 |
11g+ |
列式存储+压缩单元(CU) |
数据仓库查询 |
6-10x |
HCC归档压缩 |
11g+ |
大压缩单元+高效算法 |
历史数据归档 |
10-15x |
AI增强HCC |
23ai |
机器学习+向量化处理 |
智能分层存储 |
15-20x |
六、23 ai Improved HCC(需要独立许可)
1. AI智能分层压缩
- 动态策略:通过机器学习自动分析数据访问频率,实现压缩策略的动态切换:
- 热数据(高频读写):采用OLTP压缩(3-4倍压缩比),保障事务性能。
- 冷数据(低频访问):启用HCC归档压缩(15倍以上压缩比),最大化存储效率。
- 技术实现基于预测编码模型(如线性回归)分析数据模式,仅存储预测误差信息,显著减少冗余。
2. 向量化集成
- 向量数据类型支持:新增VECTOR原生数据类型,支持将非结构化数据(文档、图像)编码为向量后直接存入HCC压缩单元。
- 免解压向量搜索:通过VECTOR_DISTANCE()等运算符在压缩状态下执行相似性搜索,避免解压带来的CPU开销,查询速度提升10倍以上。
- 与业务数据联合查询:支持在单一SQL中同时检索向量数据(语义匹配)和结构化业务数据(如价格、库存),实现混合过滤