SQL SERVER 错误:查询处理器用尽了内部资源,无法生成查询计划。这种情况很少出现,只有在查询极其复杂或引用了大量表或分区时才会出现。请简化查询。如果您认为该消息的出现纯属错误,请与客户支持服务部门联系,了解详细信息。
排除错误外,基本就是查询语句确实消耗了过多的资源
这次遇到这个错误是因为在 where 语句中 in 了过多的数据(大概 10000+)
需要调整一下查询逻辑了
根据不同的业务逻辑可能有不同的调整方式,这里介绍一个用了感觉还比较有效的方法
就是在查询过程中将需要 in 查询的所有数据插入临时表,然后通过 join 临时表或子查询的方式来达到同样的效果
如果是用 ef + linq 查询的话,可能需要在数据库中创建一个固定的临时表,通过构建一个查询批次 id 来应对并发
CREATE TABLE [dbo].[temp_table]( [QueryId] [uniqueidentifier] NOT NULL, [DataId] [bigint] NOT NULL )
在代码中,通过批量插入来提高效率
private static Guid SetTempTable(IEnumerable<long> dataIds) { var temp_table = new DataTable("temp_table"); temp_table.Columns.Add("QueryId", typeof(Guid)); temp_table.Columns.Add("DataId", typeof(long)); var queryId = Guid.NewGuid(); foreach (var recordId in dataIds) { temp_table.Rows.Add(queryId, recordId); } SqlHelper.BulkCopyDataTable(temp_table, temp_table.TableName); return queryId; }
使用 join 查询
var query = from user in user_table join id in temp_table on user.UserId equals id.DataId select user
使用完成后直接批量删除
private static void ClearTempTable(Guid queryId) { SqlHelper.ExecuteNonQuery("DELETE FROM temp_table WHERE QueryId = @QueryId", new SqlParameter("@QueryId", queryId)); }
除了对已经查不出来的 in 条件外,对能查出来的查询速度提升也很明显~
参考:https://stackoverflow.com/questions/16360236/ef-query-where-list-contains-a-lot-of-elements
输了你,赢了世界又如何...
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!