【问题标题】:How can resolve the SQL exception 'Query processor could not produce a query plan because of the hints defined in this query.' caused by HangFire如何解决 SQL 异常“由于此查询中定义的提示,查询处理器无法生成查询计划。”由 HangFire 引起
【发布时间】: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


    【解决方案1】:

    Query Store Hints feature 提供了一种应用或覆盖查询提示的新方法,但这是全新的,目前仅适用于 Azure SQL 数据库(始终是最新的代码库)。

    但除此之外,还有一个匹配的hangfire issue on GitHub 有一些故障排除提示。

    【讨论】:

    • 感谢您的回答,我们目前使用的是 SQL Server 2016 (13.0),因此无法使用查询存储提示功能,但我会关注 Github 上的 Hangfire 问题。
    猜你喜欢
    • 2016-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-01
    相关资源
    最近更新 更多