reorg(reorg卫衣)

软件问答 2022.12.26 155

目录:

“db2 reorg” 做什么用的?

reorgchk,检查table index 是否需要重组。reorg 重组,重新放置数据位置。runstats 统计信息,可以优化查询器

一个完整的日常维护规范可以帮助 DBA 理顺每天需要的操作,以便更好的监控和维护数据库,保证数据库的正常、安全、高效运行,防止一些错误重复发生。

由于DB2使用CBO作为数据库的优化器,数据库对象的状态信息对数据库使用合理的 ACCESS PLAN至关重要。DB2 优化器使用目录统计信息来确定任何给定查询的最佳访问方案。如果有关表或索引的统计信息已过时或者不完整,则会导致优化器选择不是最佳的方案,并且会降低 执行查询的速度。当数据库里某个表中的记录变化量很大时,需要在表上做REORG操作来优化数据库性能

如何使用 REORG 和 RUNSTATS 命令优化数据库性能

当数据库里某张表上有大量插入操作时,需要在表上做 RUNSTATS 命令保证数据库掌握准确的统计信息。

当数据库里某张表中的记录变化很大时(大量插入、删除、更新操作),需要在表上做 REORG 和 RUNSTATS 一组维护操作来优化查询的性能。有的表,可能初始化后从来都不会有数据量变化,就只需要做一次维护;有的表,一天之内的变化就很大,每天需要做多次维护。

注意,针对数据库对象的大量操作,如反复地删除表,存储过程,会引起系统表中数据的频繁改变,在这种情况下,也要考虑对系统表进行REORG操作。

一个完整的 REORG 表的过程应该是由下面的步骤组成的:

RUNSTATS - REORGCHK - REORG - RUNSTATS - BIND 或 REBIND

0 执行下面命令前要先连接数据库

1 RUNSTATS

由于在第二步中 REORGCHK 时可以对指定的表进行 RUNSTATS 操作(在 REORGCHK 时指定 UPDATE STATISTICS),所以第一步是可以省略的。如果知道哪些特点的表有数据变化,又可以只执行第一步而省略第二步。

如果表名为 DB2INST1.STAFF,表上有索引,可以执行下面的 RUNSTATS 操作:

db2 runstats on table db2inst1.staff with distribution and detailed indexes all

2 REORGCHK

REORGCHK是根据统计公式计算表是否需要重整。

对于每个表有3个统计公式,对索引有5个统计公式(版本8),如果公式计算结果该表需重整,在输出的 REORG 字段中相应值为*,否则为-。

如果数据库中数据量比较大,在生产系统上要考虑 REORGCHK 的执行时间可能较长,需安排在非交易时间执行。

可以分为对系统表和用户表两部分分别进行 REORGCHK:

1) 针对系统表进行REORGCHK

db2 reorgchk update statistics on table system

使用 UPDATE STATISTICS 参数指定数据库首先执行 RUNSTATS 命令。

2) 针对用户表进行 REORGCHK

db2 reorgchk update statistics on table user

根据统计公式的计算结果(是否有 *),考虑是否必要对表进行 REORG。注意,某些小表的结果可能由于统计信息过少而不准确。

3 REORG TABLE

执行 REORG 可以考虑分为表上有索引和没有索引两种情况:

1) 如果表上有索引

如表名为 DB2INST1.STAFF,索引名为 DB2INST1.STAFF,

REORG 表:

db2 reorg table db2inst1.staff index db2inst1.istaff use tempspace1

建议 REORG 时可以使用USE参数指定数据重排时使用的临时表空间。如果不指定, REORG 工作将会在表所在表空间中原地执行。

如果表上有多个索引,INDEX 参数值请使用最为重要的索引名。

REORG 索引:

db2 reorg indexes all for table db2inst1.staff

2) 如果表上没有索引

如表名为DB2INST1.STAFF, SYSIBM.SYSTABLES

db2 reorg table db2inst1.staff use tempspace1

db2 reorg table sysibm.systables use tempspace1

4 RUNSTATS

参见步骤 1。

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

6 BIND 或 REBIND

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

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

db2rbind sample -l db2rbind.out

reorg到底需要多少表空间

脱机reorg需要一定的空间,这个空间与目标所在的数据表空间、索引表空间、以及临时表空间均有关,各空间需求的大小与表和索引所占用的数据页和索引页相关。

(1)对表执行reorg操作如:db2 reorg table tabschema.tabname,可以理解成四个步骤:

1、排序

2、构建

3、替换

4、重建索引

当执行第1,2,3步时,使用目标表所在的数据表空间,将在数据表空间中建立目标表的影子副本。

此时,数据表空间会增长,增长量为目标表实际大小:Npages*表空间页大小。

Npages:表示目标表有效数据页,Npages可通过如下方式获得,但未必精确,最好先收集一下统计信息(runstats)。

db2 "select substr(tabname,1,20),Npages,Fpages,card from syscat.tables"

1,2,3结束后,数据表空间碎片整理完成,空间回收。

当执行第4步时,使用系统临时表空间,有几个索引顺序重建几次。

此时,系统临时表空间会增长,增长量为单个索引占用的大小,约为:nleaf*索引表空间页大小。

nleaf:表示有效索引页,nleaf可通过如下方式获得,但未必精确,最好先收集一下统计信息(runstats)。

db2 "select substr(tabname,1,20),substr(indname,1,18),nleaf,indcard from syscat.indexes"

4结束后,reorg table完成。

(2)对索引执行reorg操作如:db2 reorg indexes all for table tabschema.tabname

一般一张表有多个索引,将对多个索引一个一个地依次进行reorg操作,最后统一替换。

表空间使用情况:

系统临时表空间会增长,增长量为单个索引占用的大小,约为:nleaf*索引表空间页大小。

索引表空间会增长,增长量为一张表中所有索引占用的大小。

例如对一张表的3个索引进行reorg操作,可以看到如下现象:

索引表空间立即降到一个值:A,

系统临时表空间增长,增长"nleaf*索引表空间页大小"后下降至初始大小,同时索引表空间增长"nleaf*索引表空间页大小",

系统临时表空间又增长,增长"nleaf*索引表空间页大小"后又下降至初始大小,同时索引表空间在第一次增长的基础上又增长"nleaf*索引表空间页大小",

系统临时表空间再增长,增长"nleaf*索引表空间页大小"后再下降至初始大小,同时索引表空间再前两次增长的基础上再增长"nleaf*索引表空间页大小",

最后,索引表空间直接降到一个值:A,系统临时表空间回收。

(3)对表执行reorg操作如:db2 reorg table tabschema.tabname use tempspace1

对表和索引均进行reorg操作

均在系统临时表空间中进行

先对数据页reorg,再对索引页reorg

数据页reorg需要的系统临时表空间为:Npages*表空间页大小

一般一张表有多个索引,索引reorg将一个一个依次顺序进行,单个索引的索引页reorg需要的系统临时表空间为:nleaf*索引表空间页大小

(4)在线对表做reorg时,表空间使用非常少。

一般为表空间的extent size(一般为32k),多个并发的话,就要多个extent size。

知道reorg怎样使用表空间之后,我们在做reorg时就要注意各个空间是否预留足够,预留多少算足够呢?

可以按一下方法推算:

(1)离线不指定临时表空间reorg table(目前常用的)

数据表空间预留最大Npages的量,最大的Npages*表空间页大小,最大的表对应的Npages可通过以下sql获得

db2 "select substr(tabname,1,20),Npages,Fpages,card from syscat.tables order by Npages desc fetch first 10 rows only"

临时表空间预留最大nleaf的量,最大的nleaf*表空间页大小,最大的索引对应的nleaf可通过以下sql获得

db2 "select substr(tabname,1,20),substr(indname,1,18),nleaf,indcard from syscat.indexes order by nleaf desc fetch first 10 rows only"

(2)reorg indexes all

索引表空间预留单个表中含有的所有nleaf的量

db2 "select substr(tabname,1,20),substr(indname,1,18),nleaf,indcard from syscat.indexes where tabname='tabname'"

临时表空间预留最大nleaf的量

(3)离线指定临时表空间reorg table use tempspace

临时表空间预留最大Npages的量和最大nleaf的量

以上是一个时间点只对一张表进行reorg,但同一时间多张表并行reorg时,就要算多个表的空间了。

建议,

所有的数据表空间和索引表空间的使用量控制在50%以下,这样就不用担心数据和索引的表空间溢出了。

对于临时表空间,建议至少有最大nleaf的量。

本文转载自互联网,如有侵权,联系删除

相关推荐