系统性能优化历程

系统性能优化过程.
    现在的公司的系统很不稳定,尤其在高峰期间,一个系统的性能都会影响到其它系统的性能.我负责的一个系统.由于涉及到公司的各个系统,比如生产,工资,库存,工单,他们都是独立的系统.我的系统都要去他们所在的数据库拿数据.尤其是在首页要从各个系统中提取数据,所以等待的时间特别久,用户经常打点话下来抱怨,让我们尽快的想办法解决这个问题.我都能理解,我也想尽快的帮他们解决,我也放心,踏实.
    我观察了各个WEB服务器的性能都不错,服务器都是IBM的刀片服务器,4CPU,4G内存.他们的cpu一般情况都在20%左右,内存用的也不多.但是SQLServer服务器的CPU用的也不高,也在20%左右,sqlServer用的内存在1.9G左右.
    我也尝试打开Window2003SQLServer的3G选项,我希望SQLServer能够用到更多的内存,但觉得这个没有什么作用,不知道您觉得怎样?
    我尝试判断网络的速度的好坏,在局域网内,网速没有问题.
    我尝试优化数据库索引,似乎也没有提升明显的性能.
    我尝试优化SQL,但也没有提升性能.
    我尝试把用Hibernate性能有影响的地方用JDBC来取代,但没有起作用.
    我也监控获取每一部分数据从数据库返回到应用程序所需要的时间,我看到一个地方获取数据花的时间最多,一般情况下要10秒左右,所以系统的性能非常差.我也查看了那个表有400多万条数据,我们把一些很少用到的数据从中移出来,最终留有150万左右的数据,这样做使得那个系统的性能到是提高了不少,但是我的系统提升就不明显.由于这个表十分的庞大,也比较复杂,它是一个交收移交表,比如数据从A部门移到B部门,由从B部门移动到C部门,也就是,由一个上一部门,当前部门,下一部门;就成了一个树状结构了,而且,这个表是系统的核心,众多的操作都涉及它,用户的移交接收操作都和它有关,所以它的负担很重,系统的瓶颈也在这.也不知道对这样的情况大家是怎样设计的.
    我能想到的办法都想到了,请大家给我一些建议,改善我们的系统.让我过一个好年,也提前向大家拜个早年.谢谢!

 

12 楼 hgq0011 2008-02-01  
yyliuliang 写道

把效率低的sql语句的执行计划截几个图

重点看Profile里Duration 和Reads数高的

那图看不出什么门道来。
能详细说一下吗?
13 楼 LucasLee 2008-02-01  
hgq0011 写道
yyliuliang 写道

把效率低的sql语句的执行计划截几个图

重点看Profile里Duration 和Reads数高的

那图看不出什么门道来。
能详细说一下吗?


你看不出门道不要紧,贴上来让会看的分析一下呗。然后你在顺便学学。
不提供充足的信息,大伙也只能给你模糊的可能性分析。
信息提供得越具体,解决的可能性越大。如有疑问,请先看本站的“提问的智慧”。
14 楼 xiaoyu 2008-02-01  
hgq0011 写道
xiaoyu 写道
首先要分析出, 你的索引有没有被使用, 如果没有被使用就白建了.

是的我也在考虑这个问题,请给我一些建议怎样确索引是否正确的被使用呢?我看到那个表已经建立了好几个索引,似乎建的不太正确。那个不是我负责的,正准备和同事商量能不能改善它,但是那个系统自从我们移走了200多万条记录,系统平稳运行。

xiaoyu 写道
如果这张表经常更新很多, 可以考虑让SqlServer采用Oracle的管理方式---就是select和update是不会被阻塞的.

这个能不能也请您具体说说,好吗? 因为我对ORACLE只懂一点皮毛,还正要更深入的研究它。谢谢!


xiaoyu 写道
可以按条件进行分区-这样你就不用分割表了(SQL server不太清楚, oracle是没有问题的, 不过分区这种东西要看合不合适你的业务).

SQLServer也可以进行分区的,似乎视图(不知道正不正确)。

我要用的那部门数据,我按照业务条件和估算日期建立了一个视图。从150W的记录中只那上百条记录。但是就是这上条数据中一次拿几条数据也要10S左右。这个开销太大了。也让我很头痛呀。现在我都怀疑用视图做这样的事情合不合适?本来我想对视图建一个唯一聚索引,查询倒是可以使用。但是对应的应用系统不能使用,通过系统不能更新数据。


关于分析SQL的index使用情况可以参考:http://www.itlearner.com/article/2005/2443.shtml

关于第二个update是否会阻塞select(update和select在不同的事务里, 处理同一条记录), 你要查一下SQL SERVER的手册了(SQL SERVER 我不熟)。

分区的话, 你可以看一下手册。
15 楼 hgq0011 2008-02-02  
Lucas Lee 写道

信息提供得越具体,解决的可能性越大

有些东西不便直接显示。
16 楼 xiangzhouwang 2008-02-02  
有效索引,db优化,不用存储过程,DAO CACHE,app水平或垂直克隆,
17 楼 hgq0011 2008-02-02  
yyliuliang 写道

把效率低的sql语句的执行计划截几个图

重点看Profile里Duration 和Reads数高的

你是不是说的这个图?
引用的表名我去掉了。
18 楼 dhcn 2008-02-02  
对于你这种情况,建议在本地建一个数据库,针对你使用的情况建表(这样就避免了夺表查询的消耗),定期从其他系统取数据,然后你的页面从本地取数据就可以了。
19 楼 hgq0011 2008-02-02  
dhcn 写道
对于你这种情况,建议在本地建一个数据库,针对你使用的情况建表(这样就避免了夺表查询的消耗),定期从其他系统取数据,然后你的页面从本地取数据就可以了。

这样不行,因为那些数据随时都可能改变,而且数据的价值非常高,出错就麻烦了。
20 楼 xiaolin0105 2008-02-04  
<div class='quote_title'>hgq0011 写道</div><div class='quote_div'><br/>    我也监控获取每一部分数据从数据库返回到应用程序所需要的时间,我看到一个地方获取数据花的时间最多,一般情况下要10秒左右,所以系统的性能非常差.我也查看了那个表有400多万条数据,我们把一些<span style='color: #ff9900;'>很少用到的数据从中移出来</span>,最终留有150万左右的数据,这样做使得那个系统的性能到是提高了不少,但是我的系统提升就不明显.由于这个表十分的庞大,也比较复杂,它是一个交收移交表,比如数据从A部门移到B部门,由从B部门移动到C部门,也就是,由一个上一部门,当前部门,下一部门;就成了一个树状结构了,而且,这个表是系统的核心,众多的操作都涉及它,用户的移交接收操作都和它有关,所以它的负担很重,系统的瓶颈也在这.也不知道对这样的情况大家是怎样设计的.<br/>   <br/><p> </p></div><br/>那个表能不能分割?
21 楼 hgq0011 2008-02-05  
<div class='quote_title'>xiaolin0105 写道</div><div class='quote_div'><div class='quote_title'>hgq0011 写道</div><div class='quote_div'><span style='color: #ff9900;'>很少用到的数据从中移出来</span> <br/></div><br/>那个表能不能分割?</div>当然能
22 楼 yyliuliang 2008-02-05  
信息太少了  就具体问题大家估计难以给你什么有效帮助
原则上的解决办法或途径大伙基本上已经帮你列出来了
23 楼 hgq0011 2008-02-14  
经过各方面的排查,认真的分析了相关表的SQL的查询条件,测试表的索引,终于发现有个表的字段没有添加到索引中.现在性能比以前是要好多了,现在一般情况下在2秒左右,用户还是可以接受的.
24 楼 gigix 2008-02-15  
hgq0011 写道
经过各方面的排查,认真的分析了相关表的SQL的查询条件,测试表的索引,终于发现有个表的字段没有添加到索引中.现在性能比以前是要好多了,现在一般情况下在2秒左右,用户还是可以接受的.

看看,我沙发帖就猜中了
25 楼 hgq0011 2008-02-15  
gigix 写道
看看,我沙发帖就猜中了


谢谢,受教了:)

那个系统是另一同事负责,所以也不好去说的。
26 楼 gurudk 2008-02-17  
hgq0011 写道
gigix 写道
看看,我沙发帖就猜中了


谢谢,受教了:)

那个系统是另一同事负责,所以也不好去说的。

我也优化过几个系统,多半是索引问题,或者表结构设计有缺陷。
27 楼 acme1921209 2008-02-17  
索引是头号“敌人”啊 
不过 索引是很重要
28 楼 leadyu 2008-02-26  
如果要作性能优化,建议你关注一下我的项目:jwebap.sourceforge.net

它可以监控j2ee工程(包括EJB以及WebModule)的所有的jdbc调用,包括调用的堆栈(什么程序打开的连接),还可以监控方法的调用,以及http的请求,所有的这一切,只需要部署一个jar,以及配置一个配置文件。 同时它给系统带来的消耗是非常低的。

jwebap基于plugin架构,core部分基于jdk14,所有的监控组件都是plugin,大部分的plugin基于jdk14,以后会开发一些针对专属平台的plugin, 下阶段准备开发基于jdk15的memory_monitor_plugin。

它同时提供Web Console,界面也相当美观,全部通过jar包实现。下面贴几张出来:
29 楼 rihoonet 2008-02-27  
你的服务器内存没有完全用到,SQL才用1.9G,还有2G哪去了,所以,要为 SQL Server 启用 AWE 内存
30 楼 fenixshadow 2008-03-04  
连问题都没有搞清楚答案就一堆了,真都是牛人啊。
连最关键的如何从其他系统获取数据都没有说清楚就能解答?
牛!
31 楼 yangjuqi 2008-03-05  
表的操作越频繁,索引越重要