正如我们所看到的,COLOR_FREQUENCY 表中的每一行都连接了 CONSECUTIVE_NUMBER 表中的 FREQUENCY 行。该示例生成了您需要用于获得所需值分布的确切内容:
  CREATE TABLE T_SHIRT(COLOR VARCHAR(30) NOT NULL, SIZE CHAR(1) NOT NULL);
  INSERT INTO T_SHIRT
  SELECT COLOR, 'M' AS SIZE
  FROM COLOR_FREQUENCY JOIN CONSECUTIVE_NUMBER
  ON NUM BETWEEN 1 AND FREQUENCY;
  SELECT COLOR, COUNT(*) FROM T_SHIRT GROUP BY COLOR;
  COLOR                          2          
  ------------------------------ -----------
  AMBER                                    3
  BLACK                                    1
  BLUE                                     1
  GREEN                                    3
  RED                                     37
  SILVER                                  12
  WHITE                                    2 ;
  因此,T_SHIRT 表现在有 37+12+3+3+2+1+1 = 57 行。该表刚好具有所需的值分布。
  为几个列生成具有给定值分布的数据
  使用前一章中的所用表,您还可以为 SIZE 列指定值分布:
  CREATE TABLE SIZE_FREQUENCY(SIZE CHAR(1), FREQUENCY SMALLINT);
  INSERT INTO SIZE_FREQUENCY VALUES
  ('S', 5), ('M',7), ('L', 9);
  并使用两个表表达式来填充 T_SHIRT 表:
  INSERT INTO T_SHIRT
  SELECT COLOR, SIZE
  FROM
  (SELECT COLOR FROM COLOR_FREQUENCY JOIN CONSECUTIVE_NUMBER ON NUM
  BETWEEN 1 AND FREQUENCY) C,
  (SELECT SIZE FROM SIZE_FREQUENCY JOIN CONSECUTIVE_NUMBER ON NUM BETWEEN
  1 AND FREQUENCY) S
  第一个表表达式产生 57 行,而第二个表表达式则产生 5+7+9=21 行。由于我们没有指定任何连接条件,所以第一个结果集中的每一行将会连接第二个中的每一行,从而产生 57*21 行。
  注意:交叉连接可能会生成太多行。因此,该事务将太大,以致服务器无法处理。本例中,您可能需要几个较小一些的 INSERT 语句,例如在第一个 INSERT 中使用以下表表达式:
  (SELECT SIZE FROM SIZE_FREQUENCY JOIN CONSECUTIVE_NUMBER ON NUM BETWEEN
  1 AND FREQUENCY AND SIZE='L') S
  并且在第二个 INSERT 语句中将这个表表达式修改为:
  (SELECT SIZE FROM SIZE_FREQUENCY JOIN CONSECUTIVE_NUMBER ON NUM BETWEEN
  1 AND FREQUENCY AND SIZE<>'L') S
  生成具有相关列的数据
  假定我们需要生成几行记录来填充 CAR 表:
  CREATE TABLE CAR(
  MAKE VARCHAR(20) NOT NULL,
  MODEL VARCHAR(20) NOT NULL,
  OTHER_DATA VARCHAR(20));
  如果尝试前一章中的方法,我们后将获得一些不可能的 MAKE/MODEL 组合,例如“TOYOTA METRO”和“GEO CAMRY”。该状况称作 MAKE 列和 MODEL 列之间的相关性。正确的方法是指定有效对(MAKE,MODEL)及其频率:
  CREATE TABLE MAKE_MODEL_FREQUENCY(MAKE VARCHAR(20), MODEL VARCHAR(20),
  FREQUENCY SMALLINT);
  INSERT INTO MAKE_MODEL_FREQUENCY VALUES
  ('TOYOTA','CAMRY', 40), ('HONDA','ACCORD',40), ('CHEVY', 'PRIZM', 5),
  ('GEO','PRIZM',  5),  ('CHEVY', 'METRO', 5), ('GEO', 'METRO', 10);
  一旦完成该工作,我们可以按照前面一模一样的方法来连接 CONSECUTIVE_NUMBER 和 MAKE_MODEL_FREQUENCY 表了。
  操纵群集因子
  表的物理行次序将影响该表上几乎所有查询的性能。因此,所生成的数据具有理想的物理行次序是极其重要的。如果您期望一个索引具有较高的群集因子,只要重组该索引上的表。相反,如果您期望该索引具有较低的群集因子,也可以容易地以随机次序来打乱该表的次序,从而使得该索引的群集因子接近于 0:
  CREATE TABLE  NAMES(
  FULL_NAME VARCHAR(50)  NOT NULL,
  ORDERED_ON INT);
  INSERT INTO NAMES(FULL_NAME, ORDERED_ON)
  SELECT TABNAME || ', ' || COLNAME AS FULL_NAME,
  SYSFUN.RAND() * 10000 AS ORDERED_ON
  FROM SYSCAT.COLUMNS;
  CREATE INDEX NAMES_FULL_NAME ON NAMES(FULL_NAME);
  CREATE INDEX NAMES_ORDER ON NAMES(ORDERED_ON);
  REORG TABLE DB2ADMIN.NAMES INDEX DB2ADMIN.NAMES_ORDER;
  RUNSTATS ON TABLE DB2ADMIN.NAMES AND DETAILED INDEXES ALL;
  在进行重组之后,索引 NAMES_FULL_NAME 将具有一个极低的群集因子(接近于 0),因为现在的行是以随机次序存储的。
  注意:还可以重组该表,以使索引 NAMES_FULL_NAME 的群集因子接近 0 到 1 之间的任何给定值,但是,该内容超出了本文的范围。
  结束语
  本文讨论了如何构建一个测试数据集,以使该数据集达到用于测试的规模,并且具有期望的值分布和列间相关性。