oracle表压缩技术

   oracle压缩技术分为基本表压缩(basic table compression),OLTP表压缩(OLTP table compression),索引压缩(index compression)和混合列压缩(hybrid columnar compression (HCC))。

  basic compression从9i开始推出,是oracle的默认压缩方式。OLTP compression是11g开始推出,支持所有类型的DML操作的数据压缩。压缩会节省磁盘空间,但可能会增加CPU资源的消耗。本文主要讨论常用的basic和LTOP压缩,索引压缩和HCC可以参考oracle其它文档。表压缩技术适合OLAP系统和OLTP系统中数据变化很小的历史表,不适合频繁DML操作的表

  1.1 压缩的原理

  以OLTP压缩为例,引用参考文档4的说明,原理如下

  请看一个 ACCOUNTS 表,它包含以下记录:


  在数据库内部,假定一个数据库块包含上述所有行。


  解压缩的块看上去是这样的:记录中的所有字段(列)都包含数据。压缩此块时,数据库首先计算在所有行中发现的重复值,将这些值移出行外,然后将其放在块的头部附近。行中的这些重复值将被替换为一个表示其中每个值的符号。从概念上讲,它看上去如下图所示,您可以看到压缩前后的块。


  注意这些值是如何从行中取出并放入顶部称为“符号表”的特殊区域中的。列中的每个值都被分配一个符号,此符号将替代行内的实际值。由于符号所占空间小于实际值,因此记录大小也远远小于初始值。行中的重复数据越多,符号表和块越紧凑。

  由于压缩作为触发事件发生,而不是在插入行时发生,因此在正常的 DML 进程中压缩对性能没有任何影响。压缩被触发后,对 CPU 的需求肯定会变得很高,但在其他任何时间 CPU 影响都为零,因此压缩也适用于 OLTP 应用程序,这是 Oracle Database 11g 中压缩的平衡点。

  除了减少空间占用外,压缩数据还将缩短网络传输时间、减少备份空间,并使在 QA 和测试中维护生产数据库的完整副本变得切实可行。

  1.2 basic压缩

  下面通过具体的实验来看basic压缩和OLTP压缩的效果和异同点。

  basic compression的6组实验,来比较各种情况下的表压缩

?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41

sys@MS4ADB3(dtydb5)> select count(*)from test;
 COUNT(*)
 
----------
 
    50000
 
--       1.Baseline CTAS
 
create table t1 tablespace users
as
select * from test where rownum <=50000;
 
--       2.CTAS with basic compression enabled
 
create table t2 compress basic tablespaceusers
as
select * from test where rownum <=50000;
 
--       3.Normal insert into empty table defined as compressed
 
create table t3 compress basic tablespaceusers
as
select * from test where rownum = 0;
insert into t3 select * from test whererownum <= 50000;
 
--       4.Direct path insert into empty table defined as compressed
 
create table t4 compress basic tablespaceusers
as
select * from test where rownum = 0;
 
insert /*+append*/ into t4 select * fromtest where rownum <= 50000
 
--       5.CTAS without compression, then change to compressed
 
create table t5 tablespace users
as
select * from test where rownum <=50000;
 
alter table t5 compress basic;

?

1
2
3
4
5
6

--- 6. table move compress
 
create table t6 tablespace users
as
select * from test where rownum <=50000;
alter table t6 move compress basic;

  对表做表分析

?

1
2
3
4
5
6
7
8
9
10
11

execdbms_stats.gather_table_stats('SYS','T1');
 
execdbms_stats.gather_table_stats('SYS','T2');
 
execdbms_stats.gather_table_stats('SYS','T3');
 
execdbms_stats.gather_table_stats('SYS','T4');
 
execdbms_stats.gather_table_stats('SYS','T5');
 
execdbms_stats.gather_table_stats('SYS','T6');

  查询表占用空间情况

?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

sys@MS4ADB3(dtydb5)> select  table_name,blocks, pct_free , compression,compress_for
 2      from    user_tables
 3      where   table_name in('T1','T2','T3','T4','T5','T6');
 
  
TABLE_NAME                                                      BLOCKS   PCT_FREE COMPRESSION      COMPRESS_FOR
 
---------------------------------------------------------------------- ---------- ---------------- ------------------------
T1                                                                 666         10 DISABLED
T2                                                                 204          0 ENABLED          BASIC
T3                                                                 622          0 ENABLED          BASIC
T4                                                                 204          0 ENABLED          BASIC
T5                                                                  666         10 ENABLED          BASIC
T6                                                                 204          0 ENABLED          BASIC
 
  
 
sys@MS4ADB3(dtydb5)> selectsegment_name,bytes/1024 K from dba_segments where segment_name in('T1','T2','T3','T4','T5','T6');
 
SEGMENT_NA          K
 
--------- ----------
T1               6144
T2               2048
T3               5120
T4               2048
T5               6144
T6               2048

  结果分析:

  从上可以看出,

  basic compression

  在CATS,insert /*+append*/和move compress操作会对数据进行压缩。而alter table compress操作会修改表的压缩属性,但不会对已有数据进行压缩,对压缩表做普通的insert操作也不对对数据进行压缩。压缩表的PCT_FREE为0,说明oracle设计基本压缩表的目的就是认为此类表以后会很少修改

  1.3 OLTP压缩

  使用OLTP压缩分别做以下6组实验

?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

--    1. Baseline CTAS
create table t21 tablespace users
as
select * from test where rownum <= 50000;
 
--    2. CTAS with  OLTP compress enabled
create table t22 compress for OLTP tablespace users
as
select * from test where rownum <= 50000;
 
--    3. Normal insert into empty table defined as compressed
create table t23 compress for OLTP tablespace users
as
select * from test where rownum = 0;
 
insert into t23 select * from test where rownum <= 50000;
 
--    4. Direct path insert into empty table defined as compressed
create table t24 compress for OLTP tablespace users
as
select * from test where rownum = 0;
 
insert /*+append*/ into t24 select * from test where rownum <= 50000;
 
--    5. CTAS without compression, then change to compressed
create table t25 tablespace users
as
select * from test where rownum <= 50000;
 
alter table t25 compress for OLTP;
 
--- 6. table move compress
create table t26 tablespace users
as
select * from test where rownum <= 50000;
alter table t26 move compress for OLTP;

  表分析

?

1
2
3
4
5
6

exec dbms_stats.gather_table_stats('SYS','T21');
exec dbms_stats.gather_table_stats('SYS','T22');
exec dbms_stats.gather_table_stats('SYS','T23');
exec dbms_stats.gather_table_stats('SYS','T24');
exec dbms_stats.gather_table_stats('SYS','T25');
exec dbms_stats.gather_table_stats('SYS','T26');

  表占用空间的大小

?

1
2
3
4
5
6
7
8
9
10
11
12

sys@MS4ADB3(dtydb5)> select  table_name,blocks, pct_free , compression, compress_for
  2      from    user_tables
  3      where   table_name in ('T21','T22','T23','T24','T25','T26');
 
TABLE_NAME                                                       BLOCKS   PCT_FREE COMPRESSION      COMPRESS_FOR
------------------------------------------------------------ ---------- ---------- ---------------- ------------------------
T21                                                                 666         10 DISABLED
T22                                                                 225         10 ENABLED          OLTP
T23                                                                 370         10 ENABLED          OLTP
T24                                                                 225         10 ENABLED          OLTP
T25                                                                 666         10 ENABLED          OLTP
T26                                                                 225         10 ENABLED          OLTP

  比较分析

  OTLP压缩实现了对DML操作的压缩(T23表),主要原理如图所示,当向空块插入数据时,数据不压缩,只有当数据超过一个阀值时,此时oracle才对数据块进行压缩,而且可能对同一个数据块多次压缩


  转化为压缩表的3方法

  1. ALTER TABLE … COMPRESS FOR OLTP

  此方法对现有数据不压缩,对以后的DML语句相关数据进行OLTP压缩

  2. Online Redefinition (DBMS_REDEFINITION)

  对现有和以后的数据均压缩。使用DBMS_REDEFINITION可以在线对表进行操作,可以使用并行操作。分区表的global index是个例外,需要在线重定义之后重建索引

  3. ALTER TABLE … MOVE COMPRESS FOR OLTP

  对现有和以后的数据均压缩。在move过程中,会对表加排它(X)锁,DML操作会被阻塞,可以使用并行提高性能。move操作会导致索引失效,因此move之后需要重建索引。move操作可以改变segment的表空间

时间: 2024-10-05 02:41:21

oracle表压缩技术的相关文章

Oracle的三种表连接技术

Oracle有三种表连接技术,分别是嵌套连接.合并连接和哈希连接. 1. 嵌套循环连接 (NESTED LOOP Join) 嵌套连接把要处理的数据集分为外循环(驱动数据源)和内循 环(被驱动数据源),外循环只执行一次(先执行),内循环执行的次数等于外循环执行的 数据集个数. 这种连接的好处是内存使用非常少. 如果驱动数据源有限,且 被驱动表在连接列上有相应的索引,则这种连接方式才是高效的. 在OLTP系统上常见 到这种连接方式. 2. 排序合并连接 (Sort Merge Join)顾名思义,

Oracle三种表连接技术

  Oracle有三种表连接技术,分别是嵌套连接.合并连接和哈希连接. 1. 嵌套循环连接 (NESTED LOOP Join) 嵌套连接把要处理的数据集分为外循环(驱动数据源)和内循环(被驱动数据源),外循环只执行一次(先执行),内循环执行的次数等于外循环执行的数据集个数. 这种连接的好处是内存使用非常少. 如果驱动数据源有限,且被驱动表在连接列上有相应的索引,则这种连接方式才是高效的. 在OLTP系统上常见到这种连接方式. 2. 排序合并连接 (Sort Merge Join)顾名思义,排序

Oracle Stream Replication技术简介

Stream 是Oracle 的消息队列(也叫Oracle Advanced Queue)技术的一种扩展应用. Oracle 的消息队列是通过发布/订阅的方式来解决事件管理.流复制(Stream replication)只是基于它的一个数据共享技术,也可以被用作一个可灵活定制的高可用性方案. 它可以实现两个数据库之间数据库级,schema级,Table级的数据同步,并且这种同步可以是双向的. Oracle Stream也是通过数据冗余来提高可用性,这一点和Data Guard 类型. Oracl

Oracle 闪回技术详细介绍及总结_oracle

Oracle闪回技术详解,这里整理了4种闪回技术,对Oracle 闪回技术做一个整理总结.  概述: 闪回技术是Oracle强大数据库备份恢复机制的一部分,在数据库发生逻辑错误的时候,闪回技术能提供快速且最小损失的恢复(多数闪回功能都能在数据库联机状态下完成).需要注意的是,闪回技术旨在快速恢复逻辑错误,对于物理损坏或是介质丢失的错误,闪回技术就回天乏术了,还是得借助于Oracle一些高级的备份恢复工具如RAMN去完成(这才是Oracle强大备份恢复机制的精髓所在啊)  撤销段(UNDO SEG

Oracle的数据字典技术简析_oracle

正在看的ORACLE教程是:Oracle的数据字典技术简析.数据字典是Oracle存放有关数据库信息的地方,其用途是用来描述数据的.比如一个表的创建者信息,创建时间信息,所属表空间信息,用户访问权限信息等.当用户在对数据库中的数据进行操作时遇到困难就可以访问数据字典来查看详细的信息. Oracle中的数据字典有静态和动态之分.静态数据字典主要是在用户访问数据字典时不会发生改变的,但动态数据字典是依赖数据库运行的性能的,反映数据库运行的一些内在信息,所以在访问这类数据字典时往往不是一成不变的.以下

基于Oracle的面向对象技术入门基础简析开发者网络Oracle_oracle

正在看的ORACLE教程是:基于Oracle的面向对象技术入门基础简析开发者网络Oracle.一.概述 对象是Oracle8i以上版本中的一个新的特性,对象实际是对一组数据和操作的封装,对象的抽象就是类.在面向对象技术中,对象涉及到以下几个重要的特性:  封装性 通过对数据和操作的封装,将用户关心的数据和操作暴露出来作为接口,其他数据和操作则隐藏到对象内部,这样便于用户使用和维护.  继承性 对象具有继承性,通过这一特性可以增强程序的可扩展性,适合大型项目的开发.  多态性 同一操作在运行时刻有

压缩技术给SQL Server备份文件瘦身_MsSql

可是,其体积仍然很庞大.所以,在日常工作中,如何给SQL Server的备份文件瘦身,就是很多数据库管理员所关心的问题了. 也许微软的数据库产品设计专家听到了众多数据库管理员的呼声了吧.在最新的2008版本的SQLServer数据库中,提出了备份压缩的概念.其基本原理跟利用RAR等压缩工具压缩文件一样,可以让原有的备份文件体积更小.这直接带来的好处,就是可以节省服务器的备份空间.另外,若SQLServer数据库配置了异地备份的话,那么也可以节省网络带宽,缩短异地备份的时间,等等. 笔者前不久刚把

压缩技术给SQL Server备份文件瘦身

可是,其体积仍然很庞大.所以,在日常工作中,如何给SQL Server的备份文件瘦身,就是很多数据库管理员所关心的问题了. 也许微软的数据库产品设计专家听到了众多数据库管理员的呼声了吧.在最新的2008版本的SQLServer数据库中,提出了备份压缩的概念.其基本原理跟利用RAR等压缩工具压缩文件一样,可以让原有的备份文件体积更小.这直接带来的好处,就是可以节省服务器的备份空间.另外,若SQLServer数据库配置了异地备份的话,那么也可以节省网络带宽,缩短异地备份的时间,等等. 笔者前不久刚把

oracle 索引压缩

  oracle 索引压缩     oracle 索引压缩(key compression)是oracle 9i 中引入的一项新特性.该特性可以压缩索引或者索引组织表中的重复键值,从而节省存储空间.非分区的unique 索引和non-unique(至少两列)索引都能够被压缩.bitmap 索引不能够进行压缩.      在oracle 索引压缩中有几个比较纠结的术语,需要说明一下.索引压缩是通过将索引中的键值拆分成两部分实现的,也就是grouping piece 也称作prefix 和 uniq