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

  • 时间:
  • 浏览:0
  • 来源:大发时时彩官网_去哪玩大发时时彩_哪里可以玩大发时时彩

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

这4天 让我们都都儿又在另外一个多 ASP.NET Core 2.2 项目中也遇到了查询 100 数据库记录传输带宽慢(时要4~6秒)的什么的什么的问题 ,或者 所查询的数据库表数据量并也有 很大。通过 EF Core 的 日志记录发现耗时趋于稳定在 Executed DbCommand 时,耗时趋于稳定点与后后的情况汇报不一样,后后是趋于稳定在 Executed DbCommand 后后 SqlDataReader 从数据库读取数据时。

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

而通过 SQL Server Management Studio 执行同样的 SQL 搞笑的话只时要 20 毫秒左右,相差100多倍。

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 的表数据量不大,完整性可能性性造成 100 多倍的性能之差。看来上次归罪于 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毫秒,相差100多倍!岂也有 是 System.Data.SqlClient 的一个多大 bug ,一个多潜藏之后(大约从 .NET Core 2.1 到 3.0 Preview 4)的巨坑。

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

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