在此次DCA培训中。达梦老师在讲课过程中提到了SQL的执行计划,为此勾起了我强烈的学习学习欲望,说执行计划不得不提统计信息。
达梦数据库查询优化器采用基于代价的计算方法。在优化器估算查询代价时,也是以统计信息或者普遍的数据分布为主要依据的,这跟Oracle数据库类似,oracle9i时优化器默认以rbo的方式,10g以后默认基于成本的优化器原理,用户可以根据sql的情况的选择合适的优化器模式。所以,统计信息在达梦数据库优化中是至关重要的。例如统计信息缺失,或统计信息陈旧,或采样数据不能很好地反映数据分布时,优化器选择的执行计划不是“最优” 的,甚至可能是很差的执行计划,就会引起严重的数据库性能问题,甚至导致数据库服务器夯死。
统计信息主要是描述数据库中表、索引的大小、规模、数据分布状况等的一类信息。比如,表的行数、块数、平均每行的大小、索引的leaf blocks、索引字段的行数、不同值的大小等,都属于统计信息
达梦数据库的对象统计信息分三种类型:表统计信息、列统计信息、索引统计信息。通过直方图来表示。统计信息生成过程分以下三个步骤:
1) 表:计算表的行数、所占的页数目、平均记录长度
2) 列:统计列数据的分布情况
3) 索引:统计索引列的数据分布情况
2. 确定采样率
根据数据对象的大小,通过内部算法,确定数据的采样率。采样率与数据量成反比。
3. 生成直方图
在执行查询时,如果数据对象存在统计信息,CBO可以根据统计信息中的数据,比较精确地计算出操作所需花费的成本,以此来确定连接方式、对象访问路径、连接顺序,选择最优的执行计划。
可通过修改OPTIMIZER_DYNAMIC_SAMPLING参数值在缺乏统计信息时进行动态统计信息收集。
在oracle中可以采用多种方式获取SQL的执行计划,当执行计划变化后,用户可干预执行计划,在达梦中可通过4中方式获取sql的真实计划 。
(一)通过disql 中 set autotrace 等功能获取
(二)、v$cachepln中获取执行计划
v$cachepln中保存了SQL缓冲区中的执行计划信息,在ini参数USE_PLN_POOL !=0时才统计。根据v$cachepln中的cache_item可以获取实际执行计划信息,同时结合events事件,可看到完整的执行计划,但dump文件中无cost等信息。
三、通过dbms_sqltune系统包
DBMS_SQLTUNE系统包兼容Oracle的DBMS_SQLTUNE包的部分功能,提供一系列对实时SQL监控的方法。
当SQL监控功能开启后,DBMS_SQLTUNE包可以实时监控SQL执行过程中的信息,包括:执行时间、执行代价、执行用户、统计信息等情况。使用DBMS_SQLTUNE也需要将DM.INI参数ENABLE_MONITOR、MONITOR_TIME、MONITOR_SQL_EXEC设置为1。使用DBMS_SQLTUNE.REPORT_SQL_MONITOR方法可以查看上述执行号为1124的执行计划信息。
方法三的结果相对来说的很详细,我们可以看到执行计划每一步的代价,对于sql优化更有帮助(更熟悉点);
以上是我整理的部分文档,愿我们一起共同努力学习。
文章
阅读量
获赞