针对特定 EF Core 查询优化未知

2024-04-17

我有一个使用 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 分钟。

所以现在我想实现OPTION (OPTIMIZE FOR UNKNOWN)在 EF Core 中。我发现他们添加了一个DbCommandInterceptor在 EF Core 3.1 中,您可以在哪里将内容附加到查询中:MSDOCS https://learn.microsoft.com/en-us/ef/core/what-is-new/ef-core-3.x/#interception-of-database-operations

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,但这似乎不是一个可靠的解决方案。 有谁知道我如何以正确的方式实现这一点?


我创建了一个界面:

public interface IInterceptable
{
    bool EnableCommandInterceptors { get; set; }
}

并在我的上下文类中实现它:

public bool EnableCommandInterceptors { get; set; }

在拦截器中我有:

public override InterceptionResult<DbDataReader> ReaderExecuting(DbCommand command, CommandEventData eventData, InterceptionResult<DbDataReader> result)
{
    if(command.CommandText.StartsWith("SELECT") 
        && eventData.Context is IInterceptable intercepatable
        && intercepatable.EnableCommandInterceptors)
    {
        command.CommandText += " OPTION (OPTIMIZE FOR UNKNOWN)";
    }
    return result;
}

这允许打开和关闭此功能,如果此特定查询是上下文实例将运行的唯一查询,这可能就足够了。如果没有,您可以向该部分添加更多条件if(command.CommandText.StartsWith("SELECT").

另一种方法是将特定查询标记为.TagWith https://learn.microsoft.com/en-us/dotnet/api/microsoft.entityframeworkcore.entityframeworkqueryableextensions.tagwith?view=efcore-3.1并在拦截器中查找标签文本:

if (command.CommandText.StartsWith("SELECT") 
        && command.CommandText.Contains("my tagged text"))
{
    command.CommandText += " OPTION (OPTIMIZE FOR UNKNOWN)";
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

针对特定 EF Core 查询优化未知 的相关文章

  • 添加对共享类的多个 WCF 服务的服务引用

    我正在尝试将我的 WCF Web 服务拆分为几个服务 而不是一个巨大的服务 但是 Visual Studio Silverlight 客户端 复制了两个服务共享的公共类 这是一个简单的例子来说明我的问题 在此示例中 有两个服务 两者都返回类
  • 在 C++ 中分割大文件

    我正在尝试编写一个程序 该程序接受一个大文件 任何类型 并将其分成许多较小的 块 我想我已经有了基本的想法 但由于某种原因我无法创建超过 12 kb 的块大小 我知道谷歌等上有一些解决方案 但我更感兴趣的是了解这个限制的根源是什么 然后实际
  • 如何进行带有偏差的浮点舍入(始终向上或向下舍入)?

    我想以偏置舍入浮动 要么总是向下 要么总是向上 代码中有一个特定的点 我需要这个 程序的其余部分应该像往常一样四舍五入到最接近的值 例如 我想四舍五入到最接近的 1 10 倍数 最接近 7 10 的浮点数约为 0 69999998807 但
  • 使用实体框架从集合中删除项目

    我正在使用DDD 我有一个 Product 类 它是一个聚合根 public class Product IAggregateRoot public virtual ICollection
  • 在 C++11 中省略返回类型

    我最近发现自己在 C 11 模式下的 gcc 4 5 中使用了以下宏 define RETURN x gt decltype x return x 并编写这样的函数 template
  • VS30063:您无权访问 https://dev.azure.com

    我正在尝试在 asp net core 2 1 mvc 应用程序中使用以下代码连接 Azure DevOps Uri orgUrl new Uri https dev azure com xxxxx String personalAcces
  • 在 C# 中将位从 ulong 复制到 long

    所以看来 NET 性能计数器类型 http msdn microsoft com en us library system diagnostics performancecounter aspx有一个恼人的问题 它暴露了long对于计数器
  • 为什么 std::allocator 在 C++17 中丢失成员类型/函数?

    一边看着std 分配器 http en cppreference com w cpp memory allocator 我看到成员 value type pointer const pointer reference const refer
  • 事件日志写入错误

    很简单 我想向事件日志写入一些内容 protected override void OnStop TODO Add code here to perform any tear down necessary to stop your serv
  • 组合框项目为空但数据源已满

    将列表绑定到组合框后 其 dataSource Count 为 5 但组合框项目计数为 0 怎么会这样 我习惯了 Web 编程 而且这是在 Windows 窗体中进行的 所以不行combo DataBind 方法存在 这里的问题是 我试图以
  • C# 编译器如何决定发出可重定向的程序集引用?

    NET Compact Framework 引入了可重定向程序集引用 现在用于支持可移植类库 基本上 编译器会发出以下 MSIL assembly extern retargetable mscorlib publickeytoken 7C
  • “MyClass”的类型初始值设定项引发异常

    以下是我的Windows服务代码 当我调试代码时 我收到错误 异常 CSMessageUtility CSDetails 的类型初始值设定项引发异常 using System using System Collections Generic
  • std::bind 重载解析

    下面的代码工作正常 include
  • C# using 语句、SQL 和 SqlConnection

    使用 using 语句 C SQL 可以吗 private static void CreateCommand string queryString string connectionString using SqlConnection c
  • 过期时自动重新填充缓存

    我当前缓存方法调用的结果 缓存代码遵循标准模式 如果存在 则使用缓存中的项目 否则计算结果 在返回之前将其缓存以供将来调用 我想保护客户端代码免受缓存未命中的影响 例如 当项目过期时 我正在考虑生成一个线程来等待缓存对象的生命周期 然后运行
  • gdb查找行号的内存地址

    假设我已将 gdb 附加到一个进程 并且在其内存布局中有一个文件和行号 我想要其内存地址 如何获取文件x中第n行的内存地址 这是在 Linux x86 上 gdb info line test c 56 Line 56 of test c
  • 内核开发和 C++ [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 从我know https stackoverflow com questions 580292 what languages are windo
  • 如何查明CONFIG_FANOTIFY_ACCESS_PERMISSIONS是否启用?

    我想利用fanotify 7 http man7 org linux man pages man7 fanotify 7 html我遇到的问题是在某些内核上CONFIG FANOTIFY ACCESS PERMISSIONS不起作用 虽然C
  • Azure函数版本2.0-应用程序blobTrigger不工作

    我有一个工作功能应用程序 它有一个 blob 输入和一个事件中心输出 在测试版中工作 随着最新的更改 我的功能不再起作用 我尝试根据发行说明更新 host json 文件 但它没有引用 blob 触发器 version 2 0 extens
  • WPF/数据集:如何通过 XAML 将相关表中的数据绑定到数据网格列中?

    我正在使用 WPF DataSet 连接到 SQL Server Express XAML 和 C Visual Studio 2013 Express 我从名为 BankNoteBook 的现有 SQL Server Express 数据

随机推荐

  • 为什么服务器控件在放置在内容标记内时会带有下划线?

    我有一个网络内容表单 其中包含Div以及各种服务器控件 例如DropDownList 当我运行该应用程序时 它运行良好 没有任何错误 但当我查看 HTML 源代码时 服务器控件带有红色下划线 将鼠标移过来时 说 DropDownList 会
  • Visual C# 2010 Express:为新类指定默认访问修饰符?

    每当我使用 Visual Studio 2010 Express C 创建新类时 它都会创建不带访问修饰符的新类 十分之九我希望我的新课程公开 如何让 Visual Studio 默认创建带有 public 修饰符的空类模板 诀窍是创建一个
  • 删除 numpy 数组的重复行[重复]

    这个问题在这里已经有答案了 如何删除二维的重复行numpy array data np array 1 8 3 3 4 1 8 9 9 4 1 8 3 3 4 答案应该如下 ans array 1 8 3 3 4 1 8 9 9 4 如果有
  • HSQLDB服务器模式用户名/密码

    如果我使用 Java 代码在服务器模式下启动 HSQLDB 则服务器启动不会出现任何问题 但是 当我尝试通过 Java 代码或通过 HSQLDB DatabaseManagerSwing 连接到相同的数据库时 我无法连接 我在仅内存模式下使
  • 通过API服务端点消费来自Kafka主题的消息

    目前 我有一个 API 服务端点 用 netcore6 C 编写 它将接受消息对象并将其保存到数据库 然后将该消息发布到 kafka topic 2 如何利用我的 API 服务端点始终监听 观看并连接到 kafka topic 1 一旦新消
  • 为什么`从. importviews`可以解决Flask中的循环导入吗? [复制]

    这个问题在这里已经有答案了 我从中学习更大的应用 http flask pocoo org docs 0 10 patterns packages 在这个文档中 它说 所有视图函数 顶部带有route 装饰器的函数 都必须导入到init p
  • NAudio - 更改缓冲麦克风音频的音高并发送到虚拟音频线

    我决定尝试使用 NAudio 和虚拟音频线创建一个与 Discord 或类似软件 一起使用的音板 我能够将音频从麦克风 注入 到音频电缆 这样我就可以通过选择虚拟音频电缆作为 Discord 中的输入设备来播放声音文件和麦克风音频到 Dis
  • 在类中初始化 static struct tm

    我想使用 tm 结构作为类中的静态变量 花了一整天的时间阅读和尝试 但它仍然无法工作 如果有人能指出我做错了什么 我将不胜感激 在我的课堂上 在公共下 我将其声明为 static struct tm dataTime 在main cpp中
  • ObservableCollection CollectionChanged 事件

    我有一个可观察的集合 并且在其上连接了一个 collectionChanged 事件 我将其项目绑定到用户界面中的列表框 当用户从列表框中删除 UI 中的某些项目时 CollectioChanged 会正确触发 但是 我需要知道已删除项目的
  • Android:使用 Admob 的 Consent SDK 获取用户位置

    我对 AdMob 的新功能有疑问 同意 SDK https developers google com admob android eu consent consent sdk the 整合指南 https developers googl
  • 相机框架相对于基准点的世界坐标

    我正在尝试确定世界坐标中的相机位置 相对于基于场景中找到的基准标记的基准位置 我确定 viewMatrix 的方法如下所述 确定相机姿势 https stackoverflow com questions 28335954 determin
  • 如何配置 Magento Enterprise 使用 Solr 作为主要搜索引擎?

    我尝试寻找文档 但它非常稀疏 我编写了以下指南 希望它可以帮助人们节省 2 3 个小时的安装 设置和配置时间 与 MySQL 全文搜索标准设置相比 使用 Solr 带来的性能提升非常惊人 在您的 Magento 安装中让它工作绝对值得花时间
  • 如何使用终端/cmd编译java项目

    我厌倦了使用 Eclipse 因为它太 简单 和 老式 所以我转向了一个名为 Sublime Text 3 的程序 并使用了一个名为 material theme 的包 这使得该程序看起来平坦且一切都很好 但我想用它来编写 Java 代码
  • 当我降级到 1.7 后执行 java -version 时,我仍然看到 Java 1.8

    我从 1 8 降级了 java 1 7 但降级时仍然看到 1 8java version 我改变了path并且还做了JAVA HOME1 7 更改为 JAVA HOME C Program Files x86 Java jdk1 7 0 7
  • 在 Sproutcore 2 中编写自定义控件

    我对 Sproutcore 相当陌生 但对 Handlebars 很熟悉 我已经浏览了 Todo 教程并查看了其他一些示例 我喜欢它的一切 并且想在 Backbone 上使用它 但我很难理解如何连接自定义控件 我可以看到一些数据将在绑定中发
  • 使用 BeanUtils 检索字段值

    我想提取未由某些自定义注释标记的私有字段值 这可以通过 BeanUtils 实现吗 如果是 怎么办 是的 假设您知道字段名称 您可以使用PropertyUtils getSimpleProperty http commons apache
  • “git stash”是否在内部“提交”到我的本地存储库?

    我以前只手动commit之前到我的本地仓库pushing 到远程仓库 但更多时候我pull获取我的编码伙伴的更改 有时我们都处理同一个文件并且存在冲突 在这些情况下 他告诉我要做一个git stash在我之前git pull然后一个git
  • 如何在没有 root 权限的情况下安装 python 3.x 和 2.y

    我正在一台没有root权限的共享机器上工作 但安装了Python 2 y 但我想要两种风格的Python 而且我想调用Python 2 y 只需键入 python 像往常一样 并为调用 Python 3 x 输入 python3 我知道这是
  • 如何使mat-select始终在angular2中的表单字段下打开?

    我需要角度材料垫选择组件在其表单字段的正下方打开 但它会打开所选选项位置上的下拉菜单 并且容器会根据所选选项稍微移动到顶部 有没有办法打开表单字段正下方的下拉容器 该行为是由 Material Design 规定的 您可以使用以下命令关闭所
  • 针对特定 EF Core 查询优化未知

    我有一个使用 EF Core 3 1 在 NET Framework 上运行的 webjob 项目 Webjob 处理来自 Azure 服务总线的消息并将其保存到 Azure SQL 数据库中 我遇到的问题是 Azure SQL 数据库为