Gbase_Reed
作者Gbase_Reed2017-03-02 10:19
数据库运维工程师, 南大通用

Gbase 8t数据库统计更新

字数 5727阅读 3812评论 0赞 4

1. update statistics的作用

1.1 优化器

为了提高数据库的效率,INFORMIX提供了查询优化器,它是一个用于准备查询计划的优化器。理想情况下,查询计划是执行给定计划的最佳计划,也就是说,它会确定抓取数据的最佳方式。为此,它使用一个统计数据集合;然而,这种统计数据并不一定是准确的。这种数据的准确性取决于很多因素,例如采用的抽样算法的类型、抽样的数量和数据的歪斜情况。
查询优化器不会自动重新计算表的配置文件。在某些情况下,收集统计信息需要的时间可能比执行查询的时间更长。因此,为确保优化器选择的查询计划能够最好地反映表的当前状态,应定期运行UPDATE STATISTICS。

1.2 UPDATE STATISTICS

统计信息更新是优化器的依据
执行update statistics语句的作用就是将创建的数据库表的有关统计信息更新到系统sysmaster的相关表中,以便查询优化器选择最佳的执行路径。当sysmaster库中没有相应的统计信息,或者统计信息不十分准确时,优化器便无法指定一个行之有效的查询策略,其结果必然是进行大量极其可怕的顺序扫描,产生严重的性能问题。
因此,当重新装载数据库或者对数据库表进行了大量的更新操作后,应该及时执行update statistics。如果因为数据库参数配置不合理会使数据库效率降低百分之几,但如果没有定期执行update statistics,数据库的性能则可能会降低几到几十倍。

2. 统计更新影响的信息

每当运行UPDATE STATISTICS查询时,以下系统编目表都会被刷新。以下列出的是影响的信息:
 表systables
 Nindexes-表中索引的数量
 Nrows-表中的行数
 Npused-数据库服务器曾经在tablespace中启动过的数据页数
 表syscolumns
 Colmin-最小列长(以字节计)
 Clomax-最大列长(以字节计)
 表sysindexes和sysfragments
 Level-B-tree中的级数数目
 Leaves-B-tree中包含的叶子的数量
 Nunique-第一列中唯一键的数目(也就是唯一键值的数目)
 Clust-与表相关的集群度(较小的数字对应较大的集群)
 表sysdistrib
 包含用户数据表的值的分布信息的行(因此所有列都受影响)
 它维护份分布的分辨率和置信度

3. update statistics的模式

执行update statistics共有三个级别,即:update statistics low、update statistics medium、update statistics high。

3.1 update statistics low

3.1.1 说明

默认为low,此时搜集了关于column的最少量信息。只有systables、syscolumns、sysindexes内的内容改变,不影响sysdistrib。为了提高效率,一般对非索引字段执行LOW操作。
Update statistics low只更新表、字段、记录数、页数及索引等的最基本信息,对字段的分布情况不做统计。

3.1.2 语法

Update statistics [low] for table [{table-name|synonym-name} [(column-list)]] [drop distributions]
Update statistics或update statistics low,对当前数据库中所有表(包括系统表)及过程进程更新统计。
Update statistics low for table tablename,对指定的表所有字段进行更新统计。
Update statistics low for table tablename(column-list),对指定表的指定字段进行更新统计。
如果不带drop distributions,原有字段分布情况依然保留;否则,原有字段分布情况将被删除。(升级到新版本的数据库服务器时,可能需要删除分布信息,以除去sysdistrib系统目录表中旧的分布结构)

3.1.3 案例1

库名:test
表名:testtable 1972125行数据


 此时向testtable表中插入一条数据

 在不执行update statistics的情况下查询systables表中的nrows变化


 此时执行update statistics,再次查询systables表中的nrows变化


3.2 update statistics medium

3.2.1 说明

除了更新表、字段、记录数、页数及索引等的最基本信息外,对字段的分布情况会采取抽样的办法来统计,因此与update statistics low相比需要花费更多的时间。

3.2.2 语法

Update statistics medium [for table [{table-name|synonym-name} [(column-list)]]] [resolution percent[conf]] [distributions only]
resolution percent是指分布统计的详细程序,percent定义的是一个百分数,它是介于0.005到10之间的一个数。如resolution 2意思是指按照字段的值分布统计成50段,如果不指定resolution percent,默认值为2.5。
conf是指分布统计时取样的比例,conf参数的取值范围为0.80-0.99,默认值为0.95。
如果指定了distribution only,则对索引的信息不做更新统计(TBD)

3.2.3 案例1

数据库:demo1
表名:orders 23行数据
在不做update statistics的时候,查看是否有分布信息

 现在对表中的某列执行update statistics

 再次查看是否有分布信息

 从显示结果中可以看出,已经创建了数据分布。

 从上图可以看出是对informix用户下的orders表中的paid_date列做了统计更新操作。

 此次统计更新的resolution和confidence分别是2.5和0.95
 因为resolution为2.5,所以可以按照字段的值分布统计成40段(容器数量=100/分辨率,也就是bin的数量)。意味着每个bin中包含2.5%的数据。
 Confidence指的是抓取的数量占总数量的百分比。

 上面的列分别代表的是:
 容器的标识符:(bin大小,当前范围中不同元素的数量,当前范围最大值)

 上图中列代表的分别是:
 容器标识符:(重复元素的数量,重复的值)
 当具有很多重复值的时候到一个bin中查找,比到每个bin中查找更方便,更快捷。

3.2.4 案例2

使用resolution参数


 此次统计更新的resolution和confidence分别是10和0.95
 Bin的大小为2,当前范围中不同元素的数量为2

3.3 update statistics high

3.3.1 说明

此时构建的分布信息是准确的,而不是统计意义上的。
Update statistics high与update statistics medium的区别是在统计字段的分布情况时,前者使用了取样的办法,而后者进行全部的统计,因此update statistics high更新统计最全面,执行时间也最长。
因为耗费时间和占用CPU资源,可以只对表或字段执行HIGH操作。对于非常大的表,数据库服务器将扫描一次每个字段的所有数据。可以配置DBUPSPACE环境变量来决定可以利用的最大的系统磁盘空间。

3.3.2 语法

 Update statistics high [for table [{table-name|synonym-name}[column-list]]] [resolution percent] [distributions only]
 如果不指定resolution percent,默认为0.5
 如果指定了distributions only,则对索引的信息不做更新统计
补充:
Update statistics for procedure [procedure-name],只对指定的过程进行更新统计,对表不做更新统计。

3.3.3 案例

使用update statistics high对字段分布信息进行统计
 数据库:demo1
 表名:orders 23行数据
 现在对表中的某列执行update statistics

 查看分布信息

4. 如何执行update statistics

 如果被更改的行数很多,或者刚在不同版本的数据库服务器之间完成迁移,则应使用update statistics low。
 当查询中有非索引连接或过滤列时使用update statistics medium,每个表执行一次。一般情况下,默认参数就可以。
 如果查询中有属于多列索引的连接或过滤列时执行update statistics high[table]
 对每一个小表执行update statistics high

5. 注意事项

 只要执行UPDATE STATISTICS MEDIUM或UPDATE STATISTICS HIGH命令,数据库服务器就会创建向优化器提供信息的数据分布。
 数据库服务器通过对列的数据进行取样、排序数据、构建分发容器和将结果插入sysdistrib系统目录表中来创建数据分布。
 数据库本身不会自动更新sysmaster库中有关statistics统计信息,只有执行update statistics语句后,才能得到更新。
 执行update statistics语句时,必须具有DBA权限或者为表的属主。
 由于update statistics通常为单线程运行,不能利用PDQ等并发功能,对于一个较大的数据库,执行update statistics语句一般需要几个小时。为提高效率,可以将update statistics分为多个shell程序同时执行,并充分考虑数据空间分布情况,在并发执行时减少磁盘读写的冲突。
 仅当使用UPDATE STATISTICS的HIGH选项时,数据库服务器使用DBSPACETEMP配置参数指定的存储位置。
 执行update statistics语句会占用一些临时空间,当临时空间不够时,数据库将提示错误。

5.1 临时表空间的案例

 首先建立两个chunk文件
[informix@vm1 chunk]$ touch temp.chk
[informix@vm1 chunk]$ touch temp1.chk
[informix@vm1 chunk]$ chmod 660 temp.chk temp1.chk
 建立一个临时表空间,再建立一个正常的表空间
[informix@vm1 ~]$ onspaces -c -d tempdbs -t -p /opt/IBM/informix/chunk/temp.chk -o 0 -s 1000
Verifying physical disk space, please wait ...
Space successfully added.
[informix@vm1 ~]$ onspaces -c -d temp1dbs -p /opt/IBM/informix/chunk/temp1.chk -o 0 -s 1000
Verifying physical disk space, please wait ...
Space successfully added.

WARNING A level 0 archive of Root DBSpace will need to be done.
 将建立的表空间的名字写到配置文件的对应位置,如下
DBSPACETEMP tempdbs,temp1dbs
执行update statistics操作
update statistics high for table;
 因为建立的临时表空间的大小太小,所以导致临时表空间不够,出现如下错误
567: Cannot write sorted rows.
179: ISAM error: no free disk space for sort
 向temp1dbs中添加一个50M的chunk文件
[informix@vm1 chunk]$ touch temp2.chk
[informix@vm1 chunk]$ chmod 660 temp2.chk
[informix@vm1 chunk]$ onspaces -a temp1dbs -p /opt/IBM/informix/chunk/temp2.chk -o 0 -s 50000
Verifying physical disk space, please wait ...
Chunk successfully added.
 将之前没有执行完的分布信息删除
update statistics low for table drop distributions;
 此时,再次执行update statistics操作
update statistics high for table;
Statistics updated.

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

4

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

  • GIS性能测试
    评论 0 · 赞 0
  • 使用VS2010测试GIS demo
    评论 0 · 赞 0
  • 相关文章

    相关问题

    相关资料

    X社区推广