说明
数据库的性能有一部分体现在SQL执行效率上,达梦采用代价优化器来对SQL的执行做判断,选择一条经过数据库算法运算后生成认为‘代价’最小的执行路径来执行,但是使用优化器并不是一劳永逸,在很多时候的数据库SQL性能故障都是因为SQL执行计划出现差错,没有选择最佳的执行计划或者SQL语句没有在合适的列上创建合适的索引。为了解决SQL执行产生的数据库性能问题,DBA会查看数据库中该SQL的执行计划来判断SQL执行是否正常,是否还能够继续优化SQL,本文主要针对达梦数据库如何查看执行计划和手工收集统计信息做的一篇文章。
执行计划
执行计划是SQL语句的执行方式,由查询优化器为语句设计的执行方式,交给执行器去执行。在达梦中我们可以在SQL命令行使用EXPLAIN可以打印出语句的执行计划。
生成执行计划的方式一般为
EXPLANIN SQL语句;
举例一个简单SQL进行分析:
EXPLAIN SELECT A.C1+1,B.D2 FROM T1 A, T2 B WHERE A.C1 = B.D1;
该执行计划执行过程如下:
1) CSCN2: 扫描 T2 表的聚集索引,数据传递给父节点索引连接;
2) NEST LOOP INDEX JOIN2: 当左孩子有数据返回时取右侧数据;
3) SSEK2: 利用 T2 表当前的 D1 值作为二级索引 IDX_T1_C1 定位查找的 KEY,返 回结果给父节点;
4) NEST LOOP INDEX JOIN2: 如果右孩子有数据则将结果传递给父节点 PRJT2, 否则继续取左孩子的下一条记录;
5) PRJT2: 进行表达式计算 C1+1, D2;
6) NSET2: 输出最后结果;
7) 重复过程 1) ~ 4)直至左侧 CSCN2 数据全部取完。
简略的说,可以理解为CSCN2扫描T2表的索引,一行一行的返回给父节点,如果返回结果有数据,父节点则从SSEK2中获取详细的数据向上继续传递输出。
达梦中执行计划涉及到的一些主要操作符:
CSCN :基础全表扫描(a),从头到尾,全部扫描
SSCN :二级索引扫描(b), 从头到尾,全部扫描
SSEK :二级索引范围扫描(b) ,通过键值精准定位到范围或者单值
CSEK :聚簇索引范围扫描© ,通过键值精准定位到范围或者单值
BLKUP :根据二级索引的ROWID 回原表中取出全部数据
生成统计信息
– 针对表自身的
SP_TAB_STAT_INIT(‘SCHEMA_NAME’,‘TABLE_NAME’)
– 针对索引的
SP_INDEX_STAT_INIT(‘SCHEMA_NAME’,‘INDEX_NAME’)
– 针对全库的(慎用)
SP_DB_STAT_INIT();
– 针对列的
SP_COL_STAT_INIT(‘SCHEMA_NAME’,‘TABLE_NAME’,‘COL_NAME’)
STAT 100 ON TABLE_NAME(COL_NAME);
– 针对sql 语句的
SP_SQL_STAT_INIT(‘SQL语句’)
[可以更新视图的统计信息。]
更多资讯请上达梦技术社区了解:https://eco.dameng.com