您当前的位置:中客资源站网络学院数据库类DB2 → 文章内容 退出登录 用户管理
本类热门文章
相关下载
使用db2look 重新创建优化器访问计划
作者:中客资源  来源:中客资源  发布时间:2007-2-9 1:44:17

减小字体 增大字体

改上面将数据库从 SAMPLE 连接到 DUMMYDB 时所收集的每个文件中的数据库名。
例如,如果您查看了 3 个文件的内容,就会注意到:
CONNECT TO SAMPLE;

将它修改为:
CONNECT TO DUMMYDB;

在测试环境中接管这些文件。本例中,所有的表都是在默认的表空间 USERSPACE1 中创建的。因此,它们也应在测试系统上相同的 SMS 表空间中用 storage.out 中转储的相同配置(包括 PREFETCHSIZE、EXTENTSIZE 等)进行创建。
在 config.out 文件中进行少量修改。将下列内容:
UPDATE DB CFG FOR SAMPLE USING dft_queryopt 5;

修改为
UPDATE DB CFG FOR SAMPLE USING dft_queryopt 3;

并保存 config.out 文件。
现在,执行 storage.out、config.out 和 table.ddl,如下:

db2 -tvf storage.out > storage_output.out
db2 -tvf config.out > config_output.out
db2 -tvf table.ddl > table.out

检查输出文件以确保所有命令都成功运行了。并且按照生产环境设置中所显示的用于 SAMPLE DB 的设置来修改 DBHEAP、STMTHEAP、NUM_FREQVALUES、NUM_QUANTILES,使它们适用于 DUMMYDB。同时,检查注册表变量设置是否尽可能地相同。
使用 db2stop 和 db2start 停止并启动该实例。重新为 DUMMYDB 数据库创建解释表:

db2 connect to dummydb;
<install path>\sqllib\misc\db2 -tvf EXPLAIN.DDL
db2 terminate;

现在,对 DUMMYDB 数据库运行查询,在前面对 SAMPLE 数据库运行查询时所生成的 query.sql 文件中将数据库名从 SAMPLE 修改为 DUMMYDB。

C:\>db2 -tvf query.sql
connect to dummydb

   Database Connection Information

 Database server        = DB2/NT 8.2.1
 SQL authorization ID   = SKAPOOR
 Local database alias   = DUMMYDB

set current explain mode explain
DB20000I  The SQL command completed successfully.

select * from org a, staff b where a.deptnumb=b.dept and b.dept=15
SQL0217W  The statement was not executed as only Explain information requests
are being processed.  SQLSTATE=01604

set current explain mode no
DB20000I  The SQL command completed successfully.

C:\>db2 terminate
DB20000I  The TERMINATE command completed successfully.
生成 db2exfmt 输出:

db2exfmt -d DUMMYDB -g TIC -w -1 -n % -s % -# 0 -o test_dummydb_exfmt.txt

检查 test_dummydb_exfmt.txt 的内容并查看访问计划:

Access Plan:
-----------
 Total Cost:   25.8843
 Query Degree:  1

              Rows 
             RETURN 
             (   1) 
              Cost 
               I/O 
               |
                4 
             MSJOIN
             (   2) 
             25.8843 
                2 
          /-----+-----\
        1                4 
     TBSCAN           TBSCAN 
     (   3)           (   5) 
     12.913           12.9682 
        1                1 
       |                |
        8               35 
 TABLE: SKAPOOR   TABLE: SKAPOOR  
       ORG             STAFF 

您在测试中获得了一个不同于生产中的访问计划。本例中,显然我们在测试系统上已经将 DFT_QUERYOPT(默认的查询优化)从 5 修改为 3。因此,您看到的是 Merge Join 计划,而非 Hash Join 计划,以及有一点点区别的总成本(Total Cost)。
因为这些计划不匹配(假设您不确定为什么),所以要检查 db2exfmt 输出中的配置。见 表 2。
正如您可以看到的,测试(TEST)和生产(PRODUCTION)之间的惟一区别就是优化级别(Optimization Level),我们特意将之从 5 修改为 3,只是为了显示在测试环境中复制生产访问计划为何会不成功。
本例中,您将使用下列 UPDATE 语句将 DFT_QUERYOPT 更新为 5:

UPDATE DB CFG FOR SAMPLE USING dft_queryopt 5

然后,停止并重新连接数据库。再次对 DUMMYDB 发出 query.sql,并使用 db2exfmt 命令生成访问计划。这次,您将看到相同的访问计划。否则,就进一步确保本文中所讨论的所有优化器相关的参数都是相同的。
示例 2:
该示例显示了 db2look 命令中 -m 选项的重要性。前面用 -m 选项收集的统计数据在测试和生产中应该相同。本例中,我们将看到没有正确更新统计数据时计划是如何变化的。 
数据库管理器配置、数据库配置和 db2set 注册表变量与上面 示例 1 中的相同。这里的模式名是 SKAPOOR。用您的表的模式替换它。数据库是相同的,与 示例 1 中一样是 SAMPLE 和 DUMMY。这里所使用的平台和 db2level 是 AIX 5.1 和 DB2 UDB ESE V8.2,Fix pack 8,单分区。
在 sample 数据库上执行下列命令:

db2 "connect to sample"
db2 "create index name_ind on staff (name,id)"
db2 "runstats on table skapoor.staff with distribution and indexes all"
db2 "set current explain mode explain"
db2 "select name from staff where id=10 order by name"
db2 "set current explain mode no"
db2 "terminate"

使用 db2exfmt 生成访问计划。您将看到下面的访问计划: 

Access Plan:
-----------
        Total Cost:             0.111065
        Query Degree:           1

      Rows
     RETURN
     (   1)
      Cost
       I/O
       |
        1
     IXSCAN
     (   2)
    0.111065
        0
       |
       35
 INDEX: SKAPOOR
    NAME_IND

从 sample 数据库中收集 db2look 信息:

db2look -d sample -l -o storage.out
db2look -d sample -e -a -m -t STAFF -o db2look.out
db2look -d sample -f -fd -o config.out

修改这些文件以使您连接 dummy 数据库,而非之前在上面 示例 1 中所连接的 sample 数据库。 
手工修改统计数据之一。在 db2look.out 文件中搜索下列语句(请注意,模式名、TABSCHEMA 和 INDSCHEMA 可能与您的具体情况不同):

UPDATE SYSSTAT.INDEXES
SET NLEAF=1,
    NLEVELS=1,
    FIRSTKEYCARD=35,
    FIRST2KEYCARD=35,
    FIRST3KEYCARD=-1,
    FIRST4KEYCARD=-1,
    FULLKEYCARD=35,
    CLUSTERFACTOR=-1.000000,
    CLUSTERRATIO=100,
    SEQUENTIAL_PAGES=0,
    DENSITY=0,
    AVERAGE_SEQUENCE_GAP=0.000000,
    AVERAGE_SEQUENCE_FETCH_GAP=0.000000,
    AVERAGE_SEQUENCE_PAGES=0.000000,
    AVERAGE_SEQUENCE_FETCH_PAGES=0.000000,
    AVERAGE_RANDOM_PAGES=1.000000,
    AVERAGE_RANDOM_FETCH_PAGES=0.000000,
    NUMRIDS=35,
    NUMRIDS_DELETED=0,
    NUM_EMPTY_LEAFS=0
WHERE INDNAME = ’NAME_IND’ AND INDSCHEMA = ’SKAPOOR ’
      AND TABNAME = ’STAFF’ AND TABSCHEMA = ’SKAPOOR ’;

现在,将 FIRSTKEYCARD、FIRST2KEYCARD、FULLKEYCARD 和 NUMRIDS 从 35 修改为 37。现在保存 db2look.out 文件并运行这 3 个文件:

db2 -tvf config.out > config_output.out
db2 -tvf storage.out > storage_output.out
db2 terminate
db2stop
db2start
db2 -tvf db2look.out > db2look_output.out

检查前两个文件 config_output.out 和 storage_output.out 的内容,以确保它们运行成功。现在,检查 db2look_output.out 文件的内容。您将看到下列更新语句失败了:

UPDATE SYSSTAT.INDEXES SET NLEAF=1, NLEVELS=1, FIRSTKEYCARD=37, FIRST2KEYCARD=37
, FIRST3KEYCARD=-1, FIRST4KEYCARD=-1, FULLKEYCARD=37, C

上一页  [1] [2] [3] [4] [5] [6]  下一页

[] [返回上一页] [打 印]
文章评论 (评论内容只代表网友观点,与本站立场无关!)

用户名: 查看更多评论

分 值:100分 85分 70分 55分 40分 25分 10分 0分

内 容:

         (注“”为必填内容。) 验证码: 验证码,看不清楚?请点击刷新验证码