.net 为什么AsSplitQuery对每个查询执行到DB的单独往返?

avwztpqn  于 2023-03-04  发布在  .NET
关注(0)|答案(1)|浏览(311)

我终于能够升级一个非常旧的代码库从EF 6到EF核心7,我玩一些“新”的功能。
我一直超级炒作有关拆分查询选项的渴望加载,但当阅读文档时,我被带回了这个:
每个查询当前都意味着到数据库的额外网络往返。多次网络往返可能会降低性能,尤其是在数据库延迟较高的情况下(例如,云服务)。
为什么?为什么不是在一次往返中进行多个查询?SqlDataReader可以处理带有多个结果集的查询。这阻止了我将使用存储过程的现有代码改写为EF。
除非,在连接到SQL Server时启用MARS时,这些拆分查询是并发执行的。是吗?我知道DbContext不支持并行处理,但它是否并发执行这些查询并只按顺序处理结果?
附加问题-如果在单独的往返中执行每个查询存在这种限制,是否可以仅为查询中的某些包含定义SplitQuery行为,而不是为查询中的所有包含定义它?

yzuktlbb

yzuktlbb1#

根据对github的一些讨论,如果启用了MARS,EF Core可以将其用于拆分查询(参见thisthis),但在一般情况下(因为EF Core可以用于不同的数据库),我认为文档中的next quote解释了一般情况下的行为/措辞:
虽然有些数据库允许同时使用多个查询的结果(SQL Server with MARS,Sqlite),但大多数数据库只允许一个查询在任何给定的时间点处于活动状态。因此,在执行后续查询之前,必须将之前查询的所有结果缓冲到应用程序的内存中,这会导致内存需求增加。
Shay Rojansky(EF团队成员之一)的以下评论也很有用:
众所周知,SqlClient中的MARS支持存在各种性能问题(以及其他bug),其中一些问题很严重。建议避免这些问题。

相关问题