构建一个 System Managed Storage 环境并在其中进行测试
在本节中,您将构建一个环境,在此环境中可以使用 System Managed Storage(SMS)表空间 比较对表中的数据进行压缩和不进行压缩这两种不同的情况。用于填充表的数据放在一个定界 ASCII 文件中,该文件名为 data.del,位于子目录 DB2compression 下。所有脚本放在子目录 Section4 中。
使用数据库管理员 id 和密码登录到系统。
现在创建两个 SMS 表空间 —— 一个用于数据,另一个用于索引。
- 为大小为 10MB 的容器创建一个页大小为 4KB 并由数据库管理的普通表空间 TSA,为其提供一个文件名(Windows 上为 C:\db2\node0000\TSA,Linux 上为 /home/db2inst1/db2inst1/NODE0000/TSA):
CREATE REGULAR TABLESPACE TSA
PAGESIZE 4K
MANAGED BY DATABASE
USING ( FILE 'C:\DB2\NODE0000\TSA' 10M );
or USING ( FILE '/home/db2inst1/db2inst1/NODE0000/TSA' 10M );
创建另一个具有相同维的表空间 TSIA,用于存放索引:
CREATE REGULAR TABLESPACE TSIA
PAGESIZE 4K
MANAGED BY DATABASE
USING ( FILE 'C:\DB2\NODE0000\TSIA' 10M );
or USING ( FILE '/home/db2inst1/db2inst1/NODE0000/TSIA' 10M );
或者使用 crtsa.sql 脚本来创建表空间。
现在创建表 TA 并指定不压缩(这个表是从 TCPH 基准中使用的一个表摘录出来的)。
- 使用脚本 crta.sql 创建包含下述列的表 TA 和相关的索引:
"L_ORDERKEY" INTEGER NOT NULL ,
"L_PARTKEY" INTEGER NOT NULL ,
"L_SUPPKEY" INTEGER NOT NULL ,
"L_LINENUMBER" INTEGER NOT NULL ,
"L_QUANTITY" DOUBLE NOT NULL ,
"L_EXTENDEDPRICE" DOUBLE NOT NULL ,
"L_DISCOUNT" DOUBLE NOT NULL ,
"L_TAX" DOUBLE NOT NULL ,
"L_RETURNFLAG" CHAR(1) NOT NULL ,
"L_LINESTATUS" CHAR(1) NOT NULL ,
"L_SHIPDATE" DATE NOT NULL ,
"L_COMMITDATE" DATE NOT NULL ,
"L_RECEIPTDATE" DATE NOT NULL ,
"L_SHIPINSTRUCT" CHAR(25) NOT NULL ,
"L_SHIPMODE" CHAR(10) NOT NULL ,
"L_COMMENT" VARCHAR(44) NOT NULL
添加 “L_ORDERKEY” 和 “L_LINENUMBER” 上的一个惟一键以及 “L_PARTKEY” 和 “L_SUPPKEY” 上的另一个键。
现在可以开始就表空间的使用情况进行第一个系列的分析。多次重复执行一组相同的动作,首先从少量的行开始,然后逐渐加大数量,直到完成整个表:
- 将所需的行从 data.del(在子目录 DB2Compression 中)导入到 TA 中,替换已有的数据。
- 在带分布和索引的表 TA 上执行 RUNSTATS。
- 收集信息表 syscat.tables。
- 列出表空间的详细信息。
- 针对以下数量的行运行 loadTA.sql:
- 100 行
- 1000 行
- 10000 行
- 整个表
对于这些测试,只有
NPAGES是有用的,因为压缩标志为 N,其他参数都为 0。 - 在分析过程中,使用
INSPECT命令估计如果压缩 TSA 中的 TA,可以节省多少空间:
INSPECT ROWCOMPESTIMATE TABLE
NAME TA
SCHEMA db2inst1
RESULTS KEEP ta.raw;
可以使用以下批处理文件和脚本文件:
- insp1.bat 删除检查文件。
- inspTA.sql 运行
INSPECT命令。 - insp2.bat 格式化和显示检查数据。
注意:需要为
INSPECT命令提供一个文件名(例如 ta.raw),用于存储结果。输出文件是一个二进制文件,与 db2diag.log 存储在相同的目录中。在不同操作系统上该路径可能有所不同:Linux 上为 db2dump,Windows 上为 …sqllib\instancename。需要使用db2inspf命令格式化该文件。现在对压缩数据重复上述过程。再创建两个 SMS 表空间 —— 一个用于数据,另一个用于索引。
-
为大小为 10MB 的容器创建一个页大小为 4KB 并由数据库管理的普通表空间 TSB,为其提供一个文件名(Windows 上为 C:\db2\node0000\TSB,Linux 上为 /home/db2inst1/db2inst1/NODE0000/TSB):
CREATE REGULAR TABLESPACE TSB
PAGESIZE 4K
MANAGED BY DATABASE
USING ( FILE 'C:\DB2\NODE0000\TSB' 10M );
or USING ( FILE '/home/db2inst1/db2inst1/NODE0000/TSB' 10M );
-
创建另一个具有相同维的表空间 TSI2,用于存放索引:
CREATE REGULAR TABLESPACE TSIB
PAGESIZE 4K
MANAGED BY DATABASE
USING ( FILE 'C:\DB2\NODE0000\TSIB' 10M );
or USING ( FILE '/home/db2inst1/db2inst1/NODE0000/TSIB' 10M );
或者使用 crtsb.sql 脚本来创建表空间。
现在创建表 TB 并指定压缩。
- 使用脚本 crtb.sql 创建表 TB 和相关的索引,使它们与 TA 及其索引一样。
对表空间的使用情况重复上述分析过程。多次重复执行一组相同的动作,首先从少量的行开始,然后逐渐加大数量,直到完成整个表:
- 将所需的行从 data.del(在子目录 DB2Compression 中)导入到 TB 中,替换已有的数据。
- 重组数据并重新构建压缩字典。
- 在带分布和索引的表 TB 上执行 RUNSTATS。
- 收集信息表 syscat.tables。
- 列出表空间的详细信息。
- 针对以下数量的行运行 loadTB.sql:
- 100 行
- 1000 行
- 10000 行
- 整个表
比较问题 4 和 6 的结果。