技术开发 频道

DB2日常维护之优化

  使用 CLEANUP ONLY 选项对分区表的索引进行重组时,支持任何访问级别。如果未指定 CLEANUP ONLY 选项,则缺省访问级别 ALLOW NO ACCESS 是唯一支持的访问级别。

    REORG INDEXES 具有下列要求:

    1)对索引和表具有 SYSADM、SYSMAINT、SYSCTRL 或 DBADM 权限,或者具有 CONTROL 特权。

    2)用于存储索引的表空间的可用空间数量等于索引的当前大小

    在发出 CREATE TABLE 语句时,考虑在大型表空间中重组索引。

    3)其他日志空间

    REORG INDEXES 需要记录其活动。因此,重组可能会失败,尤其是在系统繁忙和记录其他并发活动时。

    注: 如果具有 ALLOW NO ACCESS 选项的 REORG INDEXES ALL 命令运行失败,则会标记索引无效并且此项操作不可撤销。但是,如果具有 ALLOW READ ACCESS 选项的 REORG 命令或具有 ALLOW WRITE ACCESS 选项的 REORG 命令运行失败,则可以复原原来的索引对象。另外还需要注意,在 DB2 V9 开放平台上对新引入的表分区功能来说,不能联机重组分区表。

    4.对表和索引进行 runstats

    DB2 优化器使用目录统计信息来确定任何给定查询的非常好的访问方案。如果有关表或索引的统计信息已过时或者不完整,则会导致优化器选择不是非常好的的方案,并且会降低 执行查询的速度。但是,决定要为给定的工作负载收集哪些统计信息是很复杂的事情,并且使这些统计信息保持最新是一项很花费时间的任务。

    以往,建议对一个频繁进行大量更新、插入或者删除操作的表进行 RUNSTATS,建议在重组表之后运行 RUNSTATS 。我们都是通过手工执行 RUNSTATS 命令,或者通过 DB2 任务中心调度执行 RUNSTATS 命令来收集表的统计信息以改善数据库性能。现在 DB2 V9 又新增了自动收集统计信息功能, 自动收集统计信息通过收集最新的表统计信息来改善数据库性能。 DB2 首先确定工作负载需要哪些统计信息以及需要更新哪些统计信息,然后,在后台自动调用 RUNSTATS 实用程序以确保收集并维护正确的统计信息。然后,DB2 优化器根据准确的统计信息来选择访问方案。

    从 IBM DB2 版本 9.1 开始,在创建新的数据库时,缺省情况下会启用自动收集统计信息(RUNSTATS)功能。这表示 DB2 数据库管理器将确定是否需要更新数据库统计信息。然后,RUNSTATS 实用程序会根据需要在后台自动运行,以确保最新的数据库统计信息可用。用户在创建数据库之后,可以通过将数据库配置参数 AUTO_RUNSTATS 设置为 OFF 来禁用自动收集统计信息。需要注意的是,将数据库从版本 8 迁移到版本 9.1 时,不会自动启用此功能。要在已迁移的数据库中使用此功能,必须手工进行启用。

    通过使用自动统计信息收集功能,可以让 DB2 确定是否需要更新数据库统计信息。在启用了自动统计信息收集功能的情况下,DB2 将自动在后台运行 RUNSTATS 实用程序以确保最新的数据库统计信息可用.

    RUNSTATS命令的语法如下:

    >>-RUNSTATS ON TABLE--table-name-------------------------------->

    >-----+-+--------------------------------------------------------------------+-+>

    | '-WITH DISTRIBUTION--+--------------------------------------------+--' |

    |                      '-AND--+----------+--+-INDEXES ALL--------+--'    |

    |                             '-DETAILED-' '-INDEX--index-name--'       |

    '-+--------------------------------------------------+-------------------'

    '--+-AND-+---+----------+--+-INDEXES ALL--------+--'

    '-FOR-'   '-DETAILED-' '-INDEX--index-name--'

    >-----+--------------------------+-----------------------------><

    |            .-CHANGE----. |

    '-SHRLEVEL--+-REFERENCE-+--'

    如果没有启用自动统计信息功能,那么我们还需要手工对需要的表和索引使用 runstats 命令,更新统计信息。比如想对 TEST 表和索引运行统计信息,发出“ runstats on table test and index all ” 。

    对表 TEST 以及索引更新统计信息

    C:\> db2 runstats on table rhette.test and index all

    DB20000I   RUNSTATS 命令成功完成。

    收集索引统计信息以允许优化器评估是否应该使用索引来解析查询。如果想收集索引统计信息,必须连接至包含表和索引的数据库并具有下列其中一个权限级别:sysadm 、sysctrl 、sysmaint 、dbadm 、对表的 CONTROL 特权 。

    带 SAMPLED DETAILED 选项执行 RUNSTATS 命令需要 2MB 统计信息堆。将附加的 488 个 4K 页分配给为此附加内存需求设置的 stat_heap_sz 数据库配置参数。如果该堆看起来太小,则 RUNSTATS 在尝试收集统计信息之前会返回一条错误。

    现在我们在 DB2CLP 窗口中,连上示例数据库 SAMPLE,在示例数据库中存在表 RHETTE.PROJECT,其有两个索引 PK_PROJE CT 和 XPROJ2,我们要创建索引 PK_PROJE CT 和 XPROJ2 的详细统计信息,可以发出带 AND DETAILED INDEXES ALL 选项的 RUNSTATS 命令。创建索引 PK_PROJECT 和 XPROJ2 的详细统计信息

    C:\> db2 RUNSTATS ON TABLE rhette.project AND DETAILED

    INDEXES ALL DB20000I   RUNSTATS 命令成功完成。

    命令成功完成。如果我们想创建两个索引的详细统计信息,但是不想耗费太多的资源和时间,可以使用采样的方式而不是对每个索引条目执行详细计算。

    创建索引 PK_PROJECT 和 XPROJ2 的详细统计信息,使用采样方式

    C:\> db2 RUNSTATS ON TABLE rhette.project AND SAMPLED DETAILED

    INDEXES ALL DB20000I   RUNSTATS 命令成功完成。

    命令成功完成。如果要创建索引上的详细采样统计信息以及表的分布统计信息,以便索引和表统计信息一致,可以使用带 WITH DISTRIBUTION 选项的 RUNSTATS 命令。

    收集表 rhette.project 的详细统计信息

    C:\> db2 RUNSTATS ON TABLE rhette.project

    WITH DISTRIBUTION ON KEY COLUMNS AND SAMPLED

    DETAILED INDEXES ALL DB20000I   RUNSTATS 命令成功完成。

    命令成功完成。如果想全面收集表和索引的信息,而不是使用抽样的方式收集表 rhette.project 的详细统计信息

    C:\> db2 RUNSTATS ON TABLE rhette.project WITH DISTRIBUTION

    AND DETAILED INDEXES ALL DB20000I   RUNSTATS 命令成功完成。

    5 (可选) 上面命令完成后可以重复第二步,检查REORG的结果,如果需要,可以再次执行REORG和RUNSTATS命令。

    6 BIND或REBIND

    RUNSTATS命令运行后,应对数据库中的PACKAGE进行重新联编,简单地,可以使用db2rbind命令来完成。

    db2rbind命令的语法如下:

    >>-db2rbind--database--/l logfile----+------+------------------->

    '-all--'

    .-conservative--.

    >-----+-------------------------+--/r--+-any-----------+-------><

    '-/u userid--/p password--'

    例如,如果数据库名为SAMPLE,执行:

    db2rbind sample -l db2rbind.out

    二、DB2 V8.2 如何配置AUTO_RUNSTATS

    1.配置参数

    首先确保DBM参数HEALTH_MON是ON,

    然后使用如下命令打开AUTO_RUNSTATS 的开关。

    db2 update db cfg using AUTO_MAINT ON AUTO_TBL_MAINT ON AUTO_RUNSTATS ON

    2.设置需要自动RUNSTATS的表的profile,该profile会纪录于系统表sysibm.systables的STATISTICS_PROFILE列

    例如:

    db2 runstats on table huangdk.hasales and indexes all tablesample system(20) set profile only

    说明:a.RUNSTATS的语法见《命令指南》

    http://publib.boulder.ibm.com/in ... c/core/r0001980.htm

    b.tablesample 是采样runstats的选项,例子里采用system的方法,采样20%

    3.AUTO_RUNSTATS触发条件

    配置完后,需要重起一下实例,然后系统会在第一次连接请求时,去触发AUTO_RUNSTATS,如果表需要RUNSTATS,就开始RUNSTATS。

    以后,系统每隔3小时触发AUTO_RUNSTATS

    用户可以使用以下语句检查:

    db2 select STATS_TIME,SUBSTR(STATISTICS_PROFILE,1,200) from sysibm.systables

    其中,STATS_TIME列指示最后一次RUNSTATS的时间。

    另外,db2diag.log里有这样的信息:

    2004-10-27-16.08.39.007000+480 I30117H327         LEVEL: Event

    PID     : 2596                 TID : 3404        PROC : db2fmp.exe

    INSTANCE: DB2                  NODE : 000

    FUNCTION: DB2 UDB, Automatic Table Maintenance, db2HmonEvalStats, probe:100

    START   : Automatic Runstats: evaluation has started on database TBCSAMPL

    指示自动RUNSTATS已经运行。

    三、优化语句的批量获取

    1、查找数据库管理表空间(DMS)

    SELECT TBSpace FROM syscat.tablespaces WHERE TBSpaceType = 'D' ;

    2、DMS下的creator(用户、模式)

    SELECT DISTINCT creator

    FROM sysibm.systables

    WHERE tbspace IN (SELECT TBSpace FROM syscat.tablespaces WHERE TBSpaceType = 'D' );

    'DB2ADMIN'

    3、creator下的表数量

    SELECT creator,count(1)

    FROM sysibm.systables

    WHERE Type = 'T' AND tbspace IN (SELECT TBSpace FROM syscat.tablespaces WHERE TBSpaceType = 'D')

    GROUP BY creator ;

    --'DB2ADMIN'    56

    4、构造优化脚本

    --=============================================================================

    (1).reorgchk update statistics on table SCHEMA.TABLE ;

    select 'reorgchk update statistics on table DB2ADMIN.'||rtrim(name)||';' from sysibm.systables where creator = 'DB2ADMIN' AND Type = 'T' AND tbspace IN (SELECT TBSpace FROM syscat.tablespaces WHERE TBSpaceType = 'D')

    --=============================================================================

    (2).reorg table SCHEMA.TABLE ;

    select 'reorg table DB2ADMIN.'||rtrim(name)||';' from sysibm.systables where creator = 'DB2ADMIN' AND Type = 'T' AND tbspace IN (SELECT TBSpace FROM syscat.tablespaces WHERE TBSpaceType = 'D')

    --=============================================================================

    (3).reorg indexes all for table SCHEMA.TABLE ;

    select 'reorg indexes all for table DB2ADMIN.'||rtrim(name)||';' from sysibm.systables where creator = 'DB2ADMIN' AND Type = 'T' AND tbspace IN (SELECT TBSpace FROM syscat.tablespaces WHERE TBSpaceType = 'D'

    --=============================================================================

    (4).runstats on table SCHEMA.TABLE and indexes all;

    select 'runstats on table DB2ADMIN.'||rtrim(name)||' and indexes all;'

    from sysibm.systables

    where creator = 'DB2ADMIN' AND

    Type = 'T' AND

    tbspace IN (SELECT TBSpace FROM syscat.tablespaces WHERE TBSpaceType = 'D') ;

    --=============================================================================
 

0
相关文章