DB2 v8 db2look提供了-m参数用于导出统计信息,可用于还原或构造测试优化器行为。 可是咱们发现一个很奇怪的问题。db2look生成的用于构造统计信息的SQL语句有彻底重复的语句存在。ide
db2inst1[@db2](http://my.oschina.net/u/736168):>db2look -d sample -m -t orders -- No userid was specified, db2look tries to use Environment variable USER -- USER is: DB2INST1 -- The db2look utility will consider only the specified tables -- Running db2look in mimic mode -- This CLP file was created using DB2LOOK Version 8.2 -- Timestamp: Tue Aug 30 08:58:16 BEIST 2016 -- Database Name: SAMPLE -- Database Manager Version: DB2/AIX64 Version 8.2.9 -- Database Codepage: 1386 -- Database Collating Sequence is: UNIQUE CONNECT TO SAMPLE; --------------------------------------------- -- Mimic Tables, Columns, Indexes and Column Distribution --------------------------------------------- -- Mimic table ORDERS # 这里开始是第一部分 RUNSTATS ON TABLE "DB2INST1 "."ORDERS" ; UPDATE SYSSTAT.INDEXES SET NLEAF=-1, NLEVELS=-1, FIRSTKEYCARD=-1, FIRST2KEYCARD=-1, FIRST3KEYCARD=-1, FIRST4KEYCARD=-1, FULLKEYCARD=-1, CLUSTERFACTOR=-1, CLUSTERRATIO=-1, SEQUENTIAL_PAGES=-1, PAGE_FETCH_PAIRS='', DENSITY=-1, AVERAGE_SEQUENCE_GAP=-1, AVERAGE_SEQUENCE_FETCH_GAP=-1, AVERAGE_SEQUENCE_PAGES=-1, AVERAGE_SEQUENCE_FETCH_PAGES=-1, AVERAGE_RANDOM_PAGES=-1, AVERAGE_RANDOM_FETCH_PAGES=-1, NUMRIDS=-1, NUMRIDS_DELETED=-1, NUM_EMPTY_LEAFS=-1 WHERE TABNAME = 'ORDERS' AND TABSCHEMA = 'DB2INST1 '; ... # 奇怪的问题在这里,输出中,彻底一致的SQL语句出现了两次 -- Mimic table ORDERS # 这里开始是第二部分 RUNSTATS ON TABLE "KGDB "."ORDERS" ; UPDATE SYSSTAT.INDEXES SET NLEAF=-1, NLEVELS=-1, FIRSTKEYCARD=-1, FIRST2KEYCARD=-1, FIRST3KEYCARD=-1,
咱们经过逐条对比第一部分和第二部分的SQL语句,发现它们是彻底同样的。测试
这里有两个问题,咱们导入统计信息,除了还原原有的统计信息外,还有一个目的是节省时间,用runstats收集统计信息,对大表来讲,时间仍是很是可观的。优化
但生成的SQL语句的最开始倒是进行runstats,这是为何呢?接下来的SQL语句给了咱们答案,这里用 了update语句来’导入‘旧的统计信息。假设,咱们不在开始的部分进行runstats的操做,若是刚好表彻底没有收集过统计信息,咱们能够预见,update的操做会失败,统计信息导入操做也会失败。.net
第二个问题是,为何须要执行两次runstats和两次的update操做。 这个问题,没有找到确切的答案,可是咱们从v9.7上发现一些蛛丝马迹。code
咱们经过在v9.7上用db2look生成的用与构造统计信息的SQL语句,发现该SQL语句正常,只有一次runstats和一次的upate操做。所以咱们猜想v8生成重复的SQL语句,多是v8的bug。ci
db2look生成的用于构造SQL语句的脚本,是否能够不包含runstats语句,咱们能够把update语句换成一个delete和一个update语句?直接写入统计信息数据,减小runstats的时间。v8