Chinaunix首页 | 论坛 | 博客
  • 博客访问: 486572
  • 博文数量: 83
  • 博客积分: 2570
  • 博客等级: 少校
  • 技术积分: 901
  • 用 户 组: 普通用户
  • 注册时间: 2007-06-19 12:05
文章分类

全部博文(83)

文章存档

2012年(1)

2011年(1)

2010年(8)

2009年(14)

2008年(45)

2007年(14)

我的朋友

分类: DB2/Informix

2008-06-24 14:54:46

一、Update Statistics的作用
  为了提高数据库的效率,INFORMIX提供了一个基于成本的查询优化器, 执行update statistics语句的作用就是将您创建的数据库表的有关统计信息更新到系统sysmaster的相关表中(如systables、syscolumns、sysindexes、sysdistrib、sysprocplan等),以便查询优化器选择最佳的执行路径。当sysmaster库中没有相应的统计信息,或者统计信息不十分准确时,优化器便无法制定一个行之有效的查询策略,其结果必然是进行大量极其可怕的顺序扫描,产生严重的性能问题。
  
  因此,当您重新装载数据或者对数据库表进行了大量的更新操作后,应该及时执行update statistics。也许您会发现,数据库一些参数配置的不合理可能使数据库效率降低百分之几,但如果您没有定期执行update statistics的话。数据库的性能则可能降低几到十几倍。
  
  二、Update Statistics的语法
  执行update statistics共有三个级别,即:update statistics low、updates tatistics medium、update statistics high。
  1 update statistics[low]for table[{table-namesynonym-name}[(column-list)]]][drop distributions]
  update statistics low只更新表、字段、记录数、页数及索引等的最基本信息,对字段的分布情况不做统计。其语法说明如下:
  
  (1)update statistics或update statistics low,对当前数据库中所有表(包括系统表)及过程进行更新统计。
  (2)update statistics low for table,对当前数据库中所有表(包括临时表,但不包括系统表)进行更新统计。
  (3)update statistics low for table tablename,对指定的表所有字段进行更新统计。
  (4)update statistics low for table tablename(column-list),对指定表的指定字段进行更新统计。
  (5)如果不带drop distributions,原有字段分布情况依然保留;否则,原有字段分布情况将被删除。
  2 update statistics medium[for table[{table-namesynonym-name}[(column-list)]]][resolution percent[conf]][distributions only]
  update statistics medium除了更新表、字段、记录数、页数及索引等的最基本信息外,对字段的分布情况会采取抽样的办法来统计,因此与update statistics low相比需要花费更多的时间。其语法说明如下:
  
  (1)resolution percent是指分布统计的详细程序,percent定义的是一个百分数,如resolution2意思是指按照字段的值分布统计成50段,如果不指定resolution percent,缺省值为2.5。
  (2)conf是指分布统计时取样的比例,conf参数的取值范围为0.80—0.99,缺省值为0.95。
  (3)如果指定了distributions only,则对索引的信息不做更新统计。
  3 update statistics high[for table[{table-namesynonym-name}[(column-list]]][resolutionpercent][distributions only]
  update statistics high与update statistics medium的区别是在统计字段的分布情况时,后者采用了取样的办法,而前者进行全部统计,因此update statistics high更新统计最全面,执行时间也最长。其语法说明如下:
  
  (1)如果不指定resolution percent,缺省值为0.5。
  (2)如果指定了distributions only,则对索引的信息不做更新统计。
  4 update statistics for procedure[procedure-name],只对指定的过程进行更新统计,对表不做更新统计

原理

给定查询的不同执行策略可能会有不同的代价,构造具有最小查询执行代价的查询执行计划是数据库系统的职责。查询优化是为了查询选择最有效的查询策略的过程。查询优化是尽量找出与给定表达式等价的、但是执行效率更高的一个表达式,而且决定执行运算时所采用的具体算法以及将使用的特定索引等。
为了在诸多查询策略中作出选择,数据库系统的优化器必须估计每个查询策略的代价,磁盘访问次数常常是衡量代价的主要标准。在没有按照某策略执行查询前,准确计算出该策略的代价是不可能的,所以,优化器要利用数据库系统中的统计信息,来估计查询策略的代价。Informix数据库系统这些统计信息保存在SYSMASTER数据库中,
如果要维护准确的统计值,那么每当表数据修改时,相应的统计值也必须更新,这种更新会带来很大的代价,因此Informix系统不是在每次修改时对统计值更新。因此,用于选择查询策略的统计数据不一定完全正确,有时会遇到查询用不到应该使用的索引,就是统计信息没有更新的原因。 对Informix数据库系统,这些统计信息保存在SYSMASTER数据库中,可以使用UPDATE STATISTICS命令更新。
以下是用于估计代价的信息:
记录数
表空间的页数
记录长度
字段不同值个数
字段值的分布
索引的层数
索引叶结点数目
索引B+树的深度
索引是升序还是降序或聚类索引
索引占用的页面数目
Informix 数据库服务器中的优化器为SQL语句的查询提供最有效的策略,这就使得你在进行表的连接查询时不必全面考虑究竟那个表首先搜索,以及究竟需要使用那个索引。
通过执行update statistics命令可以更新系统的统计信息,使得优化器得到当前最新的统计信息。当修改或删除一个表的相关数据时,系统的统计信息并不自动更新。比如:如果使用delete命令删除一个数据库表内的一条记录,删除完成后查找systables内关于该表的记录信息时,将会发现nrows(数据库表的记录行数目)并没有改变。而通过执行update statistics命令,就可以使系统表systables、sysdistrib、syscolumns、sysindexes等表内的信息得到更新。在运行完update statistics后,这时就会发现systables内的nrows字段已得到更新。如果执行update statistics  medium(high),在sysdistrib表内还可以得到更新的数据分布信息。所以,当大量地修改数据库表后最好执行一下update statistics操作。另外,update statistics将强迫存储过程的优化(对sysprocpplan更新)。以下是与update statistics 相关的系统表:

1、syscolumns:
描述了数据库内的每个字段,其中的colmin、colmax存储了数据库各表字段的次小及次大值,这些值只有在该字段是索引且运行了Update statistics之后才生效。如对于字段值1、2、3、4、5,则4为次大值,2为次小值。

2、sysdistrib:
存储了数据分布信息。该表内提供了详细的表字段的信息用于提供给优化器优化SQL  Select语句的执行。当执行update statistics  medium(high)之后将往此表存入信息。
执行“dbschema -hd”可以得到指定表或字段的分布信息

2、sysindexes:
描述了数据库内的索引信息。对于数据库内的每个索引对应一条记录。修改索引之后只有执行Update statistics才能使其改变在该表内得到反映。同时也更新clust的数值,在该表的数据页数目及数据库记录条数之间

3、systables:
通过执行Update statistics可以更新nrows数据

update statistics有以下三种级别:

1、LOW:
缺省为LOW,此时搜集了关于column的最少量信息。只有systables、syscolumns、sysindexes内的内容改变,不影响sysdistrib。为了提高效率,一般对非索引字段执行LOW操作

2、HIGH:
此时构建的分布信息是准确的,而不是统计意义上的。
因为耗费时间和占用CPU 资源,可以只对表或字段执行HIGH操作。对于非常大的表,数据库服务器将扫描一次每个字段的所有数据。可以配置DBUPSPACE环境变量来决定可以利用的最大的系统磁盘空间
3、MEDIUM:
抽样选取数据分布信息,故所需时间比HIGH要少
什么时候应该执行update ststistics ?
建议在以下情况,执行update statistics 操作:
对数据做了大量修改,大量是针对数据的分布而言,若数据分布没有明显的改变则可以不做
改变的数据库表有与之相关的存储过程,避免在运行时存储过程重新优化
数据库升级之后完成对索引的转变
update ststistics 的方法
考虑到速度性能因素,执行update statistics的推荐方法:
对表执行:update  statistics medium for table ####  distributions only
对每个索引的首字段执行:update statistics high
对复合索引执行:update statistics low
必要时对非索引字段但在条件中使用到的字段执行Update statistics high操作[/size]

 

 

 


  

阅读(1954) | 评论(0) | 转发(0) |
0

上一篇:DB9线缆连接线说明

下一篇:tomcat ssl配置

给主人留下些什么吧!~~