使用 Dapper 时 SQL Server 查询抛出超时错误

问题描述 投票:0回答:1

我尝试使用 ASP.NET Core 应用程序中的 Dapper 执行查询,但收到此错误:

Microsoft.Data.SqlClient.SqlException
H结果=0x80131904
消息=执行超时已过期。操作完成之前超时时间已过,或者服务器没有响应。
来源=核心 Microsoft SqlClient 数据提供程序

堆栈跟踪:
在 System.Threading.Tasks.ContinuationResultTaskFromResultTask`2.InnerInvoke()
在 System.Threading.ExecutionContext.RunInternal(ExecutionContextexecutionContext,ContextCallback 回调,对象状态)
--- 先前位置的堆栈跟踪结束 ---
在 System.Threading.ExecutionContext.RunInternal(ExecutionContextexecutionContext,ContextCallback 回调,对象状态)
在System.Threading.Tasks.Task.ExecuteWithThreadLocal(任务&currentTaskSlot,线程threadPoolThread)
--- 先前位置的堆栈跟踪结束 ---
内部异常 1:
Win32Exception:等待操作超时。

这发生在以下代码中大约 5 秒的暂停之后。

public async Task<ICollection<ReadingModel>> GetAllProcessedAsync()
{
    try
    {
        using IDbConnection connection = new SqlConnection(_config.GetConnectionString("Default"));

        string query = """
            SELECT R.Id, R.RecordedAt,
                CASE
                    WHEN RO.Value IS NOT NULL THEN RO.Value
                    ELSE R.SensorValue
                END AS SensorValue,
                R.SensorId, R.LocationId
            FROM Reading R
            LEFT JOIN ReadingOverride RO ON 
                R.LocationId = RO.LocationId 
                AND R.SensorId = RO.SensorId
                AND R.RecordedAt >= RO.StartDate 
                AND R.RecordedAt <= RO.EndDate
            WHERE R.LocationId = 1376 AND R.SensorId IN (18, 44, 48, 49, 50)
            ORDER BY R.RecordedAt ASC
            """;


        var result = await connection.QueryAsync<ReadingModel>(query);

        return result.ToList();
    }
    catch (Exception ex)
    {
        Log.Error(ex, "An error has occurred while fetching ReadingModels");
        throw;
    }
}

如果我在 SSMS 中运行此查询,它将在不到一秒的时间内返回 65'460 行。除此之外,Dapper 查询很少会成功。

如果我随后执行相同的查询,但将

IN (18, 44, 48, 49, 50)
修改为仅
IN (18)
,Dapper 查询现在会成功并返回 13'092 行。

我的查询的成功似乎在某种程度上取决于保持在约 50000 行以下。

如有任何帮助,我们将不胜感激。

我正在使用 SQL Server 2019 Express LocalDB (v15.0.4153)。

sql-server database asp.net-core dapper
1个回答
0
投票

通过从查询中删除以下行解决了我的问题:

ORDER BY R.RecordedAt ASC

我不确定为什么这会产生如此重大的影响,但我的查询时间从大约 3 分钟下降到 1 秒。

© www.soinside.com 2019 - 2024. All rights reserved.