我需要您的专业人士/专家的确认/解释,因为我的团队告诉我“没关系”,这让我很沮丧:)
背景:我们的主要 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);
}
虽然我试图告诉他们 USING 更快地关闭/释放资源:
using (SomethingDataContext dc = new SomethingDataContext()) {
var x = dc.StoredProcedure(x, y);
}
他们的论点是,在代码执行完成后,GC 的清理工作已经足够好,因此 USING 不会产生巨大的影响。是真是假,为什么?
2.连接池
我一直听说设置连接池可以显着加快任何网站(至少 .Net w/MSSQL)。我建议我们将以下内容添加到 web.config 中的连接字符串中:
..."池=True;最小池大小=3;最大池大小=100;连接超时=10;"...
他们的论点是 .Net/MSSQL 已经在后台设置了连接池,不需要放入我们的 web.config 中。对或错?为什么每个其他站点都说如果已经设置了池,应该添加池以获得最佳性能?
3. 尽量减少对 DB 的调用次数
默认的 .Net MVC 项目附带的角色/成员资格提供程序非常好 - 它很方便,并且可以为您完成大部分工作。但是这些人正在认真使用UsersInRoles()
并像全局变量一样自由地使用它(每次调用此方法时都会访问数据库)。我创建了一个“用户对象”,它在每次页面加载时预先加载所有角色(以及其他一些用户内容,例如 GUID 等),然后查询该对象以了解用户是否具有角色。
网站的其他部分有循环超过 200 次的 FOR 语句,每次通过执行 20-30 次 sql 查询 = 超过 4,000 次数据库调用。它以某种方式在几秒钟内完成此操作,但我想要做的是将 20-30 个 DB 调用合并为一个,以便它使 ONE 调用 200 次(每个循环)。但是因为 SQL 分析器说查询花费了“0 秒”,他们的论点是它是如此快速和小,以至于服务器可以处理这些大量的数据库查询。
我的想法是“是的,这些查询运行得很快,但它们正在扼杀整个 SQL Server 的性能。” 这可能是一个促成因素吗?我什么都不担心,还是这是导致服务器整体性能问题的(重要)因素?
4.其他代码优化
首先想到的是使用StringBuilder
vs 一个简单的字符串变量。我理解为什么我应该使用StringBuilder
(尤其是在循环中),但他们说这并不重要——即使他们需要写 10k+ 行,他们的论点是性能增益并不重要。
所以总而言之,我们学习和钻研的所有东西(“最小化范围!”)只是“最佳实践”而没有真正的性能提升,还是它们都导致了真正/可测量的性能损失?
编辑*** 感谢大家的所有回答!根据您的回答,我有一个新的(第 5 个)问题:他们实际上不使用“USING”,那么这意味着什么?如果自动发生连接池,它是否会占用池中的连接,直到 GC 出现?是否有可能每个与 SQL 服务器的打开连接都给服务器增加了一点负担并减慢了它的速度?
根据您的建议,我计划对连接时间进行一些严肃的基准测试/记录,因为我怀疑 a) 服务器速度很慢,b) 他们没有关闭连接,c) Profiler 说它在 0 秒内运行,速度很慢可能来自连接。
我真的很感谢你们的帮助。再次感谢