DB2压缩

–表压缩
两大类:
value压缩(值压缩):没有使用数据字典,而是除去一个值的重复条目,只存储一个副本。存储的副本记录对存储值的任何引用位置。
row压缩(行压缩,分为自适应压缩和“经典”行压缩两种):使用数据字典来压缩,前者在页的基础上建立字典和压缩,后者在表的基础上建立字典和压缩

查看某张表是否压缩以及压缩类型(用runstats收集统计信息才能看到某些信息):
[db2inst1@localhost ~]$ db2 “select tabschema,tabname,compression,ROWCOMPMODE,AVGROWCOMPRESSIONRATIO,PCTPAGESSAVED from syscat.tables where tabname=’T1′”
–compression
B = Both value and row compression are enabled
N = No compression is enabled; a row format that does not support compression is used
R = Row compression is enabled; a row format that supports compression might be used
V = Value compression is enabled; a row format that supports compression is used
Blank = Not applicable
–ROWCOMPMODE
A = ADAPTIVE
S = STATIC
Blank = Row compression is not enabled
–AVGROWCOMPRESSIONRATIO
For compressed rows in the table, this is the average compression ratio by row; that is, the average uncompressed row length divided by the average compressed row length; -1 if statistics are not collected.
–PCTPAGESSAVED
Approximate percentage of pages saved in the table as a result of row compression. This value includes overhead bytes for each user data row in the table, but does not include the space that is consumed by dictionary overhead; -1 if statistics are not collected.

0.注意点:
0.1 需要特别的license
0.2 零时表会的自动的压缩(只要有license),且只能使用“经典”的行压缩,且不能去打开或关闭零时表的压缩功能(这个不确定)。对于系统临时表,系统会的根据实际情况决定是否启用压缩。对于用户临时表,总是使用压缩。
0.3 可能被压缩的表被修改了以后会的出现overflow的情况(比如,原来的一个char是ABC,压缩的时候被换成了1,这个时候update了这个char,变成了ABCE,ABCE在压缩字典里没有,那么就溢出了)。所以建议alter table,把pctfree设置的大一些(比如10%)
0.4 v9.5之前数据字典的建立需要导入数据后reorg。在v9.5之后有了ADC(automatic dictionary creation),只要在create表的时候指定了compress或者在alter表的时候设置了compress,那么当新插入的数据(或已有的数据?)到达一定量的时候就会自动建立数据字典。在这之后插入的数据都会的被压缩。不过这之前的数据还是未被压缩的。另外在v9.7之后,XML有一个独立的数据字典。对于ADC,其默认使用2M的数据来建立数据字典,这个字典相对于离线reorg的全表扫描来建立数据字典来说压缩率可能没有后者高,所以要权衡一下。
0.5 一张表可以有多个历史的数据字典(需要使用特别的语句DATA CAPTURE CHANGES)。这些历史数据字典是用于用一些特定的api查看日志的时候翻译用的。没有的话会看不到具体的内容。
0.6 一般需要reorg下表,reorg的时候可以通过keepdictionary和resetdictionary来决定是否重建数据字典

1.值压缩:
COMPRESS SYSTEM DEFAULT –去重复的时候如果是等于系统默认值,那么就不存储这个值了
注意:使用值压缩的时候,可能会的报SQL0670N错误。也就是row的总字节数大于了未压缩的row

建立:
[db2inst1@localhost ~]$ db2 “create table t15(name char(4) not null with default compress system default) value compression compress yes adaptive”
对已有的表设置压缩(注意,如果不reorg,那么老的数据将不会启用压缩,直到你reorg该表):
[db2inst1@localhost ~]$ db2 alter table b5 alter name compress system default compress yes activate value compression

2.自适应压缩:
页级别的压缩字典会的自动的更新。
自适应压缩会的自动启动“经典”

建立:
[db2inst1@localhost ~]$ db2 “create table t12(id int) compress yes adaptive” –“经典”行压缩和自适应压缩都开启
对已有的表设置压缩(注意,如果不reorg,那么老的数据将不会启用压缩,直到你reorg该表):
[db2inst1@localhost ~]$ db2 alter table b5 compress yes adaptive
关闭(需要做一次离线的reorg,不然老的数据还是被压缩的):
[db2inst1@localhost ~]$ db2 alter table b5 compress no

3.“经典”行压缩(also referred to as static compression)
表级别的数据字典除非重建或reorg,否则不会改变,只会是数据一部分sample的反映。

建立:
[db2inst1@localhost ~]$ db2 “create table t14(name char(8)) compress yes static” –只进行“经典”行压缩
对已有的表设置压缩(注意,如果不reorg,那么老的数据将不会启用压缩,直到你reorg该表):
[db2inst1@localhost ~]$ db2 alter table t1 compress yes static
关闭(需要做一次离线的reorg,不然老的数据还是被压缩的):
[db2inst1@localhost ~]$ db2 alter table b5 compress no

4.估计压缩能节省的空间
先运行下RUNSTATS获取准确的统计信息(貌似不运行也行)。
运行如下命令:
[db2inst1@localhost ~]$ db2 “select * from table(SYSPROC.ADMIN_GET_TAB_COMPRESS_INFO(‘DB2INST1′,’T1’))” –CURRENT后缀的是实际情况,STATIC和ADAPTIVE后缀的是估计值
一个看起来清楚点的:
[db2inst1@localhost ~]$ db2 “select ROWCOMPMODE,PCTPAGESSAVED_CURRENT,PCTPAGESSAVED_ADAPTIVE,PCTPAGESSAVED_STATIC from table(SYSPROC.ADMIN_GET_TAB_COMPRESS_INFO(‘DB2INST1′,’T1’))”

[db2inst1@localhost ~]$ db2 “select * from table(SYSPROC.ADMIN_GET_TAB_COMPRESS_INFO(‘REPORTER’,’REPORTER_DETAILS’,’ESTIMATE’))”

5.手动建立和更新压缩字典
方法一:
reorg的时候指定KEEPDICTIONARY或RESETDICTIONARY。不过这个操作是离线的。同时也可以用这个方法(reset)跟新数据字典
[db2inst1@DB2_105 ~]$ db2 reorg table emp resetdictionary
查看进度:
[rptusr@imccnsutdw001 ~]$ db2 get snapshot for tables on reporter
[rptusr@imccnsutdw001 ~]$ db2pd -db reporter -reorg
方法二:
使用inspect命令在线建立数据字典。不过对于有ADC功能的表来说,一般不需要,因为数据字典很快就自动建立了。

————————————————————————————————————
–其它总类的压缩

–索引压缩
0.如果表开启了压缩(值压缩好像不行),那么默认情况下在那之后create的index是压缩的,除非creat的时候明确指定不压缩。
1.使用alter index让一个index开启压缩或关闭压缩的时候,如果不做index的reorg那么是不会生效的。

查看是否压缩:
[db2inst1@localhost ~]$ db2 “select indschema,indname,compression,pctpagessaved from syscat.indexes where tabname=’B5′”

–归档日志压缩
开启方法:
设置logarchcompr1或logarchcompr2为on
注意,对于logpath或newlogpath设为裸设备的情况,这个是不支持的。

–备份压缩
备份的时候加上compress就可以了。
注意,对于下面两种情况,不建议用备份压缩:
1.数据、索引所在的表空间和LOB和long类型不在一起
2.已经开启了行压缩和索引压缩

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*