攻略1-20 压缩数据以进行直接路径加载

问题描述

你在使用一个DSS(decision support system,决策支持系统)类型的数据库,并且想提高一个与之相关的报表应用的性能。这样的环境中包含很多需要加载一次,然后频繁进行全表扫描的大表。你需要在加载时压缩数据,因为这样可以将数据压缩至较少的数据库块中,从而在接下来的读取过程中需要较少的I/O。由于对被压缩的数据,要读取的数据块数目较少,从而也就提高了取出数据的性能。

解决方案

使用Oracle的基本压缩特性将直接路径加载的数据压缩成堆组织表。基本压缩可以像下面这样启用。

(1) 使用ROW STORE COMPRESS子句在创建、修改或移动表时启用压缩。

(2) 通过直接路径方法(例如CREATE TABLE...AS SELECT或INSERT /*+ APPEND */)加载数据。

注意 在Oracle Database 11g R2版本之前,基本压缩指的是DSS压缩,通过COMPRESS FOR DIRECT_LOAD OPERATION来启用。这个语法在Oracle Database 11g R2中修改为COMPRESS BASIC,在12c中修改为ROW STORE COMPRESS。

下面这个例子使用CREATE TABLE...AS SELECT语句,创建启用基本压缩并使用直接路径加载数据的表:

enter image description here

上面的语句创建了一张存放压缩后数据的表。接下来所进行的任何直接路径加载操作也同样会以压缩后的格式来加载数据。

提示 下面这些子句是同义的: COMPRESS、 COMPRESS BASIC、ROW STORE COMPRESS和 ROW STORE COMPRESS BASIC。

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

enter image description here

当修改一张表,禁用其基本压缩时,并不会对表中已有的数据进行解压缩。Oracle不会对之后使用直接路径操作插入进来的数据进行压缩。如果你需要对已经存在表中的数据解压缩,则要使用MOVE NOCOMPRESS子句:

enter image description here

工作原理

基本压缩特性是Oracle企业版中一个不需要额外付费的特性。为使用基本压缩而创建或修改的堆组织表,其后续的直接路径加载操作都是以压缩格式来加载数据。要压缩这些数据,会产生一些额外的CPU开销。但在很多情况下你可能会发现,由于需要较少的I/O,这些开销被所获得的性能提升抵消了。

从性能的角度来说,使用基本压缩的主要优势在于,如果数据压缩后再加载,接下来的任何I/O操作都会使用更少的资源,因为在读写数据时需要访问更少的数据块。你需要在你的环境中测试所能够获得的性能收益。一般来说,存储大量字符数据的表适合使用基本压缩——尤其是其中的数据通过直接路径加载一次,然后通过SELECT语句进行很多次查询的场景下。

记住,Oracle的基本压缩属性对于正常的DML语句,例如INSERT、UPDATE、MERGE和DELETE没有影响。如果你希望压缩对所有DML语句起作用,那么就要考虑使用高级压缩(具体细节参见攻略1-16)。

同样也能够在分区和表空间级别上指定基本压缩。位于使用COMPRESS子句创建的表空间中的所有表,默认都会启用基本压缩。下面这个例子使用COMPRESS子句创建表空间:

enter image description here

提示 你不能从创建时启用了基本压缩的表中删除列。但你可以将这样的列标记为未使用。

目录