我有一个非常简单的查询,但在代码运行时,我一直遇到超时的问题(它需要超过三分钟才能完成,我提前停止以便发布这个问题),然而当我从同一台计算机在 Sql Server Management Studio 中运行相同的查询时,第一个没有缓存的数据查询需要 2532 毫秒
,重复查询需要 524 毫秒
。
这是我的 C# 代码:
using (var conn = new SqlConnection("Data Source=backend.example.com;Connect Timeout=5;Initial Catalog=Logs;Persist Security Info=True;User ID=backendAPI;Password=Redacted"))
using (var ada = new SqlDataAdapter(String.Format(@"
SELECT [PK_JOB],[CLIENT_ID],[STATUS],[LOG_NAME],dt
FROM [ES_HISTORY]
inner join [es_history_dt] on [PK_JOB] = [es_historyid]
Where client_id = @clientID and dt > @dt and (job_type > 4 {0}) {1}
Order by dt desc"
, where.ToString(), (cbShowOnlyFailed.Checked ? "and Status = 1" : "")), conn))
{
ada.SelectCommand.Parameters.AddWithValue("@clientID", ClientID);
ada.SelectCommand.Parameters.AddWithValue("@dt", dtpFilter.Value);
//ada.SelectCommand.CommandTimeout = 60;
conn.Open();
Logs.Clear();
ada.Fill(Logs); //Time out exception for 30 sec limit.
}
这是我的代码,我在 SSMS 中运行它,我直接从 ada.SelectCommand.CommandText 提取了它。
declare @clientID varchar(200)
set @clientID = '138'
declare @dt datetime
set @dt = '9/19/2011 12:00:00 AM'
SELECT [PK_JOB],[CLIENT_ID],[STATUS],[LOG_NAME],dt
FROM [ES_HISTORY]
inner join [es_history_dt] on [PK_JOB] = [es_historyid]
Where client_id = @clientID and dt > @dt and (job_type > 4 or job_type = 0 or job_type = 1 or job_type = 4 )
Order by dt desc
什么导致时间差异的重大差异?为了保持评论区的清洁,我将在此回答一些常见问题。
相同的计算机和登录名用于应用程序和ssms。
我的示例查询仅返回15行。 然而,es_history包含11351699行,es_history_dt包含8588493行。这两个表都有良好的索引,并且SSMS中的执行计划显示它们正在使用索引查找以进行快速查找。该程序的行为就像它没有使用C#版本查询的索引。