【发布时间】:2021-01-30 20:16:47
【问题描述】:
我有一个使用 EF Core 3.1 在 .NET Framework 上运行的 webjob 项目。 Webjob 处理来自 Azure 服务总线的消息并将它们保存到 Azure SQL 数据库中。
我遇到的问题是 Azure SQL 数据库为 EF Core 生成的查询生成了非常糟糕的查询计划。使用生成的查询计划,执行时间为 1-2 分钟。但是,当我使用 OPTION (OPTIMIZE FOR UNKNOWN) 时,执行时间会下降到 0.01 - 0.02 分钟。
所以现在我想在 EF Core 中实现 OPTION (OPTIMIZE FOR UNKNOWN)。我发现他们在 EF Core 3.1 中添加了一个DbCommandInterceptor,您可以在其中将内容附加到您的查询中:MSDOCS
public class HintCommandInterceptor : DbCommandInterceptor
{
public override InterceptionResult<DbDataReader> ReaderExecuting(
DbCommand command,
CommandEventData eventData,
InterceptionResult<DbDataReader> result)
{
// Manipulate the command text, etc. here...
command.CommandText += " OPTION (OPTIMIZE FOR UNKNOWN)";
return result;
}
}
但似乎这个拦截器会在每个查询上运行,我只希望它用于特定查询。 我可以为这个拦截器实现一个单独的 DbContext ,但这似乎不是一个可靠的解决方案。 有谁知道我如何以正确的方式实现这一点?
【问题讨论】:
-
首先你应该明白,如果使用这个查询提示,你更有可能使这个查询的整体性能变慢而不是变快。您目前正在测试的参数可能很快,但不适用于大多数查询。请看看这篇很棒的帖子brentozar.com/archive/2013/06/… 但无论如何,有一个非常好的方法:stackoverflow.com/a/35104542/6696265
-
我知道整体性能会更差。但平均性能可能会更好,因为大型查询不再需要 1-2 分钟。
标签: c# entity-framework entity-framework-core