GBase 8s
性能调优
文章

GBase8s 更新统计使用

GBase社区管理员
发表于2024-01-02 15:54:15853次浏览0个评论

一、Update Statistics的作用

  为了提高数据库的效率,GBase8s提供了一个基于成本的查询优化器,执行update statistics语句的作用就是将您创建的数据库表的有关统计信息更新到系统表中(如systables、syscolumns、sysindexes、sysdistrib、sysprocplan等),以便查询优化器选择最佳的执行路径。当系统中没有相应的统计信息,或者统计信息不十分准确时,优化器便无法制定一个行之有效的查询策略,其结果必然是进行大量极其可怕的顺序扫描,产生严重的性能问题。

执行 update statistics 命令,就可以使系统表 systa bles 、 sysdistrib 、 syscolumns 、 sysindexes等表内的信息得到更新

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

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

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

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

  因此,当您重新装载数据或者对数据库表进行了大量的更新操作后,应该及时执行update statistics。也许您会发现,数据库一些参数配置的不合理可能使数据库效率降低百分之几,但如果您没有定期执行update statistics的话。数据库的性能则可能降低几到十几倍。

二、Update Statistics的语法

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

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

2、HIGH: 
        此时构建的分布信息是准确的,而不是统计意义上的。 
因为耗费时间和占用CPU 资源,可以只对表或字段执行HIGH操作。对于非常大的表,数据库服务器将扫描一次每个字段的所有数据。可以配置DBUPSPACE环境变量来决定可以利用的最大的系统磁盘空间

3、MEDIUM: 
        抽样选取数据分布信息,故所需时间比HIGH要少 

        Update Statistics的语法:

1 、update statistics[low]for table[{table-name|synonym-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-name|synonym-name}[(column-list)]]][resolution percent[conf]][distributions only] 
update statistics medium除了更新表、字段、记录数、页数及索引等的最基本信息外,对字段的分布情况会采取抽样的办法来统计,因此与update statistics low相比需要花费更多的时间。其语法说明如下:
        (1)  resolution percent是指分布统计的详细程序,percent定义的是一个百分数,如resolution 2意思是指按照字段的值分布统计成50段,如果不指定resolution percent,缺省值为2.5。
        (2)  conf(Confidence)是指分布统计时取样的比例,conf参数的取值范围为0.80—0.99,缺省值为0.95。
        (3)  如果指定了distributions only,则对索引的信息不做更新统计。

分辨率和置信度

要理解 UPDATE STATISTICS,需要掌握两个重要的术语:分辨率和置信度。

分辨率 是指放入每个容器(bin)的数据所占的百分比。分辨率是介于 0.005 到 10 之间的一个数。

置信度(Confidence) 用于度量所得估值与实际值之间的相似程度。它用一个介于 0.80 到 0.99 之间的值表示。理想情况下,置信度应该比较高。

对于 high 模式,默认的分辨率为 0.5,对于 medium 模式,默认的分辨率为 2.5。对于 high 模式,默认的置信度为 0.99。对于 medium 模式,默认的置信度介于 0.85 到 0.99 之间。

3、 update statistics high[for table[{table-name|synonym-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],只对指定的过程进行更新统计,对表不做更新统计

三、如何执行Update Statistics

  通常执行update statistics的方法是:
        1、对表中不带索引的字段执行update statistics medium,每个表执行一次。一般情况下,缺省参数就足够了。对于特别大的表(执行update statistics时,通常把超过26570条记录的表定义为特别大的表),可以带参数resolution1.00.99。
        2、对表中带有索引的字段执行update statistics high,每个字段执行一次。
        3、对表中带有复合索引的字段执行update statistics low,每个表执行一次。
        4、对每一个小表执行update statistics high。

四、注意事项

        1、数据库本身不会自动更新系统表中有关statistics统计信息,只有执行update statistics语句后,才能得到更新。

        2、执行update statistics语句时,必须具有DBA权限或者为表的属主。

        3、由于update statistics通常为单线程运行,不能利用PDQ等并发功能,对于一个较大的数据库,执行update statistics语句一般需要几个小时。为提高效率,可以将update statistics分为多个shell程序同时执行,并充分考虑数据空间分布情况,在并发执行时减少磁盘读写的冲突。

        4、执行update statistics语句会占用一些临时空间,当临时空间不够时,数据库将提示错误。您可以通过设置DBUPSPACE环境变量,使update statistics在遇到临时空间不够时分步来执行排序统计。

        5、执行update statistics时会占用系统资源且会锁表,建议在业务空闲时段进行update statistics

五、update statistics举例

例 1:用于整个数据库的 UPDATE STATISTICS

UPDATE STATISTICS [LOW | MEDIUM | HIGH];

例 2:用于数据库中特定表的 UPDATE STATISTICS。在这种情况下,所有列都被更新。

UPDATE STATISTICS [LOW | MEDIUM | HIGH] FOR TABLE <table_name> ;

例 3:用于数据库中特定表的特定列的 UPDATE STATISTICS。

UPDATE STATISTICS [LOW | MEDIUM | HIGH] FOR TABLE <table_name> (<column_name>);

例4:用于数据库中某个存储过程的 UPDATE STATISTICS。

UPDATE STATISTICS [LOW | MEDIUM | HIGH] FOR PROCEDURE;

例 5:通过设置自己的分辨率执行 UPDATE STATISTICS。

UPDATE STATISTICS [LOW | MEDIUM | HIGH] FOR TABLE <table_name> RESOLUTION 10;

六、查看数据分布信息

在对表或索引做了更新统计后,我们可以通过以下命令查看表数据的分布信息:

dbschema -d dbname -hd tabname

 

[gbasedbt@hugo ~]$ dbschema -d test -hd t3

DBSCHEMA Schema UtilityGBASE-SQL Version 12.10.FC4G1AEE

{

Distribution for gbasedbt.t3.a

Constructed on 2022-03-07 12:43:13.00000--(最后一次更新统计时间)

High Mode, 0.500000 Resolution--(分辨率,更新统计时不制定Resolution默认0.5)

--- DISTRIBUTION ---

(1)

1: ( 1,1,1)

2: ( 1,1,2)

3: ( 1,1,3)

4: ( 1,1,4)

5: ( 1,1,6)

--- OVERFLOW ---

1: ( 3,5) 

        以上为表t3字段a的数据分布(只有在对表或索引执行更新统计后才有以上信息输出)

        可以看到5个分布桶 (DISTRIBUTION),共有三列,其中第一列为该桶中数据值个数,第二列为该桶中不同的值的个数,第三列为该桶中数据的上限。DISTRIBUTION 用于表示数据在各个区间的分布情况,在以 medium、high 方式生成统计信息时,可以通过 resolution 关键词指定该分布百分比,例如比率为 10% 时,如果数据值个数足够的话,一般最多会有 100/10=10 个分布桶。

        溢出桶OVERFLOW 中只有两列,其中第一列为数据值重复的个数,第二列为该数据值。列中的某个数据值出现的次数多到一定程度时才在这里出现。比如这里,5 这个数值在该列中出现的次数为3次。

        当某个值的重复次数满足以下条件时,才放置到 OVERFLOW( 溢出桶 ) 中:

Overflow = 25% * resolution * number_rows

附加信息:

  • 用于 Update Statistics 命令的理想模式是什么?

不存在所谓的 “理想” 模式。DBA 应该分析当前情况,然后选择 UPDATE STATISTICS 的模式。但是,下面的列表为帮助您选择最佳模式提供了一些提示:

如果被更改的行数很多,或者刚在不同版本的数据库服务器之间完成迁移,则应使用 UPDATE STATISTICS LOW。对于不是索引起始列的所有列,也应使用该模式。
仅当查询中有非索引连接列或过滤列时,才使用 UPDATE STATISTICS MEDIUM DISTRIBUTIONS。
如果查询中有属于多列索引的连接列或过滤列,则使用 UPDATE STATISTICS HIGH <table>。
如果查询中有很多小型的表(在一个盘区),则使用 UPDATE STATISTICS HIGH ON <small tables>。

  • 我在运行该语句时,可以自己设置分辨率和置信度吗?

可以,设置的语法如下: UPDATE STATISTICS MEDIUM FOR TABLE <tabname> RESOLUTION 1 0.99-----> confidence

 

  • 我发现整个过程会消耗很多时间,占用很多资源。您不认为直接执行查询更好一些吗?

我们应该牢记,在准备统计数据时,只考虑样本行,而不会读所有的行。因此,除非以 high 模式运行,否则 UPDATE STATISTICS 与执行查询本身是不能相提并论的。

 

  • 什么是理想的分辨率值?

不存在所谓的 “理想的” 分辨率值。这个值完全取决于数据和应用程序。

 

  • 所有三种模式的默认分辨率和置信度是多少?

对于 HIGH 模式,默认的分辨率为 0.5,对于 MEDIUM 模式,默认的分辨率为 2.5。
对于 HIGH 模式,默认的置信度为 0.99,对于 MEDIUM 模式,默认的置信度介于 0.85 到 0.99 之间。

 

  • 在存储过程上执行 UPDATE STATISTICS 是什么意思?

数据库服务器再度优化指定过程中的 SQL 语句。数据库服务器不更新系统编目表中的统计信息。

 

  • 当我将分辨率设为 0.5,置信度设为 0.99,并以 MEDIUM 模式运行 UPDATE STATISTICS 时,会发生什么情况?这是否等效于以 HIGH 模式运行该语句?

是的。

 

  • 我最多可以使用多少个容器?

理想情况下,分辨率是介于 0.005 到 10 之间的一个值。因此容器的数量介于 10 到 20,000 之间。但是基本上,容器的最大数量取决于磁盘空间和 IDS 施加的任何限制。

  • 什么情况下需要执行UPDATE STATISTICS

从异构数据库迁移到GBase8s后,对全库执行update statistics;单表大数据量导入数据,需对表执行update statistics;热点表(表日常频繁插入、删除、更新数据),需定期对表、索引首字段执行update statistics。

评论已关闭