【前言】

最近做的一个项目中客户提出了新的需求;在完成这次任务时候真是一波三折,当然在这个过程中收获许多,在此与大家共享!

【一波三折】

基础:1.企业中的装置会产生物料,物料价格是衡量物料的价值标准间接成为衡量装置的标准。

2.企业会每个月上传自己本月各个物料的价格,存在表开工装置表中;

3.由于各方面原因企业也会停工一部分装置,停工装置只会在某个月偶尔会发生,将停工时月份的该停工装置产生的物料价格村在停工装置表中;

需求:总部想了解下如果某企业的停工装置假如其是开工状态的话会产生多少效益。(比如:一个装置A它生产1号物品,它于2015年8月份申请停工,2015年8月份1号物品的价格是10000元【这时在停工装置表中该装置的1号物品价格为10000元,在开工装置表中2015年8月份的该装置的1号物品价格也为10000元】;一个企业不仅一个此装置还有许多开工的装置也在生产1号物品,到2016年6月份的时候其他装置生产的1号物品价格是15000元,此时在开工表中1号物品价格变为15000元,而停工装置表中的1号物品价格仍是10000元;现在需求是总部想看到假如装置A没有停工的话它在2016年6月份创造的价值应该是15000元)

思路:开工装置表写入新数据时将在开工表中的物品价格更新到停工表中,一图以蔽之!

    实现方式:

1.一开始自己想到了数据量比较大,考虑到性能用一个存储过程搞定最好!当时由于时间等原因,最后决定用最简单的方式先实现功能再说!

(1)D层代码实现(由于其他层实现都较为简单在此不再赘述):

        //组合下面的操作完成停工装置物料价格更新public bool changeMaterPrice(string companyCode, string companyName){if (string.IsNullOrEmpty(companyCode) || string.IsNullOrEmpty(companyName)) {return false;}else{#region 注释一条条更新性能太慢-zhanghan-2016年7月18日List<MACPStopInOutModel> GetAllStopInoutByComList = GetAllStopInoutByCom(companyCode, companyName).ToList(); //获取停工装置表中所有的数据if (GetAllStopInoutByComList.Count < 1)  //若停工装置表中为空则结束{return false;}else{for (int i = 0; i < GetAllStopInoutByComList.Count; i++)  //循环将停工装置表中的价格进行更新{List<MACPInOutModel> GetAllInoutByComUniMatlist = GetAllInoutByComUniMat(companyCode, companyName, GetAllStopInoutByComList[i].UnitCode, GetAllStopInoutByComList[i].MaterialCode).ToList(); //根据停工装置表中的条件查找开工装置表中对应的数据if (GetAllInoutByComUniMatlist.Count > 0)   //开工装置表中有对应的物料价格对停工装置表价格进行更新{UpDateStopInout(companyCode, companyName, GetAllStopInoutByComList[i].UnitCode, GetAllStopInoutByComList[i].MaterialCode, GetAllInoutByComUniMatlist[0].MaterialPrice);}else  //开工装置表中没有对应的物料价格对停工装置表价格设置为0{UpDateStopInout(companyCode, companyName, GetAllStopInoutByComList[i].UnitCode, GetAllStopInoutByComList[i].MaterialCode, 0);}}return true;}#endregion<span style="font-family:KaiTi_GB2312;">        </span><pre name="code" class="csharp">          }//根据企业ID和企业名称查询停工装置中的所有装置编码、物料编码public IList<MACPStopInOutModel> GetAllStopInoutByCom(string companyCode, string companyName){if (string.IsNullOrEmpty(companyCode) || string.IsNullOrEmpty(companyName)){return null;}string sql = @"SELECT   [ID],[ModelCode],[ModelName],[CompanyCode],[CompanyName],[UnitCode],[UnitName],[UnitInOut],[MaterialCode],[MaterialName],[MaterialPrice],[CycleCode],[CycleName],[PriceResource],[InOut],[reportMonth],[flag],[Source]
FROM    dbo.T_MACP_Stop_InOut
WHERE   CompanyCode = '" + companyCode + "' AND CompanyName = '" + companyName + "'";ISQLQuery sqlLst = Session.CreateSQLQuery(sql);sqlLst.SetResultTransformer(Transformers.AliasToBean<MACPStopInOutModel>());return sqlLst.List<MACPStopInOutModel>();}//根据企业ID、企业名称、装置编码、物料编码、查询T_MACP_InOut中的离的最近的物料价格public IList<MACPInOutModel> GetAllInoutByComUniMat(string companyCode, string companyName, string unitCode, string materialCode){if (string.IsNullOrEmpty(companyCode) || string.IsNullOrEmpty(companyName) || string.IsNullOrEmpty(unitCode) || string.IsNullOrEmpty(materialCode)){return null;}string sql = @"SELECT  *
FROM    [SCPPODB].[dbo].[T_MACP_InOut]
WHERE   ID IN ( SELECT  b.IDFROM    ( SELECT DISTINCTMAX(ID) ID ,[CompanyCode] ,[CompanyName] ,[UnitCode] ,[UnitName] ,[MaterialCode] ,[MaterialName] ,MAX(reportMonth) AS reportMonthFROM      [SCPPODB].[dbo].[T_MACP_InOut]GROUP BY  [CompanyCode] ,[CompanyName] ,[UnitCode] ,[UnitName] ,[MaterialCode] ,[MaterialName]) b )AND companycode =  '" + companyCode + "' AND CompanyName = '" + companyName + "' AND UnitCode = '" + unitCode + "' AND MaterialCode = '" + materialCode + "'";;ISQLQuery sqlLst = Session.CreateSQLQuery(sql);sqlLst.SetResultTransformer(Transformers.AliasToBean<MACPInOutModel>());return sqlLst.List<MACPInOutModel>();}//根据企业ID、企业名称、装置编码、物料编码将从T_MACP_InOut查询出的物料价格更新到T_MACP_Stop_InOut中     public void UpDateStopInout(string companyCode, string companyName, string unitCode, string materialCode, decimal materialPrice){string sql = @"UPDATE    T_MACP_Stop_InOut
SET MaterialPrice = '" + materialPrice + "' WHERE companycode = '" + companyCode + "'AND CompanyName = '" + companyName + "' AND UnitCode = '" + unitCode + "' AND MaterialCode = '" + materialCode + "'";Session.CreateSQLQuery(sql).ExecuteUpdate();}
 

(2)在本地运行没有问题,心中还是蛮高兴滴!只是时间比较长,查了一下更新406条数据时间大概是5分钟左右。

(3)发布到服务器上,进行测试:出现奇怪的现象(用我的笔记本的IE浏览器不报错更新成功406条数据大概5分钟左右,其他同事的笔记本都是卡死然后界面报一错误)

(4)在网上查的结果是服务太忙,查网络监控服务器等等,最后归结出写的这段代码的性能太差。

2.出现这么奇葩问题于是乎只能硬着头皮上;进行性能优化:

分析:

(1)上面的实现方式如果对406条数据进行价格更新需要进行流程:

①根据企业编码和名称去停工表中查询出所有装置信息

②循环406次:根据每条停工信息去开工表中查出价格——>将开工价格更新到停工表中

③数据库操作流程:打开数据库—>执行SQL语句—>关闭数据库

④执行次数:1+406+406=813次

(2)性能优化想法:将813次减少为1次。

实现思想:类似于存储过程,只需把企业的ID和名称传入,接下来都教给SQL来完成即可。

D层实现代码:

 //组合下面的操作完成停工装置物料价格更新public bool changeMaterPrice(string companyCode, string companyName){if (string.IsNullOrEmpty(companyCode) || string.IsNullOrEmpty(companyName)){return false;}else{#region 该sql语句更新的条件是根据公司ID,公司名称,装置编码和物料编码-zhagnhan-2016年7月21日17:59:20string sql = @"UPDATE  [SCPPODB].[dbo].[T_MACP_Stop_InOut]SET     [SCPPODB].[dbo].[T_MACP_Stop_InOut].MaterialPrice = c.MaterialPriceFROM    ( SELECT    *FROM      [SCPPODB].[dbo].[T_MACP_InOut] aWHERE     ID IN (SELECT  b.IDFROM    ( SELECT DISTINCTMAX(ID) ID ,[CompanyCode] ,[CompanyName] ,[UnitCode] ,[UnitName] ,[MaterialCode] ,[MaterialName] ,MAX(reportMonth) AS reportMonthFROM      [SCPPODB].[dbo].[T_MACP_InOut]GROUP BY  [CompanyCode] ,[CompanyName] ,[UnitCode] ,[UnitName] ,[MaterialCode] ,[MaterialName]) b )) cJOIN [SCPPODB].[dbo].[T_MACP_Stop_InOut] ON ( c.CompanyCode = [SCPPODB].[dbo].[T_MACP_Stop_InOut].CompanyCodeAND c.CompanyName = [SCPPODB].[dbo].[T_MACP_Stop_InOut].CompanyNameAND c.UnitCode = [SCPPODB].[dbo].[T_MACP_Stop_InOut].UnitCodeAND c.MaterialCode = [SCPPODB].[dbo].[T_MACP_Stop_InOut].MaterialCodeAND [SCPPODB].[dbo].[T_MACP_Stop_InOut].CompanyCode = '" + companyCode + "' AND [SCPPODB].[dbo].[T_MACP_Stop_InOut].CompanyName = '" + companyName + "')";Session.CreateSQLQuery(sql).ExecuteUpdate();return true;}#endregion}

(3)测试:同样的406条数据,用所有同事机器测试基本上秒更新。                    

【总结】

1.SQL真的很强大,值得我们去深入的研究和探索。
      2.遇到问题后快速排查出问题的所在整个逻辑非常重要。
      3.遇到问题从多方面入手分析,不要产生抵抗心理(比如:我的代码不可能有问题,你看我在本地和服务器上用我的电脑测都没问题哈)。

SCPPO(九):性能优化之停工装置按照开工装置更新价格相关推荐

  1. PLSQL_性能优化系列17_Oracle Merge Into和Update更新效率

    2015-05-21 Created By BaoXinjian 一.摘要 以前只考虑 merge into 只是在特定场合下方便才使用的,今天才发现,merge into 竟然会比 update 在 ...

  2. MySQL高性能及性能优化技巧---更适合开发人员

    更新次数 更新时间 首发 2021.10.25 第一次更新 2021.10.26 1.删除了书中大量不必要的存储引擎类型 2.摘要完毕Mysql架构与历史部分 第二次更新 2021.10.29 1.摘 ...

  3. Android 性能优化lt;九 RecyclerView替代Listview用法

    Android 性能优化 (一)APK高效瘦身 http://blog.csdn.net/whb20081815/article/details/70140063 Android 性能优化 (二)数据 ...

  4. 揭秘 Vue.js 九个性能优化技巧

    gitHub 源码:https://github.com/Akryum/vue-9-perf-secrets 这篇文章主要参考了 Vue.js 核心成员 Guillaume Chau 在 19 年美国 ...

  5. MySQL数据库(九) 集群 Cluster 和性能优化

    文章目录 6 MySQL 集群 Cluster 6.1 MySQL主从复制 6.1.1 主从复制架构和原理 6.1.2 实现主从复制配置 6.1.3 主从复制相关 6.1.4 实现级联复制 6.1.5 ...

  6. 时间段优化oracle,九大Oracle性能优化基本方法详解

    51CTO数据库频道向您推荐<Oracle数据库调试与性能优化>专题,以便于您更好的理解本文. Oracle性能优化基本方法包括一下几个步骤,包括: 1)设立合理的Oracle性能优化目标 ...

  7. 秋色园QBlog技术原理解析:性能优化篇:用户和文章计数器方案(十七)

    2019独角兽企业重金招聘Python工程师标准>>> 上节概要: 上节 秋色园QBlog技术原理解析:性能优化篇:access的并发极限及分库分散并发方案(十六)  中, 介绍了 ...

  8. 深度讲解:web前端性能优化

    一.课程简介: 1.课程大纲 涉及到的分类 网络层面 构建层面 浏览器渲染层面 服务端层面 涉及到的功能点 资源的合并与压缩 图片编解码原理和类型选择 浏览器渲染机制 懒加载预加载 浏览器存储 缓存机 ...

  9. 一、数据库设计与性能优化--概述

    前言 我1998年第一次接触SQL Server 6.5 for Windows NT 4.0,当时的感觉就认为SQL Server只是一个功能强大的Excel文件.现在回想起来,当年抱着这样一种态度 ...

最新文章

  1. Word 最后一页无法删除-解决办法
  2. Modern C++ Design 学习笔记-第3章
  3. 并发测试工具_软件测试工程师都在用哪些测试工具?
  4. Linux中的大于号 双大于号 大于号:覆盖 追加 正确与错误都输出至指定文件
  5. CSTrackV2解读
  6. 评测征集 | 2021全国知识图谱与语义计算大会
  7. centos7安装cassandra
  8. mysql回表查询uuid_MySQL数据库回表与索引
  9. java闪光灯_Android实现闪光灯效果
  10. ftp下载,6步掌握ftp下载软件的使用方法
  11. Dell 笔记本鼠标莫名乱跑
  12. 保龄球 java机试题
  13. 饥荒独立服务器在线模式收不到,Windows 服务器搭建Don’t Starve Together饥荒独立服务器教程...
  14. 看完张一鸣、王兴、雷军的600条语录,整理出给年轻人的50条建议!
  15. Oracle VM VirtualBox虚拟MS-DOS时失败,提示内存不能为“written”
  16. UML uml建模工具
  17. 小白学数据分析--数据看板
  18. 为机器学习模型设置最佳阈值:0.5是二元分类的最佳阈值吗
  19. Android集成阿里百川问题或注意事项
  20. 亚马逊短视频制作需要注意什么

热门文章

  1. 一文看懂 BDTC 2018:探秘大数据新应用(附 PPT 下载)
  2. AI 开发者如何摆脱只有“人工”没有“智能?
  3. 陆奇知天命,拒绝巨头选 YC
  4. Java 9 正式发布,终落地 Jigsaw 项目
  5. 进入多个页签_俄罗斯学生落地签如何办理?
  6. 金三银四我带你去BAT面试现场,砥砺前行!
  7. java随机生成数字代码,详解系列文章
  8. comsol如何定义狄利克雷边界_COMSOL与Visual C++三维电阻抗有限元联合建模与仿真研究...
  9. python 微信数据_python 处理微信对账单数据的实例代码
  10. 一次选中多个物体_经验之谈|Anchor Boxes:物体检测的关键