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

  • 时间:
  • 浏览:0
  • 来源:五分时时彩_五分时时彩正规平台_五分时时彩平台网址

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

这二天大家又在另外三个 多 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 修复的,接下来找时间验证一下。