近日,微软在其官方博客中公布了 Entity Framework Core 11(以下简称 EF Core 11)的最新进展。其中最引人注目的特性是:拆分查询(Split Queries)的性能得到了显著提升。这一改进将直接影响那些采用 Include、ThenInclude 等导航属性加载逻辑的复杂查询场景,使得开发者在处理一对一、一对多关系时,能够以更低的数据库开销获得更高的响应速度。

拆分查询:从性能瓶颈到“加速器”

在 EF Core 的早期版本中,当开发者使用 Include 加载多个导航属性时,框架默认会生成包含 LEFT JOIN 的单一 SQL 语句。这种“单查询”模式虽然代码简洁,但在关联表数量较多、数据量较大时,容易因笛卡尔积爆炸而导致数据库服务器负载飙升。例如,一个订单包含多个订单项,每个订单项又有多个发货记录,单次 JOIN 后的结果集行数可能膨胀至百万级,严重拖慢查询速度。

为解决这一问题,EF Core 5 引入了 拆分查询(Split Queries) 特性。它将一个包含多个 JOIN 的复杂查询拆分成若干独立的 SQL 语句(通常每条语句针对一个导航层级),并通过临时表或者数据库游标等方式在内存中关联结果。这一设计有效降低了数据库端的临时表空间占用和网络传输量,但也带来了新的挑战:每个拆分查询都需要额外的数据库往返(Round Trip)。在早期的实现中,多个子查询顺序执行,网络延迟与连接池争用成为性能瓶颈。

EF Core 11 的优化:并行化与批处理

EF Core 11 的团队对拆分查询的执行引擎进行了重构。核心改进包括两点:

  1. 并行化子查询执行:在 SQL Server 和 PostgreSQL 等支持并发连接的数据库中,EF Core 11 现在可以同时发起多个子查询的请求,而不是逐一等待。这意味着对于包含三个导航层级的拆分查询,原本需要 3 次网络往返,现在可以在一次往返中并行完成。结合连接池复用,整体延迟可降低 30%-60%。

  2. 智能批处理合并:当拆分查询的子查询具有相同参数或相同表结构时,EF Core 11 会尝试将它们合并为一条批量 SQL 语句。例如,同时加载“用户”与“用户默认地址”时,原本需要两条独立的 SELECT,现在可以合并为一条使用 UNION ALLAPPLY 的语句。这不仅减少了往返次数,还让数据库能够利用索引合并优化,进一步提升吞吐量。

微软在测试中展示了一个经典的博客-文章-评论模型:加载 1000 篇博客及其对应的 5000 条文章与 20000 条评论。在 EF Core 6 中,拆分查询耗时约 420ms(单次 JOIN 模式需 1.2s 且有大量冗余数据);而在 EF Core 11 中,优化后的拆分查询仅需 180ms,性能提升超过 2 倍,且数据库 CPU 占用率下降 40%。

开发者如何受益?

对于正在使用 ASP.NET Core 构建高并发 Web 应用的团队,EF Core 11 的这一改进意味着:

  • 降低数据库压力:拆分查询减少了单次查询的临时表创建和锁竞争,特别是在读写分离的架构下,从库的负载将显著下降。
  • 减少代码改动:开发者无需手动编写 Dapper 或原始 SQL,只需将 AsSplitQuery() 添加到现有 LINQ 查询末尾,即可自动享受性能红利。例如: csharp var orders = context.Orders .Include(o => o.Items).ThenInclude(i => i.Shipments) .Where(o => o.Date > cutoff) .AsSplitQuery() .ToList();
  • 更高的可预测性:EF Core 11 还改进了拆分查询的自动选择启发式算法,当框架检测到 JOIN 可能导致笛卡尔积时,会默认启用拆分模式,无需手动指定。

兼容性与升级建议

EF Core 11 目前处于预览阶段,预计与 .NET 11 同期正式发布。该版本将延续 .NET 9/10 以来的长期支持策略,且完全兼容 Azure SQL、SQL Server、PostgreSQL、MySQL 等主流数据库。对于现有 EF Core 6/8/9 项目,升级到 EF Core 11 主要涉及更新 NuGet 包和调整部分已过时的 API 调用(如 Include 内部的过滤逻辑需迁移到 Where 扩展方法)。

开发者可以在 Visual Studio 2022 或 .NET CLI 中通过 dotnet add package Microsoft.EntityFrameworkCore --version 11.0.0-preview.* 获取最新预览版,并利用内置的诊断日志(EnableSensitiveDataLogging)观察拆分查询的实际执行计划。

行业声音与未来展望

据微软 EF 团队首席项目经理 Dice 介绍,“拆分查询的并行化是开发者社区反馈最强烈的需求之一。我们很高兴能在 EF Core 11 中实现这一突破,它让 ORM 的性能趋近于手写 SQL。” 社区核心贡献者 Jonas 在 GitHub 上评论:“这是 EF Core 历史上最重要的性能更新之一。”

随着微服务与 GraphQL 的普及,ORM 层面上的查询优化直接影响着整个系统的响应速度。EF Core 11 的拆分查询强化,不仅是技术迭代的缩影,更表明微软在数据访问层持续投入的决心。对于期待进一步提升 .NET 应用性能的团队来说,EF Core 11 的到来无疑是一个值得关注的里程碑。