使用 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') ;
--=============================================================================