Fill(DataSet)超时问题排查处理
bug复现:相同的一条语句 exec Proc_SelectTable
在数据库管理软件中执行速度很快,
但是在程序中执行很慢,
调用方法如下:
/// <summary>
/// 执行存储过程 返回DataSet
/// </summary>
/// <param name="conString">数据库连接串</param>
/// <param name="storedProcName">存储过程名</param>
/// <param name="parameters">存储过程参数</param>
/// <returns>DataSet</returns>
public static DataSet RunProcedureToDataSet(string conString, string storedProcName, IDataParameter[] parameters)
{
using (SqlConnection connection = new SqlConnection(conString))
{
DataSet dataSet = new DataSet();
connection.Open();
SqlDataAdapter sqlDA = new SqlDataAdapter();
sqlDA.SelectCommand = BuildQueryCommand(connection, storedProcName, parameters);
sqlDA.Fill(dataSet);
connection.Close();
return dataSet;
}
}
执行到 sqlDA.Fill(dataSet); 这一步就会出现超时错误,排查了程序问题和数据库语句问题,看上去都不存在干扰因素,
经过借鉴博主文章(https://blog.csdn.net/superwfei/article/details/82494273),对数据库的存储过程语句进行了换行操作
成功解决了以上问题
修改后的存储过程类似如下模式:
Create Proc Proc_SelectTable
@StartDate datetime,--开始日期
@EndDate datetime--结束日期
as
begin
select col1
,col2
,col3
,col4
,col5
From table
where a=1
and b=2
and c=3
end
友情提示:
尽量别在数据查询中使用如下形式的查询条件,也是一个极影响查询速度的因素
F_DetectTime<= convert(datetime, '2021.02.02 23:59:59')
他会对每一行都进行一次数据类型转化