我需要从以下你利弊/大师确认/解释,因为我的团队告诉我,“没关系”,它的fustrating我:)SQL性能,净优化VS最佳实践
背景:我们的主要MVC3/.Net4网络应用程序正在使用SQL Server 2008。我们在任何特定点都有大约200多个并发用户。服务器正在极其困难地工作(锁定,超时,整体缓慢),并且我尝试应用我在我职业生涯和最后一次MS认证课程中学到的知识。它们都是我们已经完成的东西(“关闭SQL连接STAT”),我试图向我的团队解释这些“小东西”,尽管不是单独产生影响,但最终加起来就是
我需要知道,如果下面做会影响性能,或者如果它只是“最佳实践”
1.使用“使用”关键字 他们大部分的代码是这样的:
public string SomeMethod(string x, string y) {
SomethingDataContext dc = new SomethingDataContext();
var x = dc.StoredProcedure(x, y);
}
虽然我试图告诉他们USING关闭/释放资源的速度更快:
using (SomethingDataContext dc = new SomethingDataContext()) {
var x = dc.StoredProcedure(x, y);
}
他们的观点是GC在代码执行完后清理起来足够好,所以USING没有太大的影响。对或错,为什么?
2.连接池
我总是听说建立连接池能显著加快网站(至少净W/MSSQL)。 我建议大家添加以下我们的ConnectionStrings在web.config:
...... “池= TRUE;闵池大小= 3;最大池大小= 100;连接 超时= 10;”。 ..
他们的观点是.Net/MSSQL已经在后台设置了连接池,并且不需要放在我们的web.config中。对或错?为什么所有其他网站都说如果已经设置好了,应该添加最优性能?
3.尽量减少通话#到DB
自带的默认的.Net MVC项目是很好的作用/会员供应商 - 它的方便和完成大部分跑腿的为您服务。但是这些家伙正在认真使用UsersInRoles()
并且像全局变量一样自由使用它(每次调用这个方法时它都会触发DB)。 我创建了一个“用户对象”,用于在每个页面加载上加载所有角色(以及其他一些用户内容,例如GUID等),然后查询该对象是否具有角色。
网站的其他部分有FOR语句循环超过200次,每次传递20-30个SQL查询=超过4,000次数据库调用。它在几秒钟内就可以做到这一点,但我想要做的是将20-30个DB呼叫合并为一个,这样就可以让ONE呼叫200次(每个循环)。 但由于SQL事件探查器说查询花费了“0秒”,所以它们的参数是如此之快以至于服务器可以处理这些大量的数据库查询。
我的想法是“是的,这些查询运行速度很快,但它们正在杀死整个SQL服务器的性能。” 这可能是一个促成因素吗?我是否担心什么,或者这是服务器整体性能问题的一个(显着)影响因素?
4,其他代码优化
想到的是使用StringBuilder
VS一个简单的字符串变量的第一个。我明白为什么我应该使用StringBuilder
(特别是在循环中),但他们说这并不重要 - 即使他们需要编写10k +行,他们的观点是性能增益并不重要。因此,总而言之,就是我们学习并钻进我们的所有东西(“最小化范围!”)只是“最佳实践”,没有真正的性能收益,或者它们都对真实/可衡量的性能有所贡献失利?
编辑 *** 谢谢你们所有的答案!我有一个基于你的答案的新的(第5个)问题: 他们实际上不使用“USING”,那么这意味着什么呢?如果自动发生连接池,是否将池中的连接捆绑在一起,直到GC出现?是否有可能每个开放的连接到SQL服务器增加了一点负担,并放慢了服务器?
根据你的建议,我计划对连接时间做一些严肃的基准测试/日志记录,因为我怀疑a)服务器速度慢,b)它们没有关闭连接,c)Profiler说它运行在0秒,缓慢可能来自连接。
我真的很感谢你们的帮助。即实现IDisposable并按住inmanaged资源也实现finilizer,确保GC过程中调用Dispose再次感谢
不要说研究并不重要,但是对SO的大师确实提供了很多见解......研究他们说的是非常多的研究 – 2013-02-13 22:37:53
@ JakeWilson801来自MS的文档并不总是最好的来源。 (编辑:或者甚至是一个很好的源码) – 2013-02-13 22:38:25
重新使用字符串生成器而不是连接字符串 - 如果你要连接字符串一次(即'var s =“a”+“b”'),那么字符串会更有效率,你需要记住,虽然是一个字符串实例是不可变的,所以在一个循环例如'string s =“a”; for(int i = 1,i <1000; i ++){s + =“a”;}'你为每个循环创建一个新的字符串实例,这会影响内存分配并影响整体性能(无论是否显着将取决于连接的数量)。 – GarethD 2013-02-13 22:53:08