数据库优化案例——————某知名零售企业ERP系统

写在前面

  记得在自己学习数据库知识的时候特别喜欢看案例,因为优化的手段容易掌握的,但是整体的优化思想很难学会的。这也是为什么自己特别喜欢看案例,今天也分享自己做的优化案例。

  之前分享过OA系统、HIS系统,今天我们来一个最常见的ERP,ERP系统各行各业都在用,不同行业也有不同的特点,博主在做研发的时候还自己写过ERP也算是比较熟悉了。

  不管是本文分享的零售类,还是鞋服门店、家居、汽车、地产等等,也不管是某友、某碟,ERP有一个共同的特点,单据流程长,业务复杂,热点表明显,数据量大,涉及众多系统接口,各种大数据的统计报表....传统行业又缺乏DBA精心管理。

  慢是普遍的!

  最近一直很忙,博客产出也少的可怜,今天整理了一下自己做过优化或各种方案的客户已经超过千家,涉及各行各业,今天分享的案例算是在这些客户中比较典型的了!没有什么高大上都是常见的问题!在之前的博客中都有过提及,那么本篇我们就结合之前的技术点来看看这个案例。学习优化手段的看官们可以参见我的优化系列:
 

SQL SERVER全面优化-------Expert for SQL Server 诊断系列

 

--------------博客地址---------------------------------------------------------------------------------------

Expert 诊断优化系列 http://www.cnblogs.com/double-K/

 

 

废话不多说,直接开整-----------------------------------------------------------------------------------------

 

用户现象

  系统慢!保存个单据要好几分钟,很多操作都超时,尤其到下午4点左右各种超时,收款什么的都收不了,

  查个报表一个小时,下班了还没查完,经常因为系统慢而加班,

  业务部门已经怨声载道,这个事情已经上报公司高层IT部分压力非常大!

系统环境

  首先我们来看一下这个系统配置及现状,为什么说这个客户经典?往下看就知道了...

  

  先来看看系统配置 :

  

  

 

   服务器的配置是:8路 24 core 做了超线程 384个逻辑CPU,内存1T,磁盘全闪

   

     SQL用了2012版本,补丁已经最新,而且服务器配置全部能够识别

    没错。相当牛逼得配置!

  

     

  

  数据库的大小在1.2个T

 

  咋一看也许数据量太大了,导致性能的问题!可又一想这么强力的服务器也不至于那么慢呀,难道是代码的问题?难道需要分库分表?

数据库指标

  那么我们再看一下数据库的一些表象:

  每秒请求数量:

  

  用户连接数:

  

 

 

  语句执行情况:

  

  

  

 

 

  等待情况:

  

 

  

 

  等待时间:

  

 

   CPU指标:

  

 

  内存一些指标:

  

 

  

 

 

  磁盘队列:

  

 

 

 -------------------还很多指标就不一一展示了------------------

 

   看到这些基本的指标,除了慢你能看出什么?问题出在哪里?怎么样快速解决?能有一个优化的步骤呈现在眼前么?

 

分析

  系统是真的很慢,慢语句数量很多系统阻塞也很严重,确实和客户反映的慢可以吻合。那为什么这么慢?什么原因导致的?

  我总结一般性能慢常和6大因素有关:

  1.   业务压力
  2.   硬件
  3.   环境
  4.   代码
  5.   数据库内部运行因素
  6.   架构

 

 奉上一幅草图

  

  系统压力:访问压力(也是我们常说的并发)其实并不大,用户连接数也没想像的那么多

  硬件:在内存和磁盘IO确实存在压力

  环境 :服务器和数据库版本什么的没什么问题,具体配置一会儿再看。

  代码 :最不想分析代码,我们留到最后

  数据库内部运行因素:从各种指标来分析,系统语句等待时间太长,导致语句完成慢,而等待主要有两部分:

  1.  硬件资源确实有压力
  2.  语句之前的阻塞太严重了,"LCK_M_",而且等待时间过长,竟然平均达到几百秒

  再分析...这么强的硬件,并不大的访问压力,竟然造成瓶颈?语句写的烂?程序实现的不好?缺索引?环境配置不对?

  下面我们来看看....

 

优化阶段一(常规优化)

  很多时候系统慢要究其原因,难道上线时候就这么慢?那不可能,厂商根本无法交付的!那么问题来了,什么时候开始慢的?对系统做过哪些调整?

  简单的调研开始...

  我靠!!!厂商完全不配合,工程师对系统及其不熟悉,一问三不知,最近做什么改动也说不清,用户也不知道。厂商给的结论:继续加硬件....更强的IO....数据分离减小数据量!

  协调厂商完全协调不动,基本没戏了!

  既然是数据库问题,那我们就数据库下手吧!从一名数据库从业人员来说,看到这样的系统一定要先解决大面积等待问题!个人经验来看很多系统大面积等待解决系统会有个很大的提升和改善!

  配合一些常规的调优手段阶段一开始了,主要给系统大面积创建影响高开销大的索引,调整系统参数,优化tempDB等....具体不细说了,前面系列文章中都有!

 

  预期:

  一般系统上面一轮优化会有明显的改善,我认为这一轮以后系统会明显变快,语句运行环境合适,索引什么的合理资源消耗自然就少,内存和IO压力也会有所减少。

  结果:

  系统内存,IO压力趋于平稳,慢语句数量有所减少,但依然很多,阻塞依然存在,超过2分钟的语句依然很多。

  

  优化前

  

 

  优化后

  

 

 

  优化前

  

  优化后

  

 

  

优化阶段二(针对语句)

   再次分析解决大面积语句阻塞的系统,发现现在的情况,主要有如下几个:

  1. 内存某些时候还是存在波动,但整体IO 内存已经不是瓶颈。
  2. 系统中有SLEEPING的程序阻塞时间长
  3. 部分功能语句依然慢,消耗的资源很高。

  再次对系统调研:

  1. 执行的慢语句是什么业务,是业务功能?还是报表?还是接口?
  2. 系统中频繁且较慢的语句。
  3. 系统中阻塞的操作是什么。  

  

  调研后,我遇到了最常见也是最大的问题: 语句慢由于程序!在HIS的优化案例中就是因为程序大量使用自定义函数,我们没法改,我们巧妙的绕过。那么这次我们如何绕过?

   

  一:报表

  分析中发现程序系统中消耗最多资源的主要是报表。

  报表通过一系列复杂的查询插入到物理临时表,啥叫物理临时表? 就是非#temp 而是真真正正的插入到表中,用完在delete!

  插入在删除,中间还有跟业务表关联操作,导致报表也会阻塞业务!

  插入删除的数据量是多少? 你们猜一下??

  千万级别....

  

  二:接口

  接口程序中频繁调用业务数据并发更新频繁....导致业务受阻...

 

  三:问题代码

  代码的问题主要有两个:

  1.代码较复杂,需要细致优化。

  2.程序中存在连接泄露,简单理解成程序报错后事务不能有效处理,导致事务未提交阻塞系统

  

 

  针对第一部分报表,语句更是复杂至极...这东西不是短期就可以优化的,考虑分出去

  针对第二部分接口,修改接口视图,包括写法优化、添加索引、调用频率等;

  针对第三部分业务语句进行细致优化,查询提示,计划向导、重编译等等手段...

  

  

优化阶段三(报表分离)

  经过前两个阶段的优化一般系都会明显好转,只剩报表没有处理,和一部分高消耗的频繁接口查询,这部分我们采用报表分离的方式去解决。

  这里面我们遇到一个问题,报表要写物理表!用2012 自带的AlwaysOn是没有办法实现的(辅助节点只能读)

  

  使用发布订阅,又不能同时满足数据安全和业务连续的要求,客户又不满意。

  

  我们想到是否可以把写入物理表变成写入#temp 临时表? 软件厂商给出的结论是:不可能....

  

     那这里面我们使用了第三方的产品Moebius集群(这里真的不是广告....)

 

  如何实现:  

  多活集群,几个节点数据实时一致,这样的基本知识就不普及了...集群介绍也免了

  首先程序只有一个连接字符串没法把报表指向到辅助服务器,我们只能通过Moebius集群的前端调度引擎,定制规则把报表所使用的存储过程定点指向到第二台服务器,解决了程序不能分离的问题。

  其次Moebius集群可以实现两个节点都可写,以满足辅助节点报表查询写入物理表的需要。

  再次临时表的写入量太大,千万级别数据同步也是问题,这里好就好在程序中写入的物理临时表都是以“Temp_” 开头并以GUID类型结尾。我们在这里设置了只要这样的表写入不会反向同步给主节点,这样根据规则控制双向同步满足了报表的要求,最终实现了报表的分离。

  报表快了? 当然没有,只是分离不可能快,但是好处有两个:

  1.   OLAP和OLTP分离事务阻塞得到解决
  2.   报表服务器和业务服务器可以根据自身的业务特别进行单独的个性化设置
  3.   根据报表的要求我们配置高速IO的硬件

 

  预期:

  语句已经优化,阻塞情况也被解决,CPU、内存、磁盘压力也没有了,系统肯定快起来了!

  结果:

  系统快起来了!

  

  最终业务系统节点全天24小时的慢语句数量:(虽然还有慢语句存在,毕竟是TB级别的数据量,不影响业务运行客户完全可以接受!)

  

 

--------------博客地址---------------------------------------------------------------------------------------

Expert 诊断优化系列 http://www.cnblogs.com/double-K/

 

 

-----------------------------------------------------------------------------------------------------

 

  总结 : 系统慢往往我们要全面分析,本文提供的维度:

  1.   业务压力
  2.   硬件
  3.   环境
  4.   代码
  5.   数据库内部运行因素
  6.   架构

 

    往往优化真的不是简单的调一调语句,加一加硬件,全面地分析是根本解决性能问题的首要任务。

  当然不是所有的优化都可以彻底解决,如本文中报表的改善是通过读写分离的方式实现,很多时候在ERP系统中报表的处理方式都是如此,报表如果细致优化,那需要多长时间呀!也许都是重写了。

 

  本文的优化过程主要是:全面分析系统问题——〉宏观层面解决(环境、数据库内部运行因素、硬件压力)——〉低效代码调整——〉架构方案实现(稳定、安全、高效)——〉最终系统顺畅 无压力

 

  当然此案例中客户的数据量已经到了可以做数据分离,分区分表的阶段,但分享本案例的原因也在于,不要认为上TB的数据一定就要分库分表的各种拆分,在性能调优的简单付出中依然可以收获更大的收益,真心希望看官们在选择分库分表付出的极大代价之前可以找专业的人全面分析一下,仔细评估你的系统到底是什么瓶颈!

转载于:https://www.cnblogs.com/liliuguang/p/9212626.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
永思ERP,vb.net开源版,免费信息化工具,学习编程的好例子,不可错过。 永思ERP是一套专业的企业管理软件,采用VS2008技术开发,数据库可在Access与MS SQL自由选择 。系统借鉴多种市场上知名软件,经过多年的研发升级,功能强大、性能稳定。其中涉及的管理模 块有:采购管理,销售管理,库存管理,应收管理,应付管理,出纳管理,生产管理,存货核算, 工资管理,帐务管理等。具备灵活的系统配置功能,面向不同行业管理。将最新的协同技术应用于 企业的业务管理当中,将员工、部门、货物、供应商、客户、现金银行等资源进行有效整合,促进 现有企业管理的现代化、科学化,适应竞争日益激烈的市场要求,使整个供应链趋于良性循环。 系统特色 1、数据库兼容Access和MS SQL,用户可以自由选择。 2、拥有完善的单据自定义项,客户自定义项,供应商自定义项,存货自定义项,存货自由项等。 3、单据可以自定义模板,适对不同需求。 4、单据,列表,明细表之间具备联查功能,方便用户检索数据。 5、对操作员实行功能权限,数据权限的两重控制。 6、用户可自行添加帐表,使数据统计得心应手。 7、所有帐表的查询窗口,可以自行设置查询条件。 8、所有帐表的表格列,可以自行设置是否显示,显示别名,显示宽度等。 9、单据,帐表拥有强大,灵活的打印格式设置功能。 ERP升级日志 2011-03-02 1,提高单据参照运行速度 2010-09-09 1,采购入库单保存后,回填单价到供应商价格表 2010-08-17 1、增加生产订单参照销售订单功能 2、增加采购订单参照物料清单功能 3、采购入库单审核时可选择是否生成采购发票 4、发货单审核时可选择是否生成销售发票 5、发货单添加上期结欠、本单金额、本次收款、累计结欠等项目 2010-06-12 1、基础档案->机构设置->职员档案 添加过滤功能 2、基础档案->往来单位->客户档案 添加过滤功能 3、基础档案->往来单位->供应商档案 添加过滤功能 4、基础档案->存货->存货档案 添加过滤功能 5、库存管理->设置->期初结存 添加导入数据功能 6、存货核算->设置->存货期初 添加导入数据功能 2010-04-07 1,采购订单,采购发票保存后,回填单价到供应商价格表 2,销售订单,发货单,销售发票保存后,回填单价到客户价格表 2010-01-30 1,采购订单表体添加已到货数量、已到货件数、未到货数量、未到货件数 2,销售订单表体添加已发货数量、已发货件数、未发货数量、未发货件数 3,发货单表体添加已开票数量、已开票件数、未开票数量、未开票件数 4,采购入库单表体添加已开票数量、已开票件数、未开票数量、未开票件数 5,生产订单表体添加已完工数量、已完工件数、未完工数量、未完工件数 6,物料清单表体添加已领用数量、已领用件数、未领用数量、未领用件数 7,提高操作单据的运行速度 2009-12-17 1,产品结构添加多选录入功能 2,产品结构定额数据默认为1 3,产品结构选中表体某行半成品,点击查看结构按钮,自动弹出该半成品的结构 2009-08-16 添加 库存管理->帐表->可用量 2009-06-06 1,添加 库存管理->帐表->库存台帐 2,将 库存管理->帐表->超储存货 与 库存管理->帐表->短缺存货 的功能合并为 库存管理->帐表->库存预警 3,将 存货核算->帐表->存货汇总表 改名为 存货核算->帐表->存货汇总 4,去除 存货核算->帐表->存货明细表 5,添加 存货核算->帐表->存货台帐 2009-05-29 1,添加新模块 生产管理 2,将库存管理的生产订单移到生产管理模块 2009-05-16 添加部门,客户分类,供应商分类,存货分类等数据权限 2009-05-14 1,单据录入界面可以修改换算率 2,存货档案,客户档案,供应商档案默认按档案编码排序 3,职员档案,客户档案,供应商档案,存货档案添加导出模版,导入数据功能 2009-05-11 1,将原来的菜单 基础档案->财务->现金银行 改名为 基础档案->财务->科目档案 2,添加 基础档案->财务->科目设置 3,添加 基础档案->财务->凭证类别 4,添加 基础档案->业务->常用摘要 5,添加新模块 帐务管理
非常好非常专业的ERP源码,VB.NET编写,如果你是程序员,可以在此基础上进行二次开发 工具特点: 1、可根据SQL语句自动生成报表格式,打印格式,用户只要稍微调整就可形成一张普通报表。 2、可设置报表分组、小计、合计等。 3、可设置报表的过滤窗口条件以及条件的参照内容。 4、可设置报表导出到Excel的格式。 5、可设置报表的打印参数,查询sql参数。在调用报表时对参数进行赋值。 6、报表拥有事件机制,如调用程序可以捕捉报表行双击事件。 7、报表数据,打印数据可以设置多种格式化串,如:格式化金额(¥1,234.56),大写金额(零元零角零分正),格式化日期(2005年5月5日) 8、打印格式,支持普通文本、图片框、划线、字段、参数、系统变量、函数、图表等丰富元素。 二、ERP升级日志 2012-05-05 1,在ERP2.0基础上改写成三层结构 2,废弃多计量单位组,直接在存货档案上分开单位,辅单位,换算率 2011-11-14 1,单据录入批号时,参照当前行存货结存的批号 2011-05-03 1,添加 应收管理->设置->选项(设置应收款来源:销售发票或发货单) 2,添加 应付管理->设置->选项(设置应付款来源:采购发票或采购入库单) 2011-03-02 1,提高单据参照运行速度 2010-09-09 1,采购入库单保存后,回填单价到供应商价格表 2010-08-17 1、增加生产订单参照销售订单功能 2、增加采购订单参照物料清单功能 3、采购入库单审核时可选择是否生成采购发票 4、发货单审核时可选择是否生成销售发票 5、发货单添加上期结欠、本单金额、本次收款、累计结欠等项目 2010-06-12 1、基础档案->机构设置->职员档案 添加过滤功能 2、基础档案->往来单位->客户档案 添加过滤功能 3、基础档案->往来单位->供应商档案 添加过滤功能 4、基础档案->存货->存货档案 添加过滤功能 5、库存管理->设置->期初结存 添加导入数据功能 6、存货核算->设置->存货期初 添加导入数据功能 2010-04-07 1,采购订单,采购发票保存后,回填单价到供应商价格表 2,销售订单,发货单,销售发票保存后,回填单价到客户价格表 2010-01-30 1,采购订单表体添加已到货数量、已到货件数、未到货数量、未到货件数 2,销售订单表体添加已发货数量、已发货件数、未发货数量、未发货件数 3,发货单表体添加已开票数量、已开票件数、未开票数量、未开票件数 4,采购入库单表体添加已开票数量、已开票件数、未开票数量、未开票件数 5,生产订单表体添加已完工数量、已完工件数、未完工数量、未完工件数 6,物料清单表体添加已领用数量、已领用件数、未领用数量、未领用件数 7,提高操作单据的运行速度 2009-12-17 1,产品结构添加多选录入功能 2,产品结构定额数据默认为1 3,产品结构选中表体某行半成品,点击查看结构按钮,自动弹出该半成品的结构 2009-08-16 添加 库存管理->帐表->可用量 2009-06-06 1,添加 库存管理->帐表->库存台帐 2,将 库存管理->帐表->超储存货 与 库存管理->帐表->短缺存货 的功能合并为 库存管理->帐表->库存预警 3,将 存货核算->帐表->存货汇总表 改名为 存货核算->帐表->存货汇总 4,去除 存货核算->帐表->存货明细表 5,添加 存货核算->帐表->存货台帐 2009-05-29 1,添加新模块 生产管理 2,将库存管理的生产订单移到生产管理模块 2009-05-16 添加部门,客户分类,供应商分类,存货分类等数据权限 2009-05-14 1,单据录入界面可以修改换算率 2,存货档案,客户档案,供应商档案默认按档案编码排序 3,职员档案,客户档案,供应商档案,存货档案添加导出模版,导入数据功能 2009-05-11 1,将原来的菜单 基础档案->财务->现金银行 改名为 基础档案->财务->科目档案 2,添加 基础档案->财务->科目设置 3,添加 基础档案->财务->凭证类别 4,添加 基础档案->业务->常用摘要 5,添加新模块 帐务管理

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值