- 1、本文档共9页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
10.1 日常运维工具概述
Runstats是run statistics的缩写,意思是收集统计信息,目的是为DB2优化器提供最佳路径选择;
Reorg是重组的意思,目的是减少表和索引在物理存储上的碎片,提供性能;
Reorgchk是重组前的检查
Rebind是对一些包、存储过程或静态程序进行重新绑定。
几个工具的执行流程:
首先通过Runstats收集表和索引的统计信息,然后执行Reorg重组,如果有必要则执行,然后再次收集统计信息。最后,对于静态语句、存储过程等,执行Rebind绑定。
10.2 Runstats
在系统运行一个查询的时候,优化器需要决定用某种方式来访问数据。只有当DB2对表中的数据有一个大概的了解,才能知道每一步操作大约需要处理多少数据,返回多少行。当优化器了解了这些信息后,就会根据一系列的运算,判定出各种访问途径所需要消耗的资源,然后从中选择一个消耗资源最少的方法。
最普通的Runstats就是统计表和索引中有多少行数据,有多少不同的数值。
Runstats命令使用DISTRIBUTION参数手机数据分布。数据分布分为两种,一种叫做频率采样(Frequency),一种叫做百分比采样(Quantile)。当收集数据分布时,两种采样方式都会被收集。其中频率采样是手机表中拥有相同数量最多的几行,比如10000行数据中9000行为10,然后500行为9,然后100行为8,剩下的部分平均分布。如果我们制定Frequency为3的话,那么系统就会记录下来有9000行10,500行9,然后100行8,剩下的部分在估算时则假定平均分布。而百分比采样则是将整个10000行数据分成相等大小的若干段,然后记录每一段的段首和段尾的数值,当需要查询一个数据段时(比如C110 AND C115),就可以根据每一个数据段的启始数值加上段落的大小,估算出符合查询条件的记录数量。
理论上,数据分布收集的越细致越好。但是经过细致的数据分布信息可能会导致DB2在优化SQL时需要处理更多的信息,并占用更多的系统存储空间,可能会导致性能的下降。因此,一般情况下我们建议使用默认的数据分布采样设置,也就是频率采样为10,百分比采样为20。但是,有些情况下,则需要根据实际情况调整分布参数。
Runstats的语法比较复杂,在实际应用中,最常用的几种使用方法如下:
1)为表和索引收集统计信息,包括数据分布,代码如下:
RUNSTATS ON TABLE 表模式.表名 ON ALL COLUMNS WITH DISTRIBUTION AND DETAILED INDEXES ALL
2)收集索引统计信息,如果表上没有统计信息,该选项会同时对表做统计。但该选项并不会收集数据分布信息,代码如下:
RUNSTATS ON TABLE 表模式.表名 FOR INDEXES ALL
3)使用伯努利算法抽样统计。DB2会扫描每一行数据,但只对一定比例的抽样数据进行统计。这种方法一般用于数据仓库中的大表如果收集全表数据统计,将需要很长时间,并占用CPU资源,应用性能会造成影响。下列采用了伯努利10%抽样统计,代码如下:
runstats on table 表模式.表名 tablesample bernoulli(10)
如何查看一个表是否收集了统计信息?一个比较有效的办法是查看syscat.tables的stats_time字段,如果该字段值为空,则表示没有收集过统计信息,否则会显示统计信息的时间:
db2 select char(tabname,20) as tabname,stats_time form syscat.tables where STATS_TIME is NULL
DB2 runstats 命令只能针对单表执行,而无法对整个数据库做运行时统计(虽然可以使用reorgchk update statistics 对所有表收集统计信息,但reorgchk并不会收集分布统计)。可考虑将需要执行runstats的表写入一个脚本,以下是一个脚本范例:
#!/bin/ksh
if [$#3];then
echo USAGE: $0 DB_NAME DB_USER_NAME DB_PASSWORD
exit
fi
DB=$1
DB_USER=$2
DB_PWD=$3
db2 connect to $DB user $DB_USER using $DB_PWD
db2 select rtrim(RUNSTATS ON TABLE||rtrim(tabschema)||.||tabname|| ON ALL COLUMNS WITH DISTRIBUTION ON ALL COLUMNS AND SAMPLED DETA
文档评论(0)