【问题标题】:Can you tag generated SQL from an ORM for troubleshooting purposes?您可以标记从 ORM 生成的 SQL 以进行故障排除吗?
【发布时间】:2021-07-29 08:44:18
【问题描述】:

我们在 Web 应用程序(EF 和 LLBlGen)中大量使用 ORM,并且我们有一个 DBA 通过查找导致最多问题的查询来帮助我们提高应用程序的性能。我们有很多 linq 查询访问数据库,其中一些非常复杂。

有没有办法用 Linq 查询中的一些标识符标记生成的 SQL,这样如果 DBA 发现一些错误的 sql,我们就可以轻松找到生成它的 linq 语句。

【问题讨论】:

  • 是的,你可以使用 TagWith
  • @ErikEJ 是的,他们可以,但只有 如果 他们使用的是 EF Core 版本 X+。您似乎总是假设人们使用的是“最新最好的”,但在实际应用程序开发世界中,大多数情况下并非如此。这个问题中没有任何内容表明他们使用支持标记的 EF Core 或 EF Core 版本,所以最好先问一下。
  • 对不起,如果我冒犯了你,并同意该问题未标记为 EF Core。

标签: sql .net entity-framework llblgen


【解决方案1】:

感谢@ErikEj 为我指明了写作方向。对于 EF Core,我可以使用查询标签 https://docs.microsoft.com/en-us/ef/core/querying/tags

对于 LLBLGen,我可以使用他们为 IQueryable 提供的 MarkWithTag() 扩展方法。 https://www.llblgen.com/Documentation/5.5/LLBLGen%20Pro%20RTF/Using%20the%20generated%20code/Linq/gencode_linq_generalusage.htm#query-tagging

实体框架似乎更难,并且没有特定的方法来实现所需的结果,并且需要添加冗余的 select 或 where 子句。 How to "tag" Entity Framework Queries

【讨论】:

  • 查看我添加到您所指问题的副本。
  • @Gert Arnold 该答案在调试中有效,但在 prod 环境中,记录所有 SQL 调用可能会增加性能开销,而不是向查询中添加一段标识文本,然后可以由DBA 使用他们的工具。
  • 是的。我们的防线是将昂贵查询的记录时间与应用程序的日志数据相匹配,并查看用户当时在做什么。然后我们启动一个调试会话(在开发环境中)尝试重现查询。我必须补充一点,我们几乎不需要它。匹配这些日志通常足以立即找到查询的来源。
猜你喜欢
  • 2013-10-30
  • 2021-12-16
  • 2012-02-12
  • 1970-01-01
  • 2012-08-07
  • 2015-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多