SQL性能,.Net优化与最佳实践

Los*_*ear 11 .net c# sql-server asp.net-mvc sql-server-2008

我需要你的专业人士/大师的确认/解释,因为我的团队告诉我"这没关系",这让我感到很沮丧:)

背景:我们的主要MVC3/.Net4 Web应用程序正在使用SQL Server 2008.我们在任何给定点上都有大约200多个并发用户.服务器受到极大的打击(锁定,超时,整体缓慢),我正在尝试应用我在整个职业生涯和最后一次MS认证课程中学到的东西.他们是我们所有人都在钻的东西("关闭SQL连接STAT"),我试图向我的团队解释这些"小东西",虽然不是唯一一个有所作为,但最终还是加起来.

我需要知道以下是否会对性能产生影响,或者它是否只是"最佳实践"

1.使用"USING"关键字. 他们的大部分代码都是这样的:

public string SomeMethod(string x, string y) {
    SomethingDataContext dc = new SomethingDataContext();
    var x = dc.StoredProcedure(x, y);
}
Run Code Online (Sandbox Code Playgroud)

虽然我试图告诉他们USING会更快地关闭/释放资源:

using (SomethingDataContext dc = new SomethingDataContext()) {
    var x = dc.StoredProcedure(x, y);
}
Run Code Online (Sandbox Code Playgroud)

他们的论点是GC在代码执行完毕后做了很好的清理工作,因此USING没有产生巨大的影响.是真还是假?为什么?

2.连接池

我一直听说设置连接池可以显着加快任何网站(至少.Net w/MSSQL).我建议我们在web.config中的connectiontring中添加以下内容:

..."Pooling = True; Min Pool Size = 3; Max Pool Size = 100; Connection Timeout = 10;"......

他们的论点是.Net/MSSQL已经在幕后设置了连接池,没有必要放入我们的web.config.对或错?为什么每个其他网站都说如果已经设置了池,那么应该添加池以获得最佳性能?

3.最小化对DB的调用次数

默认的.Net MVC项目附带的角色/成员资格提供程序很不错 - 它非常方便,可以为您完成大部分工作.但是这些人正在认真UsersInRoles()地使用它并像一个全局变量一样自由地使用它(每次调用这个方法时它就会击中数据库).我创建了一个"用户对象",它在每个页面加载(以及其他一些用户的东西,如GUID等)上预先加载所有角色,然后查询该对象是否具有该角色.

该网站的其他部分有FOR语句循环超过200次,并在每次传递=超过4,000个数据库调用时执行20-30个sql查询.它以某种方式在几秒钟内完成,但我想要做的是将20-30个DB调用合并为一个,这样它就可以进行200次调用(每个循环).但是因为SQL分析器说查询花了"0秒",所以它们的论点是它如此快速和小,以至于服务器可以处理这些大量的数据库查询.

我的想法是"是的,这些查询运行速度很快,但它们会破坏整个SQL服务器的性能." 这可能是一个促成因素吗?我是否担心什么,或者这是服务器整体性能问题的重要因素?

4.其他代码优化

首先想到的是使用StringBuildervs一个简单的字符串变量.我理解为什么我应该使用StringBuilder(特别是在循环中),但是他们说这没关系 - 即使他们需要写10k +行,他们的论点是性能增益无关紧要.

总而言之,我们所学到的所有东西都已深入到我们身上("最小化范围!")只是"最佳实践"而没有真正的性能提升,或者它们是否都会导致实际/可衡量的性能损失?

编辑*** 谢谢大家的所有答案!我根据你的答案提出了一个新的(第五个)问题:他们实际上并没有使用"USING",那么这意味着什么呢?如果连接池自动发生,它是否会从池中连接到GC到来之前?是否可能每个与SQL服务器的开放连接都会给服务器增加一点负担并减慢它的速度?

根据你的建议,我计划对连接时间做一些严格的基准测试/记录,因为我怀疑a)服务器很慢,b)他们没有关闭连接和c)Profiler说它在0秒内运行,速度慢可能来自连接.

我真的很感谢你的帮助.再次感谢

Tre*_*ley 5

对代码进行分支,根据当前代码库进行更改和基准测试+配置文件.然后你会得到一些证据来支持你的说法.

至于你的问题,这里有:

  1. 你应该总是手动处理实现的类IDisposable,GC实际上不会调用dispose,但是如果类也实现了终结器,那么它将调用终结器,但是在大多数实现中它们只清理非托管资源.

  2. 确实,.NET框架已经进行了连接池,我不确定默认值是什么,但连接字符串值只是允许你改变它们.

  3. SQL语句的执行时间只是故事的一部分,在SQL分析器中,您将看到数据库引擎执行查询所花费的时间,您缺少的是Web服务器连接所需的时间.并从数据库服务器接收结果,因此查询可能很快,您可以通过批处理查询节省大量的IO和网络延迟.

  4. 这个是一个很好的一个来进行一些分析,以证明串联构建器上连接所使用的额外内存.