执行REORG可以考虑分为表上有索引和没有索引两种情况: 1) 如果表上有索引
如表名为DB2INST1.STAFF,索引名为DB2INST1.ISTAFF,命令如下:
db2 reorg table db2inst1.staff index db2inst1.istaff use tempspace1
建议REORG时使用USE参数指定数据重排时使用的临时表空间,否则,REORG工作将会在表所在表空间中原地执行。
如果表上有多个索引,INDEX参数值请使用最为重要的索引名。 2) 如果表上没有索引
如表名为DB2INST1.STAFF, SYSIBM.SYSTABLES
db2 reorg table db2inst1.staff use tempspace1
db2 reorg table sysibm.systables use tempspace1
使用 REORG TABLE 命令重组 RHETTE.TEST 表 C:\> db2 reorg table rhette.test
DB20000I REORG 命令成功完成。
要使用临时表空间 TEMPSPACE1 重组表 RHETTE.TEST,可以在 DB2CLP 窗口中使用带 USE TEMPSPACE1 选项的 REORG TABLE 命令。
使用临时表空间 TEMPSPACE1 重组 RHETTE.TEST 表 C:\> db2 reorg table rhette.test use TEMPSPACE1
DB20000I REORG 命令成功完成。
下面我们在示例表 TEST 上创建一个索引 A1,构建在 ID 列上。此时我们想要重组表并根据索引 A1 对行进行重新排序,可以使用带 INDEX 选项的 REORG TABLE 命令。
根据索引 A1 重组 RHETTE.TEST 表 C:\> db2 create index a1 on rhette.test(id)
DB20000I SQL 命令成功完成。 C:\> db2 reorg table rhette.test index a1
DB20000I REORG 命令成功完成。
如果想使用 SQL 调用语句重组表,请使用 ADMIN_CMD 过程发出 REORG TABLE 命令。
使用 SQL 调用语句重组 RHETTE.TEST 表 C:\> db2 call sysproc.admin_cmd ( 'reorg table rhette.test index a1' )
返回状态 = 0
要使用 DB2 管理 API 重组表,请使用 db2REORG API 。 在重组表之后,应收集有关表的统计信息,以便优化器具有最准确的数据来评估查询访问方案。另外,记住在分区数据库环境中,如果想在所有节点运行命令,需要使用 db2_all 命令。
通过删除和插入操作对表进行更新后,索引的性能会降低,其表现方式如下:
1)叶子页分段。
叶子页被分段之后,由于必须读取更多的叶子页才能访存表页,因此 I/O 操作成本会增加。
2)物理索引页的顺序不再与这些页上的键顺序相匹配(此称为不良集群索引)。
叶子页出现不良集群情况后,顺序预取操作的效率将降低,因此会导致更多的 I/O 等待。
3)形成的索引大于其最有效的级别数。
在此情况下应重组索引。
如果在创建索引时设置了 MINPCTUSED 参数,则在删除某个键且可用空间小于指定的百分比时,数据库服务器会自动合并索引叶子页。此过程称为联机索引整理碎片。但是,要复原索引集群和可用空间以及降低叶级别,请使用下列其中一种方法:
1)删除并重新创建索引。
2)使用 REORG INDEXES 命令联机重组索引。
因为此方法允许用户在重建表索引期间对表进行读写操作,所以在生产环境中可能需要选择此方法。
3)使用允许脱机重组表及其索引的选项运行 REORG TABLE 命令。
在使用 ALLOW WRITE ACCESS 选项运行 REORG INDEXES 命令时,如果同时允许对指定的表进行读写访问,则会重建该表的所有索引。进行重组时,对基础表所作的任何将会影响到索引的更改都将记录在 DB2 日志中。另外,如果有任何内部内存缓冲区空间可供使用,则还将这些更改放在这样的内存空间中。重组将处理所记录的更改以便在重建索引时与当前写活动保持同 步更新。内部内存缓冲区空间是根据需要从实用程序堆中分配的指定内存区域,它用来存储对正在创建或重组的索引所作的更改。使用内存缓冲区空间使索引重组操 作能够通过这样的方式来处理更改,即先直接从内存读取,然后读取日志(如有必要),但读取日志的时间要晚得多。在重组操作完成后,将释放所分配的内存。重 组完成后,重建的索引可能不是最佳集群的索引。如果为索引指定 PCTFREE,则在重组期间,每页上均会保留相应百分比的空间。
对于分区表,支持对各个索引进行联机索引重组和清除。要对各个索引进行重组,指定索引名:REORG INDEX index_name for TABLE table_name
对于空间索引或多维集群(MDC)表,不支持采用 ALLOW WRITE 方式的联机索引重组。
注: REORG INDEXES 命令的 CLEANUP ONLY 选项不能完全重组索引。 CLEANUP ONLY ALL 选项将除去那些标记为“删除”且被认为要落实的键。此外,它还将释放所有标记为“删除”且被认为要落实的键所在的页。在释放页后,相邻的叶子页将会合并, 前提是这样做可以在合并页上至少留出 PCTFREE 可用空间。 PCTFREE 是指在创建索引时为其定义的可用空间百分比。 CLEANUP ONLY PAGES 选项仅删除那些标记为“删除”且被认为要落实的所有键所在的页。
使用 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') ;
--=============================================================================