攻略1-21 为所有DML操作压缩数据

问题描述

你有一个OLTP的环境,并且注意到在从表中读取数据时存在大量的磁盘I/O。你想知道是否可以通过压缩表中数据来提高I/O性能。这里的思想是,压缩表中的数据将会使其消耗更少的物理存储,从而在读取数据时也就需要较少的I/O。

注意 高级压缩需要Oracle企业版以及高级压缩选项(需要额外的付费许可)。

解决方案

创建表时使用 ROW STORE COMPRESS ADVANCED子句,为通常的DML操作语句启用数据压缩。下面这个例子创建一张启用高级压缩的表:

enter image description here

注意 在Oracle Database 11g R2之前,高级表压缩通过COMPRESS FOR ALL OPERATIONS子句来启用。在Oracle Database 11g R2中,高级表压缩通过COMPRESS FOR OLTP来启用,在Oracle Database 12c中,修改为ROW STORE COMPRESS ADVANCED。

可以查询相应的DBA/ALL/USER_TABLES视图,验证一张表是否启用了压缩。下面这个例子假设你以表的所有者身份登录到数据库:

enter image description here

工作原理

ROW STORE COMPRESS ADVANCED子句为所有DML操作启用压缩。高级压缩并不会在数据插入或修改时马上压缩,而是在数据块中的修改达到一定阈值时,成批次来进行压缩。当达到阈值时,所有未压缩的数据行将会同时进行压缩。需要进行压缩的阈值由一种内部算法(你并不能控制)决定。

你也可以在表空间级别上指定高级压缩。任何在启用了高级压缩的表空间中创建的数据表,都会默认继承压缩设置。下面是指定高级压缩的表空间创建脚本:

enter image description here

目录