大发快三_快三规则_大发快三规则 - 大发快三,快三规则,大发快三规则精选头条好文,分享实用生活小技巧,达人购物经验,包括科技、手机、数码、娱乐、美容、母婴、旅行、居家等内容,打造优质阅读体验。

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

  • 时间:
  • 浏览:0

前一天发布过一篇博文 下单快发货慢:一一一个 JOIN SQL 引起 SqlClient 读取数据慢的奇特现象图片,当时遇到的现象图片是从 SQL Server 2008 R2 中查询获取 200 条记录竟然耗时 10 多秒,排查中发现现象图片与 SQL  查询暗中含 INNER JOIN 有关,再加 INNER JOIN 立马查询太快。当时天真地以为因为是 JOIN 的那张表数据记录不必 以及主表聚集索引不合理,于是采用将 INNER JOIN 偏离 拆分出来单独查询临时处理了现象图片。

这三天亲戚亲戚我们歌词 都歌词 歌词 又在另外一一一个 ASP.NET Core 2.2 项目中也遇到了查询 200 数据库记录数率慢(必须4~6秒)的现象图片,但会 所查询的数据库表数据量并完整篇 也有很大。通过 EF Core 的 日志记录发现耗时居于在 Executed DbCommand 时,耗时居于点与前一天的情况报告不一样,前一天是居于在 Executed DbCommand 前一天 SqlDataReader 从数据库读取数据时。

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

而通过 SQL Server Management Studio 执行同样的 SQL 语句只必须 20 毫秒左右,相差200多倍。

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 的表数据量不大,完整篇 不因为着造成 200 多倍的性能之差。看来上次归罪于 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毫秒,相差2000多倍!果果真 System.Data.SqlClient 的一一一个大 bug ,一一一个潜藏随后(要花费从 .NET Core 2.1 到 3.0 Preview 4)的巨坑。

三种诡异现象图片的谜底在偶然间终于被解开了,这时又产生了新的现象图片 —— corefx 中是咋样修复三种巨坑 bug 的?

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