如何解决HangFire导致的SQL异常「查询处理器因查询提示无法生成执行计划」
根因说明
你遇到的报错是Hangfire.SqlServer 1.7.x版本默认给查询加了FORCESEEK提示导致的:当查询涉及的表没有匹配的非聚集索引支持索引查找时,SQL Server无法生成符合提示要求的执行计划,就会抛出该异常。
可行解决方案
方案1:SQL Server侧创建适配索引(无需改动应用代码,推荐)
只要给涉及的HangFire表创建匹配查询条件的覆盖索引,就能让FORCESEEK提示正常生效,同时还能提升仪表盘查询性能,执行以下SQL即可:
-- 适配Job表的StateName查询 CREATE NONCLUSTERED INDEX IX_Job_StateName ON HangFire.Job (StateName) INCLUDE (Id); -- 适配Counter表的Key查询 CREATE NONCLUSTERED INDEX IX_Counter_Key ON HangFire.Counter ([Key]) INCLUDE ([Value]); -- 适配AggregatedCounter表的Key查询 CREATE NONCLUSTERED INDEX IX_AggregatedCounter_Key ON HangFire.AggregatedCounter ([Key]) INCLUDE ([Value]); -- 适配Set表的Key查询 CREATE NONCLUSTERED INDEX IX_Set_Key ON HangFire.[Set] ([Key]);
方案2:通过Hangfire内置配置关闭FORCESEEK提示(无需改源码)
Hangfire 1.7.12本身已经提供了关闭查询提示的配置项,你只需要修改服务注册代码即可:
services.AddHangfire(config => config.UseSqlServerStorage( "你的数据库连接字符串", new SqlServerStorageOptions { // 关闭全局FORCESEEK提示 DisableForceSeekHint = true }));
配置生效后,Hangfire生成的所有SQL都会自动去掉FORCESEEK提示,和你手动修改SQL的效果完全一致。
方案3:升级Hangfire版本
如果可以升级依赖包,直接升级到Hangfire 1.8.x及以上版本即可,官方已经优化了FORCESEEK提示的使用逻辑,会自动判断场景是否适用,不会再触发该类报错。
环境适配说明
以上三个方案都完全适配你当前的运行环境:
- 操作系统:Windows Server 2019
- 运行时:.NET Core 3.1
- Hangfire版本:1.7.12
内容的提问来源于stack exchange,提问作者Nathi
相关产品推荐
相关产品推荐

