达梦数据库统计信息的重要性及维护

达梦数据库统计信息的重要性及维护
前言
数据库的统计信息是什么?简单的说,它就是存储在数据字典中的一组数据,从多个角度描述了数据库对象的详细信息,如行数、页数、列数据分布情况、索引列数据分布和直方图信息情况等等。统计信息的作用是什么?举个例子,你想从家去市图书馆,你可以骑行、开车或坐地铁,这个时候你就要做个决定,哪种出行方式最适合你且时间成本最低,这个决定由什么来帮助你确定呢?是信息,你打开百度地图一看,发现现在很堵车,打开天气通APP发现气温很低且北风5级。于是你做出了坐地铁的决定,这就是信息帮助你做出了最优的出行方式。同样的道理,当一条SQL请求发送到数据库的时候,数据库的优化器也要通过一系列的代价算法来决定如何生成成本最低的执行计划(连接方式、访问路径、连接顺序及索引的选择),同时计算出所需花费的成本。而这个执行计划和花费的成本就需要统计信息的帮助了。下面就从如何查看、收集、维护和计划收集统计信息几个方面来分别讲解一下,希望能给达梦数据库爱好者一些帮助,也希望大家看到不准确的地方也能给出指正。
一、如何查看当前的统计信息
在介绍如何查看统计信息之前,先说下达梦数据库哪些对象不支持统计信息(参考DM8 SQL语言使用手册)。

  • 外部表、DBLINK 远程表、动态视图、记录类型数组所用的临时表;
  • 所在表空间为OFFLINE的对象;
  • 位图索引,位图连接索引、虚索引、无效的索引、全文索引;
  • BLOB、IMAGE、LONGVARBINARY、CLOB、TEXT、LONGVARCHAR 等列类型。
    举例:获取SYSDBA用户emp表的统计信息
    可通过DBMS_STATS包的TABLE_STATS_SHOW存储过程获取EMP表的统计信息,如下:
    达梦数据库统计信息的重要性及维护
    同样可以通过COLUMN_STATS_SHOW和INDEX_STATS_SHOW来获取列和索引的统计信息。
    达梦数据库统计信息的重要性及维护
    如果EMP表的索引统计信息如下,说明该索引没有统计信息
    达梦数据库统计信息的重要性及维护
    可以执行如下过程来收集EMP表所有索引的统计信息
    达梦数据库统计信息的重要性及维护
    再次查询索引统计信息,就可以看到了
    达梦数据库统计信息的重要性及维护
    二、如何收集和维护统计信息
    统计信息的收集和维护可以通过DBMS_STATS包或SP_DB_STAT_INIT、SP_INDEX_STAT_INIT、SP_TAB_STAT_INIT等系统函数来实现,我简单整理如下:
    1、SP%STAT%INIT系统函数的
    达梦数据库统计信息的重要性及维护
    达梦数据库统计信息的重要性及维护
    达梦数据库统计信息的重要性及维护
    以上均参考《DM8 SQL语言手册》19章附录三的统计信息,也可以查看v$ifun视图查看,当然也支持对表分区的统计信息进行收集(SP_TAB_STAT_INIT_FOR_PARTITION)。
    达梦数据库统计信息的重要性及维护
    2、DBMS_STATS 包的使用
    DBMS_STATS包同样可以实现统计信息的收集,同时Oracle DBA对它也不陌生,可以通过desc dbms_stats来查看这个包体的内容,由于篇幅过长,只截取部分内容
    达梦数据库统计信息的重要性及维护
    TABLE_STATS_SHOW可以查看表的统计信息,GATHER_TABLE_STATS可以用来收集表的统计信息,GATHER_SCHEMA_STATS可用来收集模式(用户)下所有对象的统计信息。
  • 查看EMP表的统计信息
    达梦数据库统计信息的重要性及维护
  • 收集SYSDBA用户的统计信息,采样率指定100,并行度为2
    达梦数据库统计信息的重要性及维护
    三、如何利用作业实现统计信息自动收集
    达梦数据库统计信息的收集没有作为内部作业来提供自动收集的功能,但我们依然可以利用达梦的作业系统来实现自动化,当然,对于统计信息的收集,还是应该结合业务的实际情况来,如果交易类型简单,且数据量的变化是规则的,可以不用定期收集统计信息,甚至可以固定统计信息。这里只给大家介绍如何利用作业来自动收集统计信息,其他不再赘述。
  • 进入DM安装目录的tool目录,执行manager调用DM管理工具
    达梦数据库统计信息的重要性及维护
  • 连接到对应的数据库实例,选择创建代理环境
    达梦数据库统计信息的重要性及维护
  • 代理环境具备后,开始创建作业
    首先填写作业名和作业描述
    达梦数据库统计信息的重要性及维护
    创建作业步骤
    达梦数据库统计信息的重要性及维护
    创建作业调度
    达梦数据库统计信息的重要性及维护
    查看DDL语句
    达梦数据库统计信息的重要性及维护
    点击确定,完成作业创建
    达梦数据库统计信息的重要性及维护
    也可以创建执行脚本的自定义作业,比如你只想收集某几张表的统计信息,可以用前面章节中的DBMS_STATS包或SP系统函数编写自定义的脚本,在作业中调度,这里不再演示了。
    四、案例
    数据库在创建一张表并导入数据后,系统并不会自动生成对应的统计信息,这样的结果就是会导致执行计划不正确,进而影响业务的性能。下面演示一个案例进行说明
  • 创建EMP表,数据量856行,创建EMP表employee_id列的索引ind_emp
    达梦数据库统计信息的重要性及维护
  • 收集统计信息前后SQL执行计划的对比
    达梦数据库统计信息的重要性及维护
    我们可以看到,表默认创建后是没有统计信息的,第一次执行SQL的执行计划是走的“#CSCN2: [0, 856, 280]; INDEX33555530(EMP)”,是扫描EMP表的聚集索引(达梦数据库的默认表类型为索引组织表)。当我们手动收集统计信息后,再次执行SQL,执行计划变为走EMP表的IND_EMP索引。