【发布时间】:2021-09-10 19:53:52
【问题描述】:
每次我尝试访问 HangFire 仪表板时都会收到 SQL 异常。
我收到的信息是
由于此查询中定义的提示,查询处理器无法生成查询计划。在不指定任何提示和不使用 SET FORCEPLAN 的情况下重新提交查询
导致它的罪魁祸首是Hangfire.SqlServer.SqlServerMonitoringApi.GetStatistics()我发现GetStatistics()方法正在运行以下查询
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
SELECT COUNT(Id)
FROM HangFire.Job WITH (NOLOCK, FORCESEEK)
WHERE StateName = N'Enqueued';
SELECT COUNT(Id)
FROM HangFire.Job WITH (NOLOCK, FORCESEEK)
WHERE StateName = N'Failed';
SELECT COUNT(Id)
FROM HangFire.Job WITH (NOLOCK, FORCESEEK)
WHERE StateName = N'Processing';
SELECT COUNT(Id)
FROM HangFire.Job WITH (NOLOCK, FORCESEEK)
WHERE StateName = N'Scheduled';
SELECT COUNT(Id)
FROM HangFire.Server WITH (NOLOCK);
SELECT SUM(s.[Value])
FROM
(SELECT SUM([Value]) AS [Value]
FROM HangFire.Counter WITH (NOLOCK, FORCESEEK)
WHERE [Key] = N'stats:succeeded'
UNION ALL
SELECT [Value]
FROM HangFire.AggregatedCounter WITH (NOLOCK, FORCESEEK)
WHERE [Key] = N'stats:succeeded') AS s;
SELECT SUM(s.[Value])
FROM
(SELECT SUM([Value]) AS [Value]
FROM HangFire.Counter WITH (NOLOCK, FORCESEEK)
WHERE [Key] = N'stats:deleted'
UNION ALL
SELECT [Value]
FROM HangFire.AggregatedCounter WITH (NOLOCK, FORCESEEK)
WHERE [Key] = N'stats:deleted') AS s;
SELECT COUNT(*)
FROM HangFire.[Set] WITH (NOLOCK, FORCESEEK)
WHERE [Key] = N'recurring-jobs';
现在,当我复制代码并在我的 SSMS 上运行它时,我得到了同样的错误,当我在没有 FORCESEEK 提示的情况下运行它时,会返回结果。
现在我的问题是我不能对包中的代码做太多事情,所以我可以在 SQL Server 端做些什么来防止这种情况发生,或者我可以做些什么来解决这个问题问题。
环境
- 服务器:Windows Server 2019
- 运行时:.NET Core 3.1
吊火
- Hangfire.AspNetCore 1.7.12
- Hangfire.SqlServer 1.7.12
【问题讨论】:
标签: sql-server tsql asp.net-core hangfire