EF 6 参数嗅探

2024-01-08

我有一个动态查询太大,无法放在这里。可以肯定地说,在其当前形式中,它利用 CLR 过程根据传递的搜索参数数量动态构建联接,然后获取该结果并将其联接到更详细的表中,以带回对最终用户重要的属性。我已将整个查询转换为 LINQ to Entities,我发现它生成的 SQL 足以高效地完成这项工作,但是通过 EF 6 运行时,查询会超时。获取生成的 SQL 并在 SSMS 中运行它只需 3 秒或更短的时间。我只能想象我的问题是参数嗅探。我已尝试更新数据库中每个表的统计信息,但这并没有解决问题。

我的问题是:

我可以通过 EF 以某种方式嵌入“OPTION RECOMPILE”等选项吗?


可以使用 EF6 的拦截功能来操作其内部 SQL 命令,然后再在数据库上执行它们,例如添加option(recompile)在命令末尾:

public class OptionRecompileHintDbCommandInterceptor : IDbCommandInterceptor
{
    public void NonQueryExecuting(DbCommand command, DbCommandInterceptionContext<Int32> interceptionContext)
    {
    }

    public void NonQueryExecuted(DbCommand command, DbCommandInterceptionContext<int> interceptionContext)
    {
    }

    public void ReaderExecuted(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext)
    {
    }

    public void ReaderExecuting(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext)
    {
        addQueryHint(command);
    }

    public void ScalarExecuted(DbCommand command, DbCommandInterceptionContext<object> interceptionContext)
    {
    }

    public void ScalarExecuting(DbCommand command, DbCommandInterceptionContext<object> interceptionContext)
    {
        addQueryHint(command);
    }

    private static void addQueryHint(IDbCommand command)
    {
        if (command.CommandType != CommandType.Text || !(command is SqlCommand))
            return;

        if (command.CommandText.StartsWith("select", StringComparison.OrdinalIgnoreCase) && !command.CommandText.Contains("option(recompile)"))
        {
            command.CommandText = command.CommandText + " option(recompile)";
        }
    }
}

要使用它,请在应用程序的开头添加以下行:

DbInterception.Add(new OptionRecompileHintDbCommandInterceptor());
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

EF 6 参数嗅探 的相关文章

随机推荐

  • Gson自定义反序列化

    我正在使用 Gson 创建和解析 JSON 但我遇到了一个问题 在我的代码中我使用这个字段 Expose private ArrayList
  • 关闭 PDO 语句

    我最近决定从 MySQLi 跳到 PDO 但有一些关于 PDO 准备好的语句的问题困扰着我 在 MySQLi 中 我会编写一个典型的获取查询 如下所示 db new mysqli localhost user pass mydb sql S
  • getBoundingClientRect() 在 XUL 中返回零

    我的 Firefox 扩展有问题 我有一个 XUL 弹出面板 其中包含用于标签云的 hbox 以及用于将 div 添加到此 hbox 的 JS 代码
  • BigQuery 日期分区视图

    BigQuery 允许您创建日期分区表 https cloud google com bigquery docs creating partitioned tables https cloud google com bigquery doc
  • 在 Google 地图中使用 3D

    我想创建一个 web 应用程序 我可以在其中显示我自己的 geotiffs NDVI 和其他数据层以及 3D 几何图形 提供 2D 图块和纹理 3D 形状的无缝渲染 就像maps google com 在中实现的那样从 地图 视图切换到 地
  • 验证失败时重新填充单选按钮

    我有一个从数据库中提取数据的表单 如果它是一个输入框 代码可以正常工作 但我无法获取单选按钮的最新 POST 数据 这适用于输入文本框 我在第一次加载时获得从数据库中提取的默认值 并且我可以从用户在验证失败时修改输入框获得新的输入 如果有
  • 如何使用SAX PARSER解析android中的html内容

    xml中有描述标签 它包含 html 标签 我在android中使用SAX解析器来解析 但是 当它从描述标签获取数据时 它不会获取 html 内容 也不会获取任何标签 那么我如何解决使用 SAX 解析器从 XML 解析 html 内容的问题
  • 当相机之间的角度太大时,OpenCV 立体图像校正无法正常工作

    我想收集位于两个摄像机焦点处的身体的高度数据 这就是我的立体声设置的样子 当我使用标准 cv2 函数计算图像的校正版本时 它看起来非常糟糕 当我对相机并行使用类似的设置时 它起作用了 我计算了外线 它们似乎是正确的 However the
  • 需要帮助重写 WPF 按钮样式背景颜色。

    我为自定义按钮设置了以下代码 但我想更改单个按钮的背景
  • Phonegap/ios7 - 重新加载时未触发 deviceready 事件

    我们的 Phonegap 混合应用程序在首次加载时工作正常 在这种情况下 很明显 deviceready 事件正确触发并且应用程序启动 没有问题 我们需要在某个时候重新加载应用程序 我们只需对index html 主应用程序html 文件
  • 在容器创建时设置docker镜像用户名?

    我有一个 OpenSuse 42 3 docker 映像 已将其配置为运行代码 该映像有一个名为 myuser 的用户 root 除外 该用户是我在初始映像生成过程中通过 Dockerfile 创建的 我有三个脚本文件 它们根据用户所在的操
  • jquery循环遍历json

    您好 我正在尝试循环遍历 json 文件 如下所示 each data playlists playlist function i item contentC append p item id p contentC append p ite
  • React .setState() 中的展开运算符

    给出从 React 类组件中提取的以下代码片段 constructor props super props this state active true deactivate gt this setState this state acti
  • bat 文件脚本检查字符串是否包含其他字符串

    我需要编写一个批处理文件来检查变量是否包含特定值 我尝试执行以下操作 If a a pattern echo Yes else echo No 输入示例 a 鲍勃 宾森 pattern 宾森 我从来没有打印过 是 谁能告诉我我错过了什么 或
  • 有效计算笛卡尔积中总和高于特定数字的集合

    我有以下可以运行的 Python 3 代码 import itertools loops 10 results 4 2 75 2 75 1 5 1 5 1 5 0 threshold loops 2 cartesian product it
  • PHP/PDO/MSSQL如何获取错误信息?

    我做了很多搜索 但找不到任何关于我的问题的信息 我在用着PDO带司机PDO DBLIB访问 MS SQL 数据库 我通常使用准备好的语句 但如果任何查询失败 我不会获得有关该错误的任何其他信息 除了 General SQL Server e
  • MySQL SELECT INTO 等效吗?

    在 SQL Server 中 我可以使用以下命令将表或临时表复制到新表 SELECT INTO syntax 有人知道如何在 MySQL 中执行相同的操作吗 See 创建表 作为选择 http dev mysql com doc refma
  • 按行数设置 TableView 高度

    我有TableView in the MainstoryBoard并且行数每次都是随机的 我想要整体的高度TableView灵活 我的意思是 例如 如果我有 4 行TableView和每个TableView行高是 22 所以TableVie
  • 为什么 JSON.parse 会抛出跨域错误?

    如果没有 JSON parse 以下代码可以正常工作 如果我尝试解析或字符串化我的数据对象 我会收到跨源错误 为什么会发生这种情况以及如何解决它 我在 Title js 中有以下代码 const name show title JSON p
  • EF 6 参数嗅探

    我有一个动态查询太大 无法放在这里 可以肯定地说 在其当前形式中 它利用 CLR 过程根据传递的搜索参数数量动态构建联接 然后获取该结果并将其联接到更详细的表中 以带回对最终用户重要的属性 我已将整个查询转换为 LINQ to Entiti