我正在使用SQL Server 2008,我想调整所有需要很长时间的存储过程
每当我单独执行存储过程时,我立即得到结果..
每当我们为100个用户运行负载测试时,结果非常糟糕。
我正在使用带有SQL Server 2008的.NET应用程序
有没有办法找出问题所在?
答案 0 :(得分:1)
如果代码在SSMS中正常运行,但在.NET中运行不正常,则可能是由于参数嗅探。 尝试将以下查询提示添加到每个select语句的末尾:
OPTION (RECOMPILE)
如果现在为SSMS和.NET提供类似的结果,则可以进行参数嗅探。解决这个问题的一种方法是重新编译选项,如上所述。但是,这会每次重新编译查询,这应该只被视为最后的手段。更好的方法是使用局部变量,因此在存储过程中,您将参数重新分配给变量并在选择查询中使用这些变量,如下所示:
create proc myproc (@param1 int, @param2 varchar(20))
as
declare @var1 int
declare @var2 varchar(20)
set @var1 = @param1
set @var2 = @param2
select
<columns>
from
<table>
where
<column x> = @var1
And <column y> = @var2
还有其他使用查询提示的解决方法,如下所述:
http://blogs.msdn.com/b/turgays/archive/2013/09/10/parameter-sniffing-problem-and-workarounds.aspx
答案 1 :(得分:1)
在调整/优化/无论什么之前,你必须从逻辑上接近这一点以找出问题的实际位置。
首先,确认实际上数据库是问题所在 - 它可能是.Net应用程序。在.Net应用程序上放置一个探查器,并检查它确实花时间处理数据库查询,并且问题不在于应用程序代码。
接下来,在数据库服务器上运行性能监视器;检查内存,CPU,磁盘I / O和网络。如果其中任何一个是尖峰或持续100%,您可能有硬件瓶颈。升级硬件通常要便宜得多,便宜得多。当然,数据库问题很可能在CPU或内存峰值中出现,所以这不是万无一失的 - 但如果你在不合标准的硬件上运行,升级仍然要便宜得多。
接下来,在服务器上运行SQL Server Profiler。尝试过滤噪音 - 这是一个非常嘈杂的工具 - 并在多个用户使用该应用程序时查找长时间运行的查询。通常,您只会看到一些导致大多数性能问题的查询(但并非总是如此)。创建慢速运行列表(我使用1秒作为截止点)。
在开发环境中获得慢速运行查询列表后,优化它们。查看查询计划以确保它们使用正确的索引,并查看它们的编写方式。如果您仍然卡住,请返回并发布特定查询和示例数据供我们查看。