暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

【干货攻略】达梦数据库DM8的SQL性能优化思路浅谈系列(三)

达梦E学 2023-04-27
1270

前言
我们在前两次的分享中介绍了SQL优化的重要性,针对预估执行计划生成及基础说明、达梦性能分析思路、达梦数据库DM.INI参数调整、跟踪存储过程中的慢SQL思路、辅助性能分析工具介绍和使用以及如何跟踪慢SQL进行了分享。今天我们接着来聊一下达梦数据库SF_INJECT_HINT的应用、达梦数据库性能压测工具适配、性能压测监控工具使用。


SF_INJECT_HINT的应用


在投产系统中,偶尔出现某个SQL性能问题。当SQL是应用代码发出的时候,通过DBA分析后,需要加hint解决,这个是时候苦于无法立即更新代码,加之系统又在运行中,则通过SF_INJECT_HINT方法急救非常有效。而我们在实际应用中,也是多次通过此函数解决了当前系统的性能瓶颈。
使用SF_INJECT_HINT需要开启DM.INI的ENABLE_INJECT_HINT 需设置为 1,否则无法使用,这个需要大家关注。经过实践总结,根据系统特性,需要加上hint的有如下2大类型的SQL语句,比较常见。通常会话表,在Oracle系统中也是需要Hint来辅助,否则也有一定的性能瓶颈;
(1)会话表关联查询,执行计划无法估算数据情况下,我们需要新增 * + NO_USE_CVT_VAR,ENABLE_INDEX_JOIN(0)/ 这类HINT操作,但是实际上还是要看执行计划了。
(2)二类是层次查询,其实我们看到数据库指定的CNNTB_OPT_FLAG并不能满足所有条件下的SQL,通常在DM.INI中,我们是设置的2,但是即使这样,在设计过程中,也需要根据有性能的SQL进行处理,通常我们需要加/+CNNTB_OPT_FLAG (X)*/,这个CNNTB_OPT_FLAG的X 数值是要根据我们对SQL执行计划优化后得出,并不是直接套用。目前CNNTB_OPT_FLAG 支持的参数有:1、2、4、8、16,31;

1.1新增注入HINT方法
    SF_INJECT_HINT(
    ‘SQL语句’,
    ‘ENABLE_INDEX_JOIN(0)’,
    ‘HINT_1207_1’,
    ‘这是一条对莫某功能语句的优化’,TRUE,TRUE
    );

    参数说明:

    第一个参数:SQL语句这个我们数据库有性能的语句,这个语句贴到函数中,请勿格式化,也请勿前后带有空格,否则不匹配;

    第二个参数:ENABLE_INDEX_JOIN(0),这里填写需要新增的hint,直接填写合适的hint即可,无需加/*+ */这类标识符,通常我们写在SQL中才需要这样加;

    第三个参数:HINT_1207_1这个是只是一个NAME名称;

    第四个参数:可以理解成一种注解;

    第五个参数:是否理解生效,我们一般救急肯定就设置TRUE了

    第六个参数:匹配规则为精准匹配或模糊匹配,设置NULL和TRUE是模糊匹配,否则FALSE 或缺省时精确匹配,如果SQL明确建议精确匹配;


    1.2删除注入HINT方法
      SF_DEINJECT_HINT(‘HINT_1207_1’');
      1.3注入SQL HINT实操

      某集团二级单位收到同事反馈,有个SQL执行非常慢,DSC双节点,已经积压了800多活动会话,情况比较紧急,当接到通知,我首先是快速登录客户端,通过慢SQL实时抓取方式,获取到了大量的积压SQL,看是否有异常的SQL,发现大量积压的SQL,是一个层次查询,然后在客户端执行下预估执行计划;

      看预估执行计划(如下图),明显估算不准确;

      及时检查了当前系统V$DM_INI select * from v$dm_ini where para_name=‘CNNTB_OPT_FLAG’ --发现是2;
        --注释说明:SQL脱敏处理过,代码逻辑是没有变化的
        SELECT /*+ CNNTB_OPT_FLAG(2)*/
        COXXID ,
        COMPXXDE ,
        PCOXXID ,
        COMPXXME ,
        ORGTYPEXXDE,
        DCXXDE ,
        STIME ,
        STOPXXAG
        FROM
        BASIC_ORGANIXXXXON
        WHERE
        OWNXXID = -1
        AND AXXID = -1
        AND NVL(STOPXXAG, 0) =0
        AND ORGANXXAG =1 START
        WITH COXXID = '3000'
        AND OWNXXID = -1
        AND AXXID = -1 CONNECT BY PRIOR COXXID = PMANAGECOXXID
        AND OWNXXID = -1
        AND AXXID = -1
        ORDER BY
        ORG_SXXT
        再通过真实服务器缓存计划发现预估和实际相差比较大:

        增加hint后/+ CNNTB_OPT_FLAG(16)/执行看:

        发现通过/+ CNNTB_OPT_FLAG(16)/ 更准确,然后快速通过注入HINT解决:
          SF_INJECT_HINT(
          'SELECT COXXID , COMPXXDE , PCOXXID, COMPXXME,ORGTYPEXXDE,DCXXDE,STIME,STOPXXAG FROM BASIC_ORGANIXXXXON WHERE OWNXXID= ? AND AXXID= ? AND NVL(STOPXXAG,0) =? AND ORGANXXAG=? START WITH COXXID = ? AND OWNXXID= ? AND AXXID= ? CONNECT BY PRIOR COXXID = PMANAGECOXXID AND OWNXXID= ? AND AXXID= ? ORDER BY ORG_SXXT ',
          'CNNTB_OPT_FLAG(16)',
          'HINT_1207_1',
          NULL,TRUE,TRUE
          );
          –-缓存hint添加,SQL请勿格式化,否则无法命中,详细可以看《DM8_SQL语言使用手册.pdf>详解。



          性能压测工具适配达梦使用


          工作中,并发SQL测试,是我们日常的一个重要工作项,单个SQL执行比较快,对一些高频的SQL,我们需要进一步的做性能压测,来满足投产需要,压测达梦数据库SQL,工作中主要用到Apache jmeter工具。针对 jmeter 5.4.1版本,压测工具需要jdk18以上运行环境。
          2.1、jmeter适配驱动包配置等
          压测SQL,以达梦为例,需在jmeter安装目录的lib目录下放入DM驱动包。首先在jmeter测试计划里添加我们DM驱动jar包。

          添加一个JDBC连接池配置组件和JDBC取样器。

          JDBC连接池配置:

             JDBC取样器配置:
          添加断言(断言是以字符串形式去判断)

          添加聚合报告和结果树:

          Jmeter线程组设置

          调度器勾选后为运行多久,值得注意的是ramp-up这个值,意思为200个线程要在20秒内去发起请求,为了避免并发下第一次涌入大量的请求(服务器压力大),这个值不建议太小,以日常工作为例,1秒加载10个线程,第一次不要涌入大量请求,循环跑起来后,第一个线程发起请求-服务器响应返回客户端,继续发起请求,第二个第三个线程以此类推,其实每个线程都是在执行自己的操作,发起-响应;
          2.2、压测报告
          如下图100并发性能报告压测结果图:达标我们一般看平均值




          性能压测监控工具



          达梦数据库性能并发压测,我们通常会采用第三方工具来监控数据库服务器的压力,今天主要简单介绍Linux服务器下通过nmon监控工具监控CPU,IO,内存等的方法;部署简单,找到对应ARM或X86版本,COPY到服务器任意目录,然后赋执行权限,即可安装使用,详细看如下教程说明;
          3.1、nmon简单部署

          步骤1:我这边是下载本地,直接FTP上传的;
            sftp> lcd C:\Users\xxxxx\Downloads\nmon16e_mpginc
            sftp> put nmon_x86_64_centos7
            Uploading nmon_x86_64_centos7 to /root/nmon_x86_64_centos7
            100% 392KB 392KB/s 00:00:01
            C:/Users/xxxxx/Downloads/nmon16e_mpginc/nmon_x86_64_centos7: 402146 bytes transferred in 1 seconds (392 KB/s)
            sftp> pwd
            /root
            步骤2:建立一个nmon_test目录,然后因为我FTP没有切目录,直接上传到root下了,做个mv处理;
              mv nmon_x86_64_centos7 /nmon_test/
              步骤3:
                chmod 775 nmon_x86_64_centos7
                以上就完成了部署。

                3.2、实时快捷监控CPU,内存,IO信息等

                  #./nmon_x86_64_centos7

                  通常如果只是对单个SQL性能调优压测,不输出报告模式,我们简单用快捷键监控即可,
                  这里说下常用快捷键:
                  常用快捷命令说明:
                  (1)# c 查看CPU相关信息
                  (2)# m查看内存相关信息
                  (3)# d查看磁盘相关信息
                  (4)# n查看网络相关信息
                  (5)# t 查看相关进程信息
                  (6)# h查看帮助相关信息
                  (7)# q 退出nmon
                  我们简单看下C的监控界面,其它就不一一演示了,大家在压测过程中,直接进入观测即可,容易理解
                  (如下截图是本人测试虚拟机,所以CPU内核比较少)

                  3.3、nmon采集数据分析
                  说下采集数据分析方法,一般性能压测,是一个持续的过程,这个时候需要输出压测报告,那nmon同样也是可以实现的;
                  通过命令行启动监控,捕获服务器的各项数据,命令如下:
                    #./nmon_x86_64_centos7 -s 10 -c 30 -f -m /nmon_test
                    以上参数解释:
                    -s 每隔多少秒抽样一次,单位是秒,上述命令配置是10s
                    -c 采样次数,上述命令配置是30,即监控总时长为10*30=300秒
                    -f 监控结果以文件形式输出,这里没有填写,默认格式机器名+日期.nmon格式
                    –m 就是制定生成的的目录 /nmon_test
                      #ls -all

                      我们如上生成VM-0-15-centos_221212_1500.nmon就可以对他进行分析。虽然VM-0-15-centos_221212_1500.nmon可以用文本打开,但是不够直观,这个时候我们要借助Nmon的文件解析工具nmon analyser来分析;此工具下载地址省略,小伙伴网上搜一搜即可。

                      下载后使用方法是:解压直接双击VM-0-15-centos_221212_1500.nmon.xlsx
                      如果界面提示安全警告,“宏已被禁用”,点击启用内容即可,然后点击Analyze nmon data按钮,弹出需要分析的,如上图红框内容所示。此时,点击【Analyze nmon data】,在windows文件选择框中选择我们待分析的nmon文件。

                      处理完成后,会弹出要我们保存同名带后缀名为.xlsx的文件,我们保存到当前目录就可以打开观看了:
                      SYS_SUMM:

                      CPU_ALL:

                      DISK_SUMM:

                      MEM:



                      总结
                      关于《达梦8数据库SQL性能优化思路浅谈》系列的分享到这里就结束了,感谢广大读者的关注,同时也感谢作者给我们带来的精采分享。如果大家在工作中有好的想法或是更为便捷的解决思路,欢迎投稿!期待与大家一同学习与进步。
                      点击了解前期分享:
                      《达梦8数据库SQL性能优化思路浅谈(一)》
                      《达梦8数据库SQL性能优化思路浅谈(二)》



                      END

                      达梦知识普及

                      扫码关注我们
                      学习共享
                      知识普及

                      原文:引用自“达梦在线服务平台”,具体可点击下方“阅读原文”
                      编辑:crossrainbow
                      排版:哈哈


                      文章转载自达梦E学,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                      评论