极速快3_快3app赚钱_极速快3app赚钱

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

时间:2020-02-08 11:22:34 出处:极速快3_快3app赚钱_极速快3app赚钱

要我发布过一篇博文 下单快发货慢:另另另俩个 JOIN SQL 引起 SqlClient 读取数据慢的奇特问提图片,当时遇到的问提图片是从 SQL Server 1508 R2 中查询获取 1150 条记录竟然耗时 10 多秒,排查中发现问提图片与 SQL  查询中涵盖 INNER JOIN 有关,加进 INNER JOIN 立马查询比较慢。当时天真地以为意味是 JOIN 的那张表数据记录不多以及主表聚集索引不合理,于是采用将 INNER JOIN 次责拆分出来单独查询临时外理了问提图片。

这半年大伙儿又在另外另另另俩个 ASP.NET Core 2.2 项目中也遇到了查询 1150 数据库记录传输速度慢(可以4~6秒)的问提图片,要我所查询的数据库表数据量并都不 很大。通过 EF Core 的 日志记录发现耗时存在在 Executed DbCommand 时,耗时存在点与要我的请况不一样,要我是存在在 Executed DbCommand 要我 SqlDataReader 从数据库读取数据时。

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

而通过 SQL Server Management Studio 执行同样的 SQL 一句话只可以 20 毫秒左右,相差150多倍。

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 的表数据量不大,全版不用我造成 150 多倍的性能之差。看来上次归罪于 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毫秒,相差11150多倍!大伙儿说是 System.Data.SqlClient 的另另另俩个大 bug ,另另另俩个潜藏要我(相当于从 .NET Core 2.1 到 3.0 Preview 4)的巨坑。

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

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

热门

热门标签