第一篇:090511DB2如何计算和添加表空间、索引的检查和手动进行执行对索引的runstats操作
如何计算和添加表空间、索引的检查和手动执行对索引的runstats
操作
DB2】runstats详解
2009年06月24日 星期三 11:01 1.runstats的语法:
runstats on table [模式名].[表名] with distribution and detailed indexes all 注意:你可以在所有列上,或者仅仅在某些列或列组(除了LONG和LOB列)上执行RUNSTATS。如果没有指定特定列的子句,系统则会使用默认的ON ALL COLUMNS子句。
使用RUNSTATS WITH DISTRIBUTION 当您已确定表中包含不是统一分布的数据时,可以运行包含WITH DISTRIBUTION子句的RUNSTATS。目录统计信息表通常包含关于表中最高和最低值的信息,而优化器假定数据值是在两个端点值之间均匀分布的。然而,如果数据值彼此之间差异较大,或者群集在某些点上,或者是碰到许多重复的数据值,那么优化器就无法选择一个最佳的访问路径,除非收集了分布统计信息。使用WITH DISTRIBUTION子句还可以帮助查询处理没有参数标志符(parameter marker)或主机变量的谓词,因为优化器仍然不知道运行时的值是有许多行,还是只有少数行。
如果为单一索引进行runstats,可以使用:
runstats on table [模式名].[表名] for indexes [索引名]
2.runstats的作用:
一个SQL在写完并运行之后,其实我们只是告诉了DB2去做什么,而不是如何去做。而,具体的如何去做,就取决于优化器。优化器为了生成最优的执行计划,就得掌握当前的系统信息,目录中的统计信息等等。
runstats命令就是用来收集数据库对象的状态信息,这对优化器生成最优的执行计划至关重要。
3.什么时候需要runstats:
·在给表创建一个index后,我们最好做一次runstat,否则可能index没有生效。不过有说法称在8.2版本以后的DB2中,会在INDEX之后自动进行runstats; ·.在对table做了一次reorg后,记得要做一次runstats。因为对表做reorg,会修改表的很多信息,比如高水位等,所以做一次runstats,可以更新统计信息。·当表里数据发生了比较大的变化,一般来说,大约表里面的数据量的10%-20%发生了变化,就应该作一次runstats。这些变化包括删除,修改,插入。对于一些非常大的表,比方在数据仓库的项目里面,某些事实表非常巨大。这个时候,完整的对一个大表作runstats可能花费时间相当大,DB2 8.1里面支持我们对这些大表作抽样,比方说只对20%的数据作runstats,这样的话,一般来说也能保证得到正确的执行计划。当然首先要确保这个表里面的数据最好分布比较均匀。
·.当你在分区(DPF)数据库里面使用了REDISTRIBUTE DATABASE PARTITION GROUP这个命令,那么就需要用runstats来收集新的统计信息。
4.其他
当表比较小的时候,runstats是一件很普通的事情。但是当表非常大的时候,runstats将会占用相当大的时间,cpu和内存。通常只在关键查询的速度开始减慢时,管理员才会对RUNSTATS给予适当的注意。您可以通过制定高效、有效收集统计信息的策略,避免未经思考就调优查询和执行RUNSTATS。
一、DB2 的表空间介绍:
DB2 的表空间按管理方式分为两种:系统管理空间(System Management Space,SMS)和数据库管理空间(Database Management Space,DMS)。
按类型分为:规则表空间、长整数表空间、系统临时表空间、用户临时表空间。其中长整数表空间只能是DMS的。
规则表空间中包含用户数据的表。默认用户表空间名为USERSPACE1,索引也存储在规则表空间中,另外系统目录表也放在规则表空间中。
默认的系统目录表空间名为SYSCATSPACE。
临时表空间分为系统临时表空间和用户临时表空间。系统临时表空间用来存储各种数据操作(排序、重组表、创建索引、连接表)中所需的内部临时数据,虽然可以创建任意多个系统临时表空间,但建议用户只使用大多数表所使用的页大小创建一个,默认系统临时表空间名为TEMPSPACE1。用户临时表空间用来存储已说明全局临时表(已说明全局临时表存储的是应用程序临时数据)。用户临时表空间不是在数据库创建时默认创建的。
SMS每个容器是操作系统的文件空间中的一个目录;DMS每个容器是一个固定的、预分配的文件,或是物理设备。
SMS的管理比较简单,由操作系统自动管理,空间的大小随数据量的变化系统自动调整。
DMS是由数据库管理的,空间大小在创建时确定,空间不够时要手工添加或删除部分数据以释放空间。
二、DB2 表空间的计算和添加:
在我们导入数据库表或建索引的时候,如果该表对应的表空间不足,无法存放,会引起导入失败,并有相应的提示。这时候,需要粗略计算该表所需的用户表空间大小,然后手动去修改该表空间的大小之后,重新执行。下面介绍一下表空间的修改方法:
(1)通过QC,以数据库的实例身份登录数据库,找到需要修改大小的表空间,如图
(一)所示;
图
(一)(2)在需要修改的表空间上,点击右键,选择“计算表空间”,如图
(二)所示;
图
(二)(3)得到如下图
(三)所示:
图
(三)从图
(三)中,可以看到数据表空间的使用情况,发现表空间不足,进行修改。选中红色区域后,点击“edit”后,如下图示:(4)图中粉色区域能计算出该表空间的大小: 10001—page,表示该表空间有10001页,而每一页大小是32k(ZM_DATA_32K),该表空间的实际大小就是:10001*32=320032k 将320032K单位转换为G:320032除1024除1024约等于0.3G
图
(四)(5)根据自己需要的该表空间大小,在此页面进行修改,如下图示:
图
(五)修改成需要的大小,单位可直接选择Gb,确认无误后,ok,进入下一个界面:
图
(六)Build script,执行修改表空间大小的语句即可,至此完成表空间大小的修改。
三、检验索引是否添加成功
当成功执行完一个索引的添加后,会在下图中某个表相关性的index的统计中显示出来的。
由上图我们可以看到在used by的indexs中,已经有了一个索引了,红框的位置分别显示了它的模式名和索引名称。
四、如何手动执行对索引的runstats操作
索引添加后,是必须要进行runstats的,因为要更新很多和这个表相关的系统文件信息。如果索引添加后,在执行runstats的时候,qc表错,没有执行下去,我们就要手动来执行runstats操作了。操作很简单,步骤如下: 1.在相关性中,找到已经添加成功的索引,如下图所示 右键=》utilities=》Collect Statistics,进入操作界面
2.如下图所示,在红框的位置进行勾选,之后创建语句并执行就可以了。
五、其他
1.个别省,若出现添加索引重复 的报错信息的,说明已经添加过此索引,则可以不进行当前索引的添加。
2.本文档不涉及oracle数据库的索引的添加。
另外:1.刚刚发了090512 内管数据库(DB2)大表添加索引语句及注意事项 的邮件,大家抽空看看
2.关于表结构等的更新
当完成对某个表的表结构的更新(比如加字段,改字段类型等)或是更新存储过程后,一般在packages中会需要重新编译一下。正常情况下,在qc中进行表结构和存储过程的更新后,系统会自动进行重新编译,但是也有无法自动编译的情况出现,此时,就需要我们手动的到qc中,进行手动的rebind的操作。操作步骤如下:
A、查找packages中,模式名为SXZMUSER的,同时,Vaild显示为No的内容; B、在 Vaild显示为No的内容中,可以单选或是多选,之后,点击右键,选择rebind,之后执行语句,即可。
如果为NO那么在执行存储过程的时候新增加或者新修改的字段有可能会出现问题或者存储过程执行不成功。
大家好!
在这个特殊的日子里面,我把最新的内管数据库(DB2)大表添加索引语句及注意事项,发给大家
1.执行要求是
A.要在客户不使用系统的时候进行添加
B.一共有12个添加索引的sql语句,在每次执行sql时,只能一次执行一个;绝对不可以在一次里面多个或全部的执行。
C.每次执行前要对索引占用的表空间(ZM_INDEX)的 剩余空间进行检查,不 剩余空间足10G的,要先扩充表空间,再执行。
D.执行过程中,必须有专人跟踪,顺利完成索引的添加后,再离开现场。若出现问题,及时和公司联系。
2.db2如何计算和添加表空间、索引的检查和手动进行执行对索引的runstats操作,大家可以参考附件的文档。
详见附件