九十天超循环记忆大表,金蝶云星空性能提升200倍的实战案例

极简大道 极简大道 2023-04-08 古诗词记忆 阅读: 145
摘要: 金蝶云星空性能提升200倍的实战案例案例背景:案例公司金蝶云星空出入库单据和相关报表查询一年的数据,20分钟都出不来,优化后全部不到1分钟出来,最大的一只程序,原来执行需要3个小时,优化后不到1分钟,性能提升200倍。

金蝶云星空性能提升200倍的实战案例

案例背景:案例公司金蝶云星空出入库单据和相关报表查询一年的数据,20分钟都出不来,优化后全部不到1分钟出来,最大的一只程序,原来执行需要3个小时,优化后不到1分钟,性能提升200倍。

摘要:本文不涉及简单的硬件,网络,操作系统,数据库参数和索引优化等稍微靠谱一点的代理商都会的技术,但完整的分析步骤会提供优化文档和性能检查SQL程序 供下载(售价100元),针对所有曾经的新老同事和新老客户 都可免费找作者获取。

分析思路

1 按优化文档分析现状和可优化环节(本文略)

2 找到耗时最多的程序

3 针对这个程序做分析,作用和功能是什么,以及为什么慢

4 针对性优化



执行分析思路

1 按优化文档分析现状和可优化环节

结果:发现90%的部分,已经有人做了优化,但是并没有作用

2 找到耗时最多的程序

结果:发现有一只程序执行了174分钟,大约耗时三小时,并且每4个小时执行一次,导致所有程序受此拖累,出入库单据查询一年的数据,20分钟都出不来


3 针对这个程序做分析,作用和功能是什么,以及为什么慢

下面是优化之前的程序,供参考

                     CREATE PROCEDURE [dbo].[pro_pur_req_innerText]AS 
    BEGIN
        PRINT '-----开始--------'        DECLARE @FBillNo VARCHAR(200)        DECLARE @Fid VARCHAR(200)        DECLARE pur_req_order CURSOR        FOR
            ( SELECT DISTINCT
                        a.FID ,
                        FBillNo              FROM      T_PUR_REQUISITION AS a                        INNER JOIN T_PUR_REQENTRY AS b ON a.FID = b.FID                        INNER JOIN t_bd_material AS c ON b.FMATERIALID = c.FMATERIALID              WHERE     CONVERT(VARCHAR(100), a.FCreateDate, 23) > CONVERT(VARCHAR(100), DATEADD(DAY,                                                              -10, GETDATE()), 23)                        AND ISNULL(b.F_BKK_TEXT, '') = ''                        AND c.FNUMBER LIKE '3%'
            )        OPEN pur_req_order        FETCH NEXT FROM pur_req_order INTO @Fid, @FBillNo        WHILE @@FETCH_STATUS = 0 
            BEGIN
                PRINT @FBillNo                UPDATE  A                SET     A.F_BKK_TEXT = d.Fjx                FROM    T_PUR_ReqEntry AS A WITH ( NOLOCK )                        INNER JOIN ( SELECT DISTINCT
                                            b.FID ,
                                            b.FBILLNO ,
                                            d.FBILLNO AS reqbill ,
                                            b.FEntryID ,
                                            a.FMaterialId ,                                            CONCAT(RIGHT(a.Fmodel,                                                         PATINDEX('%/%',                                                              REVERSE(a.Fmodel)))
                                                   + ';' + RIGHT(c.Fmodel,                                                              PATINDEX('%/%',                                                              REVERSE(c.Fmodel))),                                                   ';', a.BCJX) Fjx                                     FROM   ( SELECT    B.FMaterialId ,
                                                        A.FBILLNO ,
                                                        B.FENTRYID ,
                                                        C.FSPECIFICATION fmodel ,
                                                        C.FDESCRIPTION ,
                                                        D.F_BKK_TEXT BCJX --销售订单的料号规格                                              FROM      T_PLN_FORECAST                                                        AS a                                                        INNER JOIN T_PLN_FORECASTENTRY                                                        AS b ON a.FID = b.FID                                                        INNER JOIN T_BD_MATERIAL_L                                                        AS C ON B.FMaterialId = C.FMaterialId                                                        INNER JOIN T_BD_MATERIAL                                                        AS D ON B.FMATERIALID = D.FMATERIALID
                                            ) AS A                                            INNER JOIN ( SELECT
                                                              FDEMANDBILLNO ,
                                                              A.FID ,
                                                              a.fbillno ,
                                                              B.FENTRYID ,
                                                              C.FDEMANDBILLENTRYID --关联来源单号                                                         FROM T_PUR_Requisition                                                              AS A                                                              INNER JOIN T_PUR_ReqEntry                                                              AS B ON A.FID = B.FID                                                              INNER JOIN T_PUR_ReqEntry_R                                                              AS C ON B.FID = C.FID                                                              AND B.FENTRYID = C.FENTRYID
                                                       ) AS B ON a.FBILLNO = b.FDEMANDBILLNO                                                              AND a.FENTRYID = b.FDEMANDBILLENTRYID                                            INNER JOIN T_PUR_Requisition                                            AS d WITH ( NOLOCK ) ON b.FID = d.FID                                                              AND --关联采购申请单                                         CONVERT(VARCHAR(100), d.FCreateDate, 23) > CONVERT(VARCHAR(100), DATEADD(DAY,                                                              -10, GETDATE()), 23)                                            INNER JOIN ( SELECT DISTINCT
                                                              a.FParentMaterialId ,
                                                              a.FParentNumber ,
                                                              b.FNUMBER FCHILDNUMBER ,
                                                              b.FSPECIFICATION fmodel --电子表总成                                                         FROM VICBOM                                                              AS a                                                              INNER JOIN VICBOM                                                              AS b ON a.FNUMBER = b.FParentNumber                                                         WHERE
                                                              b.Fname LIKE '%电控总成%'
                                                       ) AS c ON a.FMaterialId = c.FParentMaterialId
                                   ) AS d ON a.FID = d.FID                                             AND a.FEntryID = d.FEntryID                WHERE   d.reqbill = @FBillNo                FETCH NEXT FROM pur_req_order INTO @Fid, @FBillNo            END        CLOSE pur_req_order        DEALLOCATE pur_req_order    ENDGO


结论:

2.1 该程序的功能是更新销售订单来源的采购申请单自定义的机型字段

2.2 机型 =销售订单上产品的 规格型号+ BOM展开两层取 电子表总成和 电控总成 的 规格型号

2.3 只更新最近10天的采购申请单,并且按采购申请单号逐个更新

2.4 背景:该程序为前前前任IT总监所写,写完之后还没有优化就离职了,后面的人一直没有解决此问题,也给当地最大的代理商反馈过,金蝶总部也查了,查出了原因,但没有给出优化办法,后面经过多次交接和岁月的流转,连原因也没人知道了

2.5 通过执行计划和代码整体分析,速度慢主要是

2.5.1 通过游标逐个采购申请单号进行循环

2.5.2 每次都要对所有的BOM进行展开,然后再筛选需要的数据

2.5.3 对很多大表都是先join 后筛选,导致各表串联之后 笛卡尔积 变得非常巨大,影响性能

最终优化方法:

1 原有程序整体架构不行,小修小改无法达到大幅改善性能的效果

2 重写原有程序,将游标循环去除,展BOM程序 独立出去,并且先筛选后展开,大幅降低各表串联笛卡尔积的结果

3 实践测试,新程序可以在不到一分钟内执行完成,性能提升200倍。

金蝶云星空ERP性能优化方法实操指南 和 sql server 数据库查看阻塞,耗费IO,CPU资源的语句分析 源代码

https://mbd.pub/o/bread/ZJaXlptu

温馨提示:曾经的同事和新老客户不要拍,可免费找作者获取


总结:文章中提到的查找性能瓶颈的SQL代码,适用于所有基于sql server的应用程序,包含但不限于金蝶,用友ERP等。

其他相关

背书如何更快背出来,如何快速背完书秘诀,背诵有诀窍,这四个高效方法,让孩子轻松背书

作者: 极简大道 时间:2024-02-09 阅读: 127
英语差的学生,这样学习,高考跃进140一位从事10年语文教书的特级老师谈到:背诵其实不难,很多同学总是会陷入误区,掌握正确的方法,是解决背诵困难的正确途径。...
法考背诵版pdf,二十二遍背诵法,法考民诉法真题必背要点|厚大刘鹏飞老师

法考背诵版pdf,二十二遍背诵法,法考民诉法真题必背要点|厚大刘鹏飞老师

作者: 极简大道 时间:2024-02-04 阅读: 121
考试将近,厚大法考民诉法刘鹏飞老师特意为考生们整理了民诉法的真题必背要点,考前很有必要背一背哦#跟小飞侠背真题要点#12011-35《民事诉讼法》地位上属于基本法、内容上属于程序法、调整对象上属于部门法、公私划分上属于公法。2009-37诉讼标的是当事人争议的实体法律关系。...

背诵方法和技巧,孩子记忆力差,背书困难怎么办,你不知道的背诵古代文化常识妙招,不看就晚了!

作者: 极简大道 时间:2024-01-24 阅读: 116
关注“语文大师官方”微信公众号,学习更多知识...

如何背书快又记得牢,背诵方法和技巧,背书技巧:如何轻松背诵一篇文章 下面我来讲述一下我的背书心得

作者: 极简大道 时间:2024-01-24 阅读: 113
背诵一篇文章可以帮助我们提高语言表达能力、记忆能力和理解能力。但是,对于许多人来说,背诵一篇文章可能是一项艰巨的任务。在本文中,我将介绍一些快速背诵一篇文章的方法,并提供实际案例来说明这些方法的有效性。1. 分段背诵法分段背诵法是一种将文章分成若干段落,逐段背诵的方法。这种方法可以帮助我们更好地理解和记忆文章的内容,同时也可以减轻背诵的负担。具体步骤如下:...
背书用什么方法背得快,快速背书小窍门,期末复习,快速背书方法

背书用什么方法背得快,快速背书小窍门,期末复习,快速背书方法

作者: 极简大道 时间:2023-12-29 阅读: 124
快速背书,可以尝试以下几个方法:填写记忆法:将需要背诵的内容整理出来,做出许多空,自己填空,每天填一填,过几天交换空的位置,自己有了一个印象,再一个自然段地背。理解记忆法:先理解要背诵的内容,抓关键词背诵,记住注释和翻译,加强理解,按照理解内容背书,主要内容记住了,课文也背熟了。...

怎么背书最快最有效的方法,如何背诵效率高又快,神奇的背书七步法 最近参加一个考试,需要背2本专业...

作者: 极简大道 时间:2023-11-25 阅读: 187
神奇的背书七步法最近参加一个考试,需要背2本专业书。大学毕业有几年了,好几年没有学知识了。不知道如何入手,就上网找找方法。这打开了我新世界的大门。原来背书也有么多实用的方法。读了这么年的书,自己却从来不知道。有这么好的学习方法。以前一直认为自己不聪明怎么学也学不会。现在才发现原来自己重来都不会学习。大多数人背诵的东西总是忘记归结于自己记忆力不好。自己不是学习了料。这是大错特错。德国著名的心理学家赫尔曼·艾宾浩斯,绘制出人类遗忘曲线。根据记忆曲线人们在记忆消退前及时复习所学知识,就可以把短期记忆变成长期记忆。...

年度爆文