繁体   English   中英

提高 Linq SQL 查询性能

[英]Improve Linq SQL query performance

我有以下 LINQ 查询在 100 万条记录表上运行:

var result = await lmsDb.SendGridEvents
 .Where(s => s.InternalId == internalId && s.Email.ToLower() == email.ToLower())
 .Select(s => new MailEventDTO
 {
   InternalId = s.InternalId,
   Email = s.Email,
   error = s.error,
   Event = s.Event,
   Reason = s.Reason,
   Response = s.Response,
   Url = s.Url,
   TimeStamp = s.TimeStamp
  })
  .OrderByDescending(a => a.TimeStamp) // get the latest
  .FirstOrDefaultAsync();

return result;

如何提高此查询的性能? 开始变得非常非常缓慢。

检查数据库上的排序规则设置。 如果是_CI_这将执行不区分大小写的字符串比较,因此您不需要执行显式大小写转换。 这将允许 SQL 服务器利用 Email 地址的索引。 如果是_CS_ ,则区分大小写,这将影响您的表现。 在这种情况下,预先设置变量,只需将ToLower应用于表达式中的实体值。

下一步是在您遇到性能问题的环境中(通常是在生产环境中)查看 Azure SQL 的数据库顾问。 这将为您提供数据库性能的整体视图,包括根据运行的查询类型为索引更改提供建议。

对于 SQL 服务器,我喜欢使用分析器捕获正在运行的实际查询,然后单独执行这些查询以检查正在使用的执行计划,并查找任何索引建议。 例如,在猜测此查询时,您可能需要一个关于 InternalId ASC、Email ASC 和 Timestamp DESC 组合的索引。 如果您使用_CS_排序规则,那么我怀疑 Email 最好不在索引中,但最终将索引添加/更改/删除基于顾问的建议。 在创建索引时,请查看工具的建议,因为创建错误的索引只会导致存储膨胀和性能成本,而没有任何好处。

这应该为您提供一些开始研究的初始位置。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM