.NET 通过网络访问 SQL 比在本地访问要快 - 嗯,为什么?
.NET access to SQL over network is faster than locally - um, why?
我有一个不寻常的问题,我的一台服务器比其他服务器性能更好,我想知道为什么 - 这样我就可以让其他服务器也正常工作:-)
这是我的(简化的)情景:
我有一个 SQL Server 2012 盒子,它是我们的生产环境——我们称之为 PROD。我有一个我们创建的 .NET 工具,运行 一遍又一遍地进行一些查询。如果我 运行 服务器上的这个工具本身与本地数据库对话,我得到的一组简单查询的响应时间在 4 到 20 毫秒之间,而对于更复杂的查询,我得到的响应时间在 589 到 731 毫秒之间。
我们还有另一个相同规格的 SQL Server 2012 盒子 - 我们称它为 STAG。如果我 运行 在这个盒子上使用相同的工具,连接到 PROD 数据库(即相同的代码,相同的连接字符串等),我得到的简单查询的响应时间在 0 到 1 毫秒之间,而简单查询的响应时间在 109 到 133 毫秒之间更复杂的查询,即明显更好。
我们有第三个 SQL 相同规格的 Server 2012 盒子 - 我们称此为测试。同样,运行将同一工具连接到 PROD,我得到的响应时间分别为 4 到 15 毫秒和 600 到 800 毫秒。
事实上,如果我 运行 在除我们的 STAG 环境之外的任何服务器(或客户端)上使用此工具,则时间安排大致相同。只是 STAG 在所有其他环境中表现不佳,我真的很想知道为什么!
如果我 运行 SSMS 中的查询,那么它们都是高性能的(即非常快,正如人们所期望的那样)。
因此,似乎在大多数机器上,从 .NET 访问数据库都有开销,但我们的 STAG 服务器除外,我希望我们所有的服务器都具有这种性能水平。
我检查过的所有内容似乎都匹配:
- SQL 客户端和服务器协议和配置
- 底层硬件(都在同一个 vSphere 基础架构上 运行)
- .NET Framework 版本
- 已应用 AV 版本和政策
我不知道还要检查什么 - 其他人可以提出任何建议吗?
谢谢
马克
是的 - 我终于找到了这个,它不是很好,但至少我有一致性。
我们计算时间的工具的逻辑有错误 - 我们使用 TimeSpan.TicksPerMillisecond 并且由于某种原因 Stopwatch.Frequency 在我们的服务器 8-@[= 上不同17=]
切换到 Stopwatch.StartNew(),然后是 Stop() 并使用 ElapsedMilliseconds 给我们正确的答案。
感谢 Jeroen 的所有帮助 - 至少下次我遇到性能问题时,我可以采纳你的建议,运行 首先使用这些。
我有一个不寻常的问题,我的一台服务器比其他服务器性能更好,我想知道为什么 - 这样我就可以让其他服务器也正常工作:-)
这是我的(简化的)情景: 我有一个 SQL Server 2012 盒子,它是我们的生产环境——我们称之为 PROD。我有一个我们创建的 .NET 工具,运行 一遍又一遍地进行一些查询。如果我 运行 服务器上的这个工具本身与本地数据库对话,我得到的一组简单查询的响应时间在 4 到 20 毫秒之间,而对于更复杂的查询,我得到的响应时间在 589 到 731 毫秒之间。
我们还有另一个相同规格的 SQL Server 2012 盒子 - 我们称它为 STAG。如果我 运行 在这个盒子上使用相同的工具,连接到 PROD 数据库(即相同的代码,相同的连接字符串等),我得到的简单查询的响应时间在 0 到 1 毫秒之间,而简单查询的响应时间在 109 到 133 毫秒之间更复杂的查询,即明显更好。
我们有第三个 SQL 相同规格的 Server 2012 盒子 - 我们称此为测试。同样,运行将同一工具连接到 PROD,我得到的响应时间分别为 4 到 15 毫秒和 600 到 800 毫秒。
事实上,如果我 运行 在除我们的 STAG 环境之外的任何服务器(或客户端)上使用此工具,则时间安排大致相同。只是 STAG 在所有其他环境中表现不佳,我真的很想知道为什么!
如果我 运行 SSMS 中的查询,那么它们都是高性能的(即非常快,正如人们所期望的那样)。
因此,似乎在大多数机器上,从 .NET 访问数据库都有开销,但我们的 STAG 服务器除外,我希望我们所有的服务器都具有这种性能水平。
我检查过的所有内容似乎都匹配:
- SQL 客户端和服务器协议和配置
- 底层硬件(都在同一个 vSphere 基础架构上 运行)
- .NET Framework 版本
- 已应用 AV 版本和政策
我不知道还要检查什么 - 其他人可以提出任何建议吗?
谢谢
马克
是的 - 我终于找到了这个,它不是很好,但至少我有一致性。 我们计算时间的工具的逻辑有错误 - 我们使用 TimeSpan.TicksPerMillisecond 并且由于某种原因 Stopwatch.Frequency 在我们的服务器 8-@[= 上不同17=]
切换到 Stopwatch.StartNew(),然后是 Stop() 并使用 ElapsedMilliseconds 给我们正确的答案。
感谢 Jeroen 的所有帮助 - 至少下次我遇到性能问题时,我可以采纳你的建议,运行 首先使用这些。