博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
我的一些数据库优化经验
阅读量:5766 次
发布时间:2019-06-18

本文共 2655 字,大约阅读时间需要 8 分钟。

一直在维护公司的系统,最近有客户投诉系统过慢,恩恩硬着头皮上去看吧

首先的话,我会先习惯性的看看数据库中的活动监视器,也就是下图最后的那个

打开后(如下图)

我会很习惯性的盯着下面的那一栏[最近耗费大量资源查询],我比较注重的是后面的逻辑读取次数和平均持续的时间

PS:可以选择一项的一个倒三角选择需要监视的的数据库名称,排除其他数据库的操作带来的干扰

 

在[逻辑读取次数]和[平均持续的时间]这两项中是最容易发现那个查询语句拖慢速度的,就好像我最近优化的一个数据库一样,逻辑读取次数50次不到,但是平均持续的时间居然到了5000+,也就是这一句话,直接把系统停在了登录页面(或许你会问才5000+毫秒,怎么也不会卡在那里吧!的确,只是这样就不会,要是在程序上面加了个JQ的定时执行函数的话,就不一样了)

 

事实上找到那个语句之后,差点晕倒!这句话居然是给提示的小窗体的数据源!连个滚动条都没有,居然要装下了3W+条数据!语句直接改成Top10,然后把括号里面的数字改成…..(恩恩,没错,这个是障眼法!),这样改完后,速度的确快了好多,虽然不能在具体数值上体现,但是至少公司的客户没有为登录不进去而投诉了(下图是改了之后的样子)

 原来是在括号中显示具体数字,现在改成...;原来是下面是装了3W+的数据,现在是10条,那速度提高的真是没话说的

解决了这个问题后,紧接着是下面的工作记录打开很慢的问题,也就是点击处理(如下图)的时候,要等上一两分钟的才能打开窗口;

不断的排查后,问题锁定在一行代码上面也就是

1 blProc.GetProcInfoByProcID(procID, out url, out width, out height, out KeyFieldName, out keyID);

后面是linQ写的,方法代码如下:

1 var info = (from proc in dc.TbWmProcs 2                         join flow in dc.TbWmFlows 3                         on proc.FlowID equals flow.FlowID 4                         join action in dc.TbPcActions 5                         on flow.ActionCode equals action.ActionCode 6                         join form in dc.TbWmForms 7                         on flow.FormID equals form.FormID 8                         where proc.ProcID == procID 9                         select new10                         {11                             form.Url,12                             form.Width,13                             form.Height,14                             action.KeyFieldName,15                             flow.AppID16                         }).First();

在上面的那句问题代码的前后加上两句代码,变成了下面的样子

1         Stopwatch sw = new Stopwatch();2         sw.Start();3         blProc.GetProcInfoByProcID(procID, out url, out width, out height, out KeyFieldName, out keyID);4         sw.Stop();      ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "123", "alter('运行时间是" + sw.Elapsed + "')", false);

对了,那几张表的数据状况如下

运行->点击处理;

额~额~~报错了!

这个可能是模板页以及Updatepanel综合影响到了这个脚本的运行,

但是不管怎么样,我还是得到了这个语句执行完的时间00:00:00.1257938也就是125.7938毫秒(如下图)

会不会是linQ执行的效率慢?

换SQL语句看看!

换成了下面的代码

string sql = @"SELECT Top 1 form.Url, form.Width, form.Height,        action.KeyFieldName,        flow.AppID FROM TbWmProc [proc] inner JOIN TbWmFlow flowon [proc].FlowID=flow.FlowIDINNER join TbPcAction [action]on [action].ActionCode=flow.ActionCodeINNER join TbWmForm formon form.ActionCode=[action].ActionCode where [proc].ProcID =" + procID;

得到了这个语句执行完的时间是00:00:00.0004631也就是0. 4631毫秒(如下图)

整整提高了271+倍!!

我猜测应该是是linQ的语句应该是翻译成SQL语句的时候花费的时间太多了,这个只是个人见解,具体的还要深入研究一下

改了这个linQ语句后,查了一下数据库中的表,上面都基本有索引,都重新组织了一下索引;

 这次的优化后,我觉得吧,在开发效率和代码执行的效率上.还是得斟酌一下..

 

转载于:https://www.cnblogs.com/SharkLock-Chen/archive/2012/12/07/2808044.html

你可能感兴趣的文章
IntelliJ IDEA 2019.1 新特性
查看>>
详解线程池:架构实现、大小配置、及四种线程池使用
查看>>
[译] Go 语言命令概览
查看>>
ES6 新特性(一部分)
查看>>
2018:Zilliqa年度回顾
查看>>
pandas数据处理#数据科学手册笔记
查看>>
多线程-按顺序输出ABCABC
查看>>
使用Homebrew安装MySQL
查看>>
true || false && false
查看>>
关于UIImagePickerController使用3DTouch的Crash问题
查看>>
HTMl 标题
查看>>
一个容错的Gson新世界
查看>>
DialogmentFragment详细生命周期
查看>>
JS常用方法
查看>>
js获取css属性知多少?客官来撸就知晓!
查看>>
微服务-eclipse
查看>>
css垂直居中的8种方法
查看>>
vue组件之menu导航菜单
查看>>
Gitter - 高颜值GitHub小程序客户端诞生记
查看>>
微服务架构-雪崩效应
查看>>