在C#代码中,函数错误超时,但在SQL Server中执行速度很快



从过程执行的我的函数

SELECT 
@temp = SUM(BestB)
FROM
(SELECT 
NS.[code_malekin], 
CONVERT(INT, (M.[darsad_1] + M.[darsad_10] + M.[darsad_5] - M.[khosh_hesab]) / 4) / 10000 * 10000 AS BestA, 
CONVERT(INT, (NS.[BEST])) AS BestB
FROM 
[melk].[dbo].[ATbNosazi_MALEKIN] M
INNER JOIN 
ATbNosazi_SANAD NS ON M.code = NS.code_malekin
WHERE 
NS.[YEAR] = 2018) T1
WHERE
(BestB <= BestA + 50000)
AND (BestB >= BestA - 50000)
AND ([code_malekin] = @CODE)

在我的C#Web表单中,这段代码不会执行,但在SQL Server中,它执行得很好。

我的C#代码是

SqlCommand command = new SqlCommand();
SqlConnection connection = new SqlConnection(connectionString);
DataTable dt = new DataTable();
command.CommandText = sql;
if (ArParam != null)
command.Parameters.AddRange(ArParam);
command.CommandTimeout = 0;
if (Isquery == true)
command.CommandType = CommandType.Text;
else
command.CommandType = CommandType.StoredProcedure;
SqlDataAdapter dataAdaptor = new SqlDataAdapter();
dataAdaptor.SelectCommand = command;
dataAdaptor.SelectCommand.CommandTimeout = 0;
dataAdaptor.Fill(dt);
return dt;

我已经用这个代码运行程序和功能

您的proc使用一个参数。该参数在第一次执行过程时被"嗅探"。执行计划是基于嗅探的值构建的。下次运行proc时,将使用相同的计划。

现在:当从C#代码执行时,生成了一个计划,当从SSMS执行时,由于在这种情况下会话设置不同,生成了另一个计划。

因此,您有两个不同的计划,一个"好",一个是"坏",都是为不同的输入参数构建的。解决此问题的最简单方法是在SELECT语句中使用option(recomplie),这样,在执行sp时,输入参数将被嗅探。

或者,您可以从计划缓存中获取这两个计划,并对其进行检查,以了解是什么参数导致了"坏"计划(两个计划中都有为其编译的参数值(。

你可以在这里阅读更多:应用程序慢,SSMS快?理解性能之谜

相关内容

最新更新