从 Version 8.1 开始,IBM® DB2® for Linux®, UNIX®, and Windows® 便具有一种称作值压缩的压缩特性。这种特性不是很出名,但是它提供了一种经济有效的方法,可以在几乎不影响性能的情况下缩小数据库的大小。在本文中,了解关于值压缩的背景信息,并学习一种基于脚本、能够轻松发现可从值压缩中受益的表的方法。

简介

从 DB2 8.1 开始,将数据存储到表中时,DB2 支持两种行格式。通过更改表属性 VALUE COMPRESSION,可以决定按照什么行格式存储新的表行。

如果使用属性 VALUE COMPRESSION 创建一个表,则对于变长类型的列(例如 VARCHAR 和 LOB),其中的每个表条目可以少占两个字节。对于其他数据类型,例如 CHAR、INTEGER 和 DECIMAL,每个表条目要多占两个字节。而且,如果使用值压缩,对于允许 NULL 值的所有列,其中的每个表条目可以少占一个字节。此外,值压缩的行格式会为每一行占用两个字节。因此,值压缩的行格式是否能产生正面的效果,取决于表的结构。

DB2, Version 9.1 中引入了行压缩特性。通过行压缩可以获得更好的压缩率,但是该特性需要单独的许可。此外,还必须清楚行压缩导致的附加的 CPU 开销。值压缩的 CPU 开销低于 1-2%,因此不易察觉。

使用值压缩行格式的压缩

可以使用下面 清单 1 中的 SQL 语句来确定,通过设置表属性 VALUE COMPRESSION,是否可以因使用值压缩的行格式而节省表的空间:

db2 表压缩 db2缩小字段长度_linux

利用 SAP

SAP 使用 DB2 LUW 数据库抽象层中的这个简单的计算来确定,新创建的表是否可以直接从使用值压缩的行格式中受益。由于这一特性的引入,所有新创建的 SAP DB2 LUW 数据库都使用值压缩。这样可以使 SAP DB2 LUW 数据库精简大约 5%。


清单 1. 计算值压缩为单个表带来的好处


SELECT SUM(
 (CASE TYPENAME
  WHEN 'VARCHAR'         THEN 2
  WHEN 'LONG VARCHAR'    THEN 2
  WHEN 'VARGRAPHIC'      THEN 2
  WHEN 'LONG VARGRAPHIC' THEN 2
  WHEN 'BLOB'            THEN 2
  WHEN 'CLOB'            THEN 2
  WHEN 'DBCLOB'          THEN 2
  WHEN 'XML'             THEN 2
  WHEN 'DATALINK'        THEN 2
  ELSE -2 END)
+(CASE NULLS 
  WHEN 'Y' THEN 1
  ELSE 0 END)
)-2
FROM SYSCAT.COLUMNS
WHERE TABSCHEMA = <table schema>
  AND TABNAME   = <table name>


该语句返回使用值压缩行格式为每个表条目节省的字节数。 清单 1 中的计算描述了一条节省路径。对于这个计算,所有能返回正结果的表可以通过激活值压缩来节省空间。如果得到正的结果,则可以使用下面 清单 2 中的 SQL 语句为对应的表激活值压缩:

与行压缩的兼容性

值压缩可以与 DB2 9 行压缩特性一起使用。但是,将这两个特性结合起来使用并没有实际的好处。总体压缩率几乎是一样的。


清单 2. 激活值压缩


ALTER TABLE <table name> ACTIVATE VALUE COMPRESSION


必要时,可以使用下面 清单 3 中的 SQL 语句取消值压缩:


清单 3. 取消值压缩