Oracle 数据压缩(Compression) 技术 说明
一. 官网说明
1.1 Oracle 11g Advanced Compression
Oracle 11g EE版本中只有: Basic Table Compression ,而 AdvanceCompression Feature需要单独购买。
11g Advanced Compression 有如下特性:
1. Compression for Table Data
--支持了DML 语句的compress,下面会重点关注。
2. Compression for File Data
3. Compression for Backup Data
--包括RMAN和expdp/impdp.对数据泵,compress 是inline的,在impdp时不需要进行解压缩,直接导入即可。
4. Compression for Network Traffic
--在DG中使用,Redo在传输中被压缩和解压缩。
关于11g Advanced Compression,参考Oracle 的compression 白皮书:
http://www.oracle.com/technetwork/database/storage/advanced-compression-whitepaper-130502.pdf
这里我们只看Compressionfor Table Data。
The OracleDatabase 11g Advanced Compression Option introduces a comprehensive set ofcompression capabilities to help customers maximize resource utilizationand reduce costs. It allows IT administrators to significantly reduce theiroverall database storage footprint by enabling compression for all types ofdata – be it relational (table), unstructured (file), or backup data. Althoughstorage cost savings are often seen as the most tangible benefit ofcompression, innovative technologies included in the Advanced CompressionOption are designed to reduce resource requirements and technology costs forall components of your IT infrastructure, including memory and networkbandwidth.
1.1 Compression for Table Data
Oracle 11g EE版本中只有: Basic Table Compression ,而 AdvanceCompression Feature需要单独购买。
1.2 OLTP Table Compression
1.3 Benefits of OLTP Table Compression
--压缩率由被压缩的数据性质决定,特别是重复值的数量。重复值越多,压缩率越高。 一般来说,通过压缩,可以降低2x 到 4x的空间的消耗。但是在uncompress时,还是需要增加原来的空间。
1.4 Minimal Performance Overhead
--正如上面锁描述,Table Compression 对read 没有不利的影响。 但对write 操作时需要做一些附加的操作,正因如此,对compress block 不适合进行写操作。
1.5 Migration and Best Practices
CREATE TABLE emp(emp_id NUMBER, first_name VARCHAR2(128), last_name VARCHAR2(128)) COMPRESS FOROLTP;
--对于新表或者分区,可以在创建时指定参数:COMPRESS FOR OLTP.
--对于已经存在的表或者分区,可以使用如下三种方法来实现Table Compress:
1.5.1. ALTER TABLE … COMPRESS FOR OLTP
--启动compress后,之后的所有DML操作都会进行compress,但是对于已经存在的数据,会继续保持uncompressed。
1.5.2. Online Redefinition (DBMS_REDEFINITION)
--在线重定义支持以后的DML的压缩,同时也会compress 已经存在的数据。
--在线重定义操作期间会clone索引到临时表。 这个和索引的online rebuild 类似。 但是online redefinition 会导致分区表的全局索引失效,需要在操作完成后进行重建。
Oracle alterindex rebuild 与 ORA-08104 说明
http://www.cndba.cn/Dave/article/1549
1.5.3. ALTER TABLE … MOVE COMPRESS FOR OLTP
--MOVE 操作会导致分区或者表上的所有失效,需要操作结束后rebuild 索引,或者在执行MOVE操作时加上UPDATE INDEXES,来维护索引。
--OLTP TableCompression 不支持超过255个字段的表,或者表里有LONG 类型的字段。
二.Compression 压缩说明
2.1 说明
一般来说,数据压缩对OLAP 系统更有效,因为其数据很大。 但对现在的很多OLTP系统来说,数据也非常巨大,比如如下的几个用户:
OWNER SUM(BYTES/1024/1024)||'M'
------------------------------ -----------------------------------------
加起来也有2T多的数据,如果不使用压缩或者转对数据进行转历史,那么会对磁盘空间带来不小的压力。而且数据压缩不仅仅是对磁盘空间的减少,从某些环境下,对性能也会有提高。
Oracle 是数据压缩技术的先驱,在Oracle 9i中就引入了Basic Table Compression。
压缩率由被压缩的数据性质决定,特别是重复值的数量。 重复值越多,压缩率越高。 一般来说,通过压缩,可以降低2x 到 4x的空间的消耗。 但是在uncompress时,还是需要增加原来的空间。
TableCompression 对read 没有不利的影响。 但对write操作时需要做一些附加的操作,正因如此,对compress block 不适合进行写操作。
Oracle 批处理的compress要优于每次写操作时进行压缩。当一个block 初始化时会保持uncompress状态,直到数据接近block 控制阀值(PCTFREE),当某个事务导致数据达到这个threshold,block 里的所有数据都会被compressed。 随后,又更多的数据被添加进来,再次接近阀值,在次被压缩,直到整个block 达到最高的compression。
对于新表或者分区,可以在创建时指定参数:COMPRESS FOR OLTP.如:
CREATE TABLE emp(emp_id NUMBER, first_name VARCHAR2(128), last_name VARCHAR2(128)) COMPRESS FOROLTP;
对于已经存在的表或者分区,可以使用如下三种方法来实现Table Compress:
(1)ALTER TABLE …COMPRESS FOR OLTP
启动compress后,之后的所有DML操作都会进行compress,但是对于已经存在的数据,会继续保持uncompressed。
http://blog.csdn.net/tianlesoftware/article/details/4954417
(2)OnlineRedefinition (DBMS_REDEFINITION)
在线重定义支持以后的DML的压缩,同时也会compress 已经存在的数据。
(3)ALTER TABLE …MOVE COMPRESS FOR OLTP
MOVE操作会导致分区或者表上的所有失效,需要操作结束后rebuild 索引,或者在执行MOVE操作时加上UPDATE INDEXES,来维护索引。
OLTP Table Compression 不支持超过255个字段的表,或者表里有LONG 类型的字段。
Consider Using Table Compression
http://docs.oracle.com/cd/E11882_01/server.112/e25494/tables002.htm#CJAGFBFG
2.2 压缩分类
2.2.1 表级压缩
创建表时使用COMPRESS关键字,COMPRESS关键字指示Oracle数据库尽可能以压缩的格式存储该表中的行。
使用alter table .. move compress使一个已存在但未压缩的表转换为压缩表.
SQL> alter table tmp_test move compress;
SQL> alter table …… nocompress;
使用alter table.. move nocompress来解压一个已经压缩的表:
SQL> alter table tmp_test move nocompress;
确定一个表是否使用了压缩,查询user_tables,compression字段表明表是否被压缩.
SQL> select table_name,compression from user_tables wheretable_name= ' ';
2.2.2 表空间级压缩
在表空间级别上定义COMPRESS属性,既可以在生成时利用CREATE TABLESPACE来定义,也可以稍后时间利用ALTERTABLESPACE来定义。
COMPRESS属性具有继承特性。当在一个表空间中创建一个表时,它从该表空间继承COMPRESS属性。
SQL> alter tablespace …… default compress;
SQL> alter tablespace …… default nocompress;
确定是否已经利用COMPRESS对一个表空间进行了定义,可查询USER_TABLESPACES数据字典视图并查看DEF_TAB_COMPRESSION列
SQL> select tablespace_name,def_tab_compressionfrom user_tablespaces where tablespace_name=’ ’;
2.2.3 物化视图压缩
使用用于压缩表的类似方式来压缩物化视图。基于多个表的联接生成的物化视图通常很适于压缩,因为它们通常拥有大量的重复数据项。
SQL> create materialized view …… compress as select ……where ……;
可以使用ALTERMATERIALIZED VIEW命令来改变一个物化视图的压缩属性。注意;通常是在下一次刷新该物化视图时才会进行实际的压缩。
SQL> alter materialized view……compress;
2.2.4 分区表压缩
2.有些时候,分区表在创建时不设置分区压缩属性,当某个分区需要压缩时,再独立进行压缩
3.如果在表级设置压缩属性的话,那么所有分区都会启动压缩功能,反正如果是某几个分区独立压缩,表级属性上什么也不写。
利用ALTER TABLE...MOVE PARTITION命令对此分区进行压缩:
SQL> alter table …… move partition …… compress;
要找出一个表中的哪些分区被压缩了,可以查询数据字典视图USER_TAB_PARTITIONS
SQL>select table_name, partition_name,compression fromuser_tab_partitions;
对已分区但未压缩的表(甚至带子分区)进行压缩,如果不能一步完成,那么:
1) SQL>alter table …… compress;
2.2.5 索引压缩
1.分区表索引中不能对单个独立分区索引设置压缩,要么整体压缩要么不压缩,如果希望某几个分区不压缩,那么可以在修改成nocompress。
2.2.6 数据压缩方法
修改表或索引的compress 属性,对已经存在的数据不会进行压缩。只有在向一个表中加裁/插入数据时,才会压缩数据。
Ø 直接路径的 sql*load,sqlldr 使用参数 direct path
Ø create table表名 compress as select..
Ø 并行insert, insert /*+ append */
(1)alter table 表名move compress
(2)alter table 表名move partition 分区名 compress
除表可以压缩外,分区表可以压缩,索引可以压缩,物化视图也可以压缩。注:除索引外,压缩属性可以继承表空间的压缩属性。表空间改成压缩的:
SQL>alter tablespace dave default compress;
三. 测试
http://www.cndba.cn/Dave/article/410
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise EditionRelease 11.2.0.3.0 - 64bit Production
PL/SQL Release 11.2.0.3.0 - Production
TNS for Linux: Version 11.2.0.3.0 -Production
NLSRTL Version 11.2.0.3.0 - Production
3.1 CTAS 压缩
SQL> create table ctas_nocompress asselect * from dba_objects;
SQL> create table ctas_compress compressas select * from dba_objects;
SQL> execshow_space('ctas_nocompress','t');
TotalBlocks............................1152
TotalBytes.............................9437184
Unused Blocks...........................81
Unused Bytes............................663552
Last Used Ext FileId....................1
Last Used ExtBlockId...................98176
Last Used Block.........................47
PL/SQL procedure successfully completed.
SQL> execshow_space('ctas_compress','t');
Total Blocks............................384
TotalBytes.............................3145728
Unused Blocks...........................73
UnusedBytes............................598016
Last Used Ext FileId....................1
Last Used Ext BlockId...................98560
Last Used Block.........................55
PL/SQL procedure successfully completed.
--通过以上对比,可以验证,只有使用create table table_namecompress as 的时候才能压缩。
3.2 并行insert 压缩
SQL> create table tab_inst as select *from dba_objects where 1=2;
SQL> create table tab_inst_comp compressas select * from dba_objects where 1=2;
SQL> insert into tab_inst select * fromdba_objects;
SQL> insert /*+append*/ intotab_inst_comp select * from dba_objects;
SQL> exec show_space('tab_inst');
TotalBlocks............................1152
TotalBytes.............................9437184
Unused Blocks...........................83
UnusedBytes............................679936
Last Used Ext FileId....................1
Last Used ExtBlockId...................100736
Last Used Block.........................45
PL/SQL procedure successfully completed.
SQL> exec show_space('tab_inst_comp','t');
TotalBlocks............................1024
TotalBytes.............................8388608
Unused Blocks...........................61
UnusedBytes............................499712
Last Used Ext FileId....................1
Last Used Ext BlockId...................100608
Last Used Block.........................67
PL/SQL procedure successfully completed.
3.3 alter table …move compress压缩
SQL> alter table tab_inst_comp movecompress;
SQL> exec show_space('tab_inst_comp');
TotalBlocks............................384
TotalBytes.............................3145728
Unused Blocks...........................73
UnusedBytes............................598016
Last Used Ext FileId....................1
Last Used ExtBlockId...................101120
Last Used Block.........................55
PL/SQL procedure successfully completed.
3.4 compress 与 uncompress 的对比
在前面几节测试了compress在block上的变化,这里直接从表的大小上来看。
现在有2个compress 的表:tab_inst_comp,ctas_compress。
SQL>selectowner,table_name,compression from dba_tables;
SQL>selectowner,index_name,compression from dba_indexes;
SQL> select owner,table_name,compressionfrom dba_tables where table_name=upper('&table_name');
Enter value for table_name: tab_inst_comp
old 1: select owner,table_name,compression from dba_tables wheretable_name=upper('&table_name')
new 1: select owner,table_name,compression from dba_tables wheretable_name=upper('tab_inst_comp')
--------------- ------------------------------------
Enter value for table_name: ctas_compress
old 1: select owner,table_name,compression from dba_tables wheretable_name=upper('&table_name')
new 1: select owner,table_name,compression from dba_tables wheretable_name=upper('ctas_compress')
--------------- ------------------------------------
SEGMENT_NAME SEGMENT_TYPE BYTES/1024/1024
------------------------------ -----------------------------------
SQL> alter table tab_inst_compnocompress;
--注意这里的nocompress 并没有让表在大小上发生变化:
SEGMENT_NAME SEGMENT_TYPE BYTES/1024/1024
-------------------------------------------------- ---------------
SQL> alter table tab_inst_comp move;
SEGMENT_NAME SEGMENT_TYPE BYTES/1024/1024
-------------------------------------------------- ---------------
SQL>alter table tab_inst_comp movenocompress;
还有就是我们对表进行update 的时候,也会对相关的记录进行解压缩,并且解压缩后的数据不会在进行压缩。 这里我们对CTAS_COMPRESS进行测试。
SQL> select count(1) from ctas_compress;
SQL> create table ctas as select * fromdba_objects;
SQL> update ctas set owner='dave';
SQL> update CTAS_COMPRESS setowner='dave';
--使用表压缩,更新花了46秒。 是未压缩时的5倍。如果表更大,那么时间就会更长。
SEGMENT_NAME SEGMENT_TYPE BYTES/1024/1024
-------------------------------------------------- ---------------
以上测试也说明,为什么对update 比较频繁的表不建议使用压缩。而只对read多的表进行压缩。
3.5 分区表compress 修改
3.5.1 创建分区表
SQL> create table tb_par(object_id,object_name)
2 partition by range (object_id)
4 partition tb_par01 values lessthan (10000),
5 partition tb_par02 values lessthan (20000),
6 partition tb_par03 values lessthan (30000),
7 partition tb_par04 values lessthan (40000),
8 partition tb_par05 values lessthan (50000),
9 partition tb_par_max valuesless than (maxvalue)
11 as selectobject_id,object_name from dba_objects;
SQL> select count(*) from tb_par;
由于是分区表,查询表属性是否压缩的时候,出现为空,必须查分区信息,如下:
SQL> col partition_name for a20
SQL> selecttable_name,compression,PARTITIONED from user_tables wheretable_name=UPPER('tb_par');
-------------------- ----------------------
SQL> select partition_name,compressionfrom user_tab_partitions where table_name=UPPER('tb_par');
-------------------- ----------------
3.5.2 修改分区表压缩属性
SQL>altertable tb_par compress;
SQL> select partition_name,compressionfrom user_tab_partitions where table_name=UPPER('tb_par');
-------------------- ----------------
(2)对某个分区表空间建立压缩,不能将所有表属性设置为compress。
SQL> alter table tb_par nocompress;
SQL> select partition_name,compressionfrom user_tab_partitions where table_name=UPPER('tb_par');
-------------------- ----------------
SQL> alter tabletb_par modify partition tb_par01 compress;
SQL> alter table tb_par modify partitiontb_par02 compress;
SQL> alter tabletb_par move partition tb_par03 compress;
SQL> select partition_name,compression from user_tab_partitions wheretable_name=UPPER('tb_par');
-------------------- ----------------
3.6 分区索引压缩属性修改
1.分区表索引中不能对单个独立分区索引设置压缩,要么整体压缩要么不压缩,如果希望某几个分区不压缩,那么可以在修改成nocompress。
SQL>createindex tb_par_indx on tb_par(object_id) local;
SQL>selectindex_name,compression from user_indexes where table_name=UPPER('tb_par');
------------------------------ -----------
SQL>selectpartition_name,compression from user_ind_partitions whereindex_name=UPPER('tb_par_indx');
-----------------------------------------
SQL> alter index tb_par_indx rebuildpartition tb_par04 compress;
alter index tb_par_indx rebuild partitiontb_par04 compress
ORA-28659: COMPRESS must be specified atobject level first
报错,压缩必须首先在对象级别指定,这个意思是必须先设置表级索引为压缩。必须创建分区表索引时一次性指定好压缩属性,以后才能对独立分区索引压缩进行修改,必须先设置压缩,然后再进行取消压缩属性。
SQL> alter index tb_par_indx rebuildcompress;
alter index tb_par_indx rebuild compress
ORA-14086: a partitionedindex may not be rebuilt as a whole
SQL>createindex tb_par_indx_compress on tb_par(object_id) local compress;
SQL>selectindex_name,compression from user_indexes where table_name=UPPER('tb_par');
-----------------------------------------
PARTITION_NAME INDEX_NAME COMPRESSION
------------------------------------------------------------ -----------
TB_PAR01 TB_PAR_INDX_COMPRESS ENABLED
TB_PAR02 TB_PAR_INDX_COMPRESS ENABLED
TB_PAR03 TB_PAR_INDX_COMPRESS ENABLED
TB_PAR04 TB_PAR_INDX_COMPRESS ENABLED
TB_PAR05 TB_PAR_INDX_COMPRESS ENABLED
TB_PAR_MAX TB_PAR_INDX_COMPRESS ENABLED
SQL> alter index TB_PAR_INDX_COMPRESS rebuild partitiontb_par04 nocompress;
SQL> alter index TB_PAR_INDX_COMPRESS rebuildpartition tb_par05 nocompress;
SQL> alter index TB_PAR_INDX_COMPRESS rebuildpartition tb_par_max nocompress;
SQL> select partition_name,index_name,compressionfrom user_ind_partitions where index_name=UPPER('TB_PAR_INDX_COMPRESS');
PARTITION_NAME INDEX_NAME COMPRESSION
------------------------------------------------------------ -----------
TB_PAR01 TB_PAR_INDX_COMPRESS ENABLED
TB_PAR02 TB_PAR_INDX_COMPRESS ENABLED
TB_PAR03 TB_PAR_INDX_COMPRESS ENABLED
TB_PAR04 TB_PAR_INDX_COMPRESS DISABLED
TB_PAR05 TB_PAR_INDX_COMPRESS DISABLED
TB_PAR_MAX TB_PAR_INDX_COMPRESS DISABLED
在前面的内容也说过,索引本身占据的空间比较小,除非超大数据量表,否则不建议使用压缩,因为各方面维护的性能消耗高于压缩带来的性能提升。
---------------------------------------------------------------------------------------
版权所有,文章允许转载,但必须以链接方式注明源地址,否则追究法律责任!
Blog: http://www.cndba.cn/dave
Weibo: http://weibo.com/tianlesoftware
Twitter: http://twitter.com/tianlesoftware
Facebook: http://www.facebook.com/tianlesoftware
Linkedin: http://cn.linkedin.com/in/tianlesoftware
Oracle 数据压缩(Compression) 技术 说明相关推荐
- oracle数据库硬恢复,ORACLE数据库恢复技术
一.恢复的意义 当我们使用一个数据库时,总希望数据库的内容是可靠的.正确的,但由于计算机系统的故障(硬件故障.网络故障.进程故障和系统故障)影响数据库系统的操作,影响数据库中数据的正确性,甚至破坏数据 ...
- Oracle Stream Replication技术
Stream 是Oracle 的消息队列(也叫Oracle Advanced Queue)技术的一种扩展应用. Oracle 的消息队列是通过发布/订阅的方式来解决事件管理.流复制(Stream re ...
- oracle数据库并行数限制,Oracle数据库并行处理技术详解(上)
Oracle数据库并行处理技术是数据库的一项核心技术,它使组织能够高效地管理和访问TB级的数据.如果不能提供高效的Oracle数据库并行处理技术,这些大型数据库(通常用于数据仓库但也越来越多地出现在业 ...
- Oracle闪回技术
Oracle闪回技术 我们都清楚的知道,当我们数据库中的数据删除或者更新之后,数据很难再还原回来,在没有了解闪回技术之前,就觉得是没办法还原了,这样子会付出很大的代价. 现在我来总结一下闪回技术的 ...
- “平步青云”:Oracle系统平台技术助力企业私有云建设
2019独角兽企业重金招聘Python工程师标准>>> "平步青云":Oracle系统平台技术助力企业私有云建设 Oracle采取广泛但有所侧重的云计算战略,能够 ...
- oracle ods平台建立,如何利用Oracle表分区技术建设ODS平台
龙源期刊网 http://www.wendangwang.com 如何利用Oracle表分区技术建设ODS平台作者:李永强 来源:<电脑知识与技术>2010年第11期 摘要:该单位目前要在 ...
- Oracle产品服务和技术级别的介绍
很多朋友询问正版Oracle 数据库产品和盗版产品主要有什么区别呢,其实从产品技术本身来讲,区别不大,可以从OTN网站上下载一个数据库产品,然后安装使用,正版和盗版最大的区别就是,如果你购买了正版产品 ...
- Oracle 闪回技术详解
概述 闪回技术是Oracle强大数据库备份恢复机制的一部分,在10g的时候就被推出一直延续到现在.在数据库发生逻辑错误的时候,闪回技术能提供快速且最小损失的恢复(多数闪回功能都能在数据库联机状态下完成 ...
- Oracle自治数据库技术概要白皮书读书笔记
下载地址.版本为:March, 2022, Version 2.1 副标题: A fully autonomous, mission-critical Oracle database service ...
最新文章
- java中bjt和utc转化_如何在Java中转换UTC和本地时区
- 【windows8开发】C++开发WinRT组件和JS调用
- PADS Layout的一个鼠标小技巧
- Android开发之动态创建多个按钮
- 字符串的切割操作(strtok,split)
- Spark的RDD概要DAG概述
- Redis(一)入门
- Atitit 架构艺术 与架构常见包含的技术 1. 架构的目的是什么??解决的问题 所有的问题都能通过架构解决	2 1.1. 提高可读性 提升可维护性架构 降低技术难度	2 1.2. 提升管理性
- 【转】C# DateTime.Now详细用法
- 华为助力“沙漠奇迹”成为高密互联的高尔夫球场
- Spring的9种设计模式(一)
- 使用CBrother爬取LOL服务器状态
- python笔记:7.2.2.2 一元多因素方差分析_交互效应(购房面积影响因素交互效应)
- php获取ip归属地
- 英文数字验证码识别包
- 亚马逊注册成功,需要的进一步的设置一:税务信息设置
- 浏览器的onload事件
- pycharm中关于python虚拟环境的配置
- AttributeError: ‘Upsample‘ object has no attribute ‘recompute_scale_factor‘
- AcWing 1127 香甜的黄油