坑暗花明:又遇 .NET Core 中 System.Data.SqlClient 查询缓慢的问题

  • 时间:
  • 浏览:21
  • 来源:大发快三_快三新平台_大发快三新平台

完后 发布过一篇博文 下单快发货慢:有有三个 JOIN SQL 引起 SqlClient 读取数据慢的奇特什么的问題,当时遇到的什么的问題是从 SQL Server 60 8 R2 中查询获取 60 条记录竟然耗时 10 多秒,排查中发现什么的问題与 SQL  查询饱含有 INNER JOIN 有关,打上去 INNER JOIN 立马查询太快 了 。当时天真地以为原困分析是 JOIN 的那张表数据记录不多以及主表聚集索引不合理,于是采用将 INNER JOIN 主次拆分出来单独查询临时处里了什么的问題。

这4天 当我们都都 又在另外有有三个 ASP.NET Core 2.2 项目中也遇到了查询 60 数据库记录传输传输速率慢(时要4~6秒)的什么的问題,后能 所查询的数据库表数据量并时要很大。通过 EF Core 的 日志记录发现耗时发生在 Executed DbCommand 时,耗时发生点与完后 的情况表不一样,完后 是发生在 Executed DbCommand 完后  SqlDataReader 从数据库读取数据时。

2019-05-11T14:21:38.1015229+08:00 [INFORMATION] Executed DbCommand ("5,860

"ms)

而通过 SQL Server Management Studio 执行同样的 SQL 句子只时要 20 毫秒左右,相差60 多倍。

Executed DbCommand 日志记录的是 dbCommand.ExecuteReaderAsync 执行的时间(详见 EF Core 的源码)

result = new RelationalDataReader(
    connection,
    dbCommand,
    await dbCommand.ExecuteReaderAsync(cancellationToken),
    commandId,
    Logger);

dbCommand.ExecuteReaderAsync 的实现代码在 corefx 的 System.Data.SqlClient 中,将会是 .net core 的什么的问題,那什么的问題就出在 System.Data.SqlClient 。

在上次排查 SqlDataReader 读取数据传输传输速率慢什么的问題,就曾怀疑 System.Data.SqlClient ,花了一些时间在 System.Data.SqlClient 的源码中打点排查,最终没有找到线索,这次不敢轻易怀疑它。

随便说说这次的耗时发生点与上次不一样,但这次的 SQL 查询句子饱含个地方和上次是一样的,也饱含 INNER JOIN 查询,于是试着打上去 INNER JOIN ,Executed DbCommand 只需2毫秒。

[INFORMATION] Executed DbCommand ("2"ms)

啊,为社 在么在也与 INNER JOIN 有关,没道理啊,这次 JOIN 的表数据量不大,完正不将会造成 60 多倍的性能之差。看来上次归罪于 INNER JOIN ,将会是冤枉它了,得重新思考与排查这俩什么的问題。

将会什么的问題是在某个时间点完后 出现,于是采取笨土办法,回退 git 提交历史直至什么的问題消失。。。

最终发现,竟然是在一次 git commit 中给这俩查询在 SELECT 时增加了有有三个 字段引起的, 打上去这俩字段,什么的问題立马消失。进一步测试发现,只要任意打上去 SELECT 中的有有三个 字段,就不多再出现什么的问題,太奇怪了。数了数 SELECT 饱含20个字段,难道与 SELECT 字段的数量有关?完后 的项目会不多再也与 SELECT 字段的数量有关?

于是回到完后 的项目,恢复 INNER JOIN 查询,这时惊讶地发现 SqlDataReader 读取数据传输传输速率慢的什么的问題竟然消失了。回想当时处里什么的问題后到现在所做的变更,唯一的变更后能 从 .NET Core 3.0 Preivew 4 升级到 .NET Core 3.0 Preivew 5 ,难道 3.0 Preivew 5 把这俩什么的问題给修复了?难道真的是 System.Data.SqlClient 的 bug ?

答案很容易验证,将当前遇到 Executed DbCommand 执行慢的项目升级到 .NET Core 3.0 Preivew 5 ,昨天晚上完成升级后

Executed DbCommand ("3"ms)

飞流直下三千尺,从4秒骤降到3毫秒,相差60 0多倍!你造是 System.Data.SqlClient 的有有三个 大 bug ,有有三个 潜藏后能 (要花费从 .NET Core 2.1 到 3.0 Preview 4)的巨坑。

这俩诡异什么的问題的谜底在偶然间终于被解开了,这时又产生了新的什么的问題 —— corefx 中是怎么修复这俩巨坑 bug 的?

查看 corefx 中与 System.Data.SqlClient 相关的 git commits ,目测发现下面的 commit (对应的 PR ),是我不好是这俩 commit 修复的,接下来找时间验证一下。