2010-07-12 108 views
0

HI,SQL存储过程从.NET调用

我有一个SQL存储过程,这是我从我的asp.net(2.0)代码使用 sqlCom.ExecuteNonQuery()调用,但它tooks约60到100秒完成,而我执行相同的SP从SQL查询工具运行3到4秒。

请帮忙。


编辑 - 代码注释:

public int ExecuteNonQuery(string strSpName, DbParameter[] parameterValues) 
{ 
    CreateConnection(); 
    SqlCommand sqlCom = new SqlCommand(); 
    if (strSpName == null || strSpName.Length == 0) 
     throw new ArgumentNullException("strSpName"); 
    int i = 0; 
    sqlCom.Connection = _sqlConn; 
    if (_blnIsTransEnabld == true) 
     sqlCom.Transaction = _sqlT; 
    sqlCom.CommandType = System.Data.CommandType.StoredProcedure; 
    sqlCom.CommandText = strSpName; 
    sqlCom.CommandTimeout = _sqlConn.ConnectionTimeout; 
    return sqlCom.ExecuteNonQuery(); 

} 
+0

HI, 我在执行SQL查询的同时,在3秒钟内从C#代码调用同一个sp并完成同样的sp时发生了SP执行问题 – 2010-07-12 11:01:04

+0

请发布执行存储过程的代码。 – 2010-07-12 11:02:42

+0

public int ExecuteNonQuery(string strSpName,DbParameter [] parameterValues) { CreateConnection(); SqlCommand sqlCom = new SqlCommand(); if(strSpName == null || strSpName.Length == 0)throw new ArgumentNullException(“strSpName”); int i = 0; sqlCom.Connection = _sqlConn;如果(_blnIsTransEnabld == true) sqlCom.Transaction = _sqlT; sqlCom.CommandType = System.Data.CommandType.StoredProcedure; sqlCom.CommandText = strSpName; sqlCom.CommandTimeout = _sqlConn.ConnectionTimeout; return sqlCom.ExecuteNonQuery(); – 2010-07-12 11:09:36

回答

1

这通常是过时统计的症状。建议你重新统计:

exec sp_updatestats 
1

我建议更新的统计数据或进行任何改动存储过程直到你收集的执行计划,因为这将在缓存中删除执行计划和挫败任何试图进一步调查这是否是实际问题。

该计划的下降可能会导致您认为问题已解决,但如果问题是参数嗅探,它可能会重新出现。

首先按照此答案中的建议获取SSMS和C#执行计划。

Very different execution times of SQL query in C# and SQL Server Management Studio

一旦你得到了这些保存您可以更新XML对他们俩的你的问题?

编辑:实际上可能更好的办法是使用SQL事件探查器捕获Showplan XML Statistics Profile事件并获取C#实际执行计划。如果它是生产服务器,则不要让探查器跟踪运行的时间超过最小值。

0

首先,看看代码,我希望你有一些东西来关闭你在这里使用的连接。

至于你的问题,在你正在访问的数据发出锁定的事务处理中有另一个查询挂起? 这将解释很长的执行时间;如果您正在访问的数据被其他查询锁定,则执行将等待锁释放或超时。

要确定是否存在锁定问题,可以使用SQL Server Management Studio。打开管理/活动监视器以获取挂起锁的列表。

为了防止锁定问题,请确保您尽快提交或回滚所有未决事务。有几种方法可以解决死锁问题。通常,您可以通过重新排序事务中的查询来阻止这一切。如果这不是一个选项,您可能需要更改事务的隔离级别或使用table hints