Sql server SQL Server准备好的语句执行-奇怪的行为

Sql server SQL Server准备好的语句执行-奇怪的行为,sql-server,prepared-statement,Sql Server,Prepared Statement,我有一些与SQLServer2012数据库通信的.NET应用程序 通常,它从客户机获取请求,运行一些SQL查询集来处理请求并返回结果。为了优化性能,我在启动时准备所有查询,然后每次都执行准备好的语句。这在大多数情况下都很有效,但偶尔我会遇到一些奇怪的性能问题,所以我尝试在分析器的帮助下调查到底发生了什么 我捕获了Showplan XML统计配置文件和RPC:Completed事件 当应用程序正常运行时,我可以在profiler中看到它在启动时执行如下操作: declare @p1 int set

我有一些与SQLServer2012数据库通信的.NET应用程序

通常,它从客户机获取请求,运行一些SQL查询集来处理请求并返回结果。为了优化性能,我在启动时准备所有查询,然后每次都执行准备好的语句。这在大多数情况下都很有效,但偶尔我会遇到一些奇怪的性能问题,所以我尝试在分析器的帮助下调查到底发生了什么

我捕获了Showplan XML统计配置文件和RPC:Completed事件

当应用程序正常运行时,我可以在profiler中看到它在启动时执行如下操作:

declare @p1 int
set @p1 = 5

exec sp_prepexec @p1 output, N'@my_param_list', N'select my_field from my_table'
然后在每次客户端请求时:

exec sp_execute 5, @myparam1=value1, @myparam2=value2 ...
在这个RPC:Completed行之前,我可以看到Showplan XML Statistics概要文件事件和非常正常的执行计划。查询的持续时间约为50ms,这很好

现在,当问题发生时,我可以在profiler中看到大约2500(!)行Showplan XML Statistics概要事件—每个事件都在参与查询的一个表上进行了一些无意义的索引扫描(唯一的区别是参与扫描的索引),然后是“流聚合”。在所有这些行之后,我终于可以看到带有以下文本的RPC:Completed事件:

declare @p1 int
set @p1 = NULL 

exec sp_prepexec @p1 output, N'@my_param_list', N'select my_field from my_table'
持续时间超过30秒。我不明白为什么需要这么长时间,所有这些扫描的意义是什么,以及为什么处理程序在
sp_prepexec
中为空。在我看来,SQL Server非常努力地执行准备好的语句,而不是放弃它或可能尝试重新准备它


所以我很高兴能得到一个解释,说明这有什么问题,发生了什么。。。。提前谢谢,很抱歉解释得太长。

我猜您遇到了参数嗅探问题。尝试追加
选项(针对未知优化)
对于您的查询,看看这是否解决了问题。@TT-我考虑过参数嗅探,但我认为它不能解释一个查询中对同一个表的2500次扫描。另外,我对相关数据有很好的估计——它是均匀分布的。