Entity Framework 4.2 exec sp_executesql 不使用索引(参数嗅探)

2023-12-28

我遇到了针对 SQL Server 2008 R2 运行的实体框架 (4.2) 生成的简单 SQL 查询的一些主要性能问题。在某些情况下(但不是全部),EF 使用以下语法:

exec sp_executesql 'DYNAMIC-SQL-QUERY-HERE', @param1...

在其他情况下,只需执行原始 SQL,并将提供的参数融入到查询中。我遇到的问题是,使用 sp_executesql 执行的查询忽略了目标表上的所有索引,导致查询性能极差(通过检查 SSMS 中的执行计划确认)。

经过一番研究,听起来这个问题可能是由“参数嗅探”引起的。如果我像这样附加 OPTION(RECOMPILE) 查询提示:

exec sp_executesql 'DYNAMIC-SQL-QUERY-HERE OPTION(RECOMPILE)', @param1...

使用目标表上的索引并且查询执行得非常快。我还尝试切换用于禁用数据库实例上的参数嗅探(4136)的跟踪标志(http://support.microsoft.com/kb/980653 http://support.microsoft.com/kb/980653),但这似乎没有任何效果。

这给我留下了几个问题:

  1. 是否有办法将 OPTION(RECOMPILE) 查询提示附加到实体框架生成的 SQL 中?
  2. 是否有办法阻止实体框架使用 exec sp_executesql,而只是运行原始 SQL?
  3. 还有其他人遇到这个问题吗?还有其他提示/技巧吗?

附加信息:

  1. 我确实通过 SSMS 重新启动了数据库实例,但是,我将尝试从服务管理控制台重新启动服务。
  2. 参数化设置为 SIMPLE(is_parameterization_forced:0)
  3. Optimize for adhoc workloads has the following settings
    • value: 0
    • 最小值:0
    • 最大值:1
    • 使用价值:0
    • 动态:1
    • 是_高级:1

我还应该提到,如果我在使用下面的脚本启用跟踪标志 4136 后通过服务管理控制台重新启动 SQL Server 服务,似乎实际上清除了跟踪标志...也许我应该以不同的方式执行此操作...

DBCC TRACEON(4136,-1)

tl;dr

update statistics


我们有一个delete通过 EF 调用时,使用一个参数(主键)的查询大约需要 7 秒才能完成sp_executesql。手动运行查询,并将参数嵌入到第一个参数中sp_executesql使查询快速运行(~0.2 秒)。添加option (recompile)也工作过。当然,由于我们使用的是 EF,所以这两种解决方法对我们来说不可用。

可能由于级联外键约束,长时间运行的查询的执行计划非常庞大。当我查看 SSMS 中的执行计划时,我注意到在某些情况下不同步骤之间的箭头比其他步骤更宽,这可能表明 SQL Server 无法做出正确的决策。这让我开始思考统计学。我查看了执行计划中的步骤,看看可疑步骤涉及哪些表。然后我跑了update statistics Table对于那张桌子。然后我重新运行了错误的查询。我又重新运行了一次。再次确认。有效。我们的表现恢复正常。 (还是比非差一些sp_executesql性能,但是嘿!)

事实证明这只是我们开发环境的问题。 (这是一个大问题,因为它使我们的集成测试花费了很长时间。)在我们的生产环境中,我们运行了一个定期更新所有统计数据的作业。

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

Entity Framework 4.2 exec sp_executesql 不使用索引(参数嗅探) 的相关文章

随机推荐

  • Laravel Eloquent 模型的临时属性

    我有一个 Laravel Eloquent 模型 User 其中有一个包含用户名和电子邮件列的表 我需要在运行时为模型添加一个属性 例如 user gt secure 该属性不需要进入数据库 当我添加此属性并点击 user gt save
  • 覆盖 App.xaml 中的标准主题

    我正在使用标准 WPF 主题 Aero NormalColor xaml 而且效果很好 然而对于整个申请 我想将文本框的前景色覆盖为红色 我的第一次尝试是
  • 是否有比较 django、rails 和 PHP 框架各自内存使用情况的基准?

    我必须在 RAM 有限 1 GB 无交换 的嵌入式服务器上运行包含许多服务的 Web 服务器 最多有 100 个用户 我将提供论坛 小游戏 javascript 或 flash 等服务 我的团队非常了解 Ruby on Rails 但我有点
  • 在 Swift 3 中单击处于终止/关闭状态的推送通知时,应用程序无法打开

    如何打开一个Application当应用程序处于killed closed状态 我收到通知 但当我单击通知应用程序时未打开 但当应用程序位于前台或后台时工作正常 我尝试了下面的代码仍然无法解决问题所在 请检查我尝试过的内容 func app
  • 如何允许用户通过 PayPal 的 REST API 付款,但无需注册 PayPal 帐户?

    这是我想要的用例 我通过 PayPal 的 REST API 创建付款 我向用户提供由 PayPal 发送给我的付款链接 用户可以点击该链接 用户选择是否通过 PayPal 帐户 存储的信用卡付款或无需注册即可立即通过信用卡 您可以使用新的
  • 设置 WPF ListView 标题悬停颜色的样式

    有人知道如何设置 WPF ListView 的标题悬停颜色样式吗 Thanks 你必须为GridView ColumnHeaderContainerStyle财产 通过为样式设置一些触发器来添加悬停效果 例如
  • 使用 JavaScript 检查互联网连接

    PROBLEM 我想在 WiFi 关闭时显示警报 即没有网络连接 在我的网页中 我有许多按钮 弹出窗口等 用户可以在离线时单击任何内容 但我想显示 API 调用是否失败 我可以检查navigator onLine在每次点击中 但我不想写函数
  • ios应用程序在后台运行时如何打开sqlite数据库

    我的应用程序在后台捕获位置数据并保存在 sqlite 数据库中 当设备未锁定时它运行良好 但当设备锁定时我无法访问 sqlite 数据库 它总是给我错误代码 SQLITE AUTH 错误代码 23 我尝试过以下选项 禁用功能中的数据保护 不
  • 什么可能导致 numpy.nanstd() 返回 nan?

    我有一个相对较大的一维数组 20000 个观测值 当我计算描述性统计数据 例如标准差 平均值 总和 时 我得到的是 nan 值 但是当我从同一数组计算百分比时 我得到了我期望的值 我尝试了 numpy nanstd nanmean 等函数
  • Excel 公式返回具有特定名称和特定列的行的交集的单元格值? [复制]

    这个问题在这里已经有答案了 是否有一个 Microsoft Excel 公式可以返回位于特定列中的最后一个单元格的单元格值 同时与具有给定名称的行相交 使用 Office 365 我们可以过滤范围并返回所有符合条件的数组 然后使用 TAKE
  • Laravel - 如何在验证规则构造中自动注入?

    我无法通过 Laravel 注入这些变量 class AllowedUsername implements Rule public function construct Router router Filesystem files Repo
  • Neo4J 约束中的非空属性

    是否可以在 Neo4J 数据库中创建属性不为空的约束 就像是 CREATE CONSTRAINT ON p Person ASSERT p name IS NOT NULL 它已计划并已在 Neo4j 2 3 中实现 应该可在 2 3 RC
  • 如何获取单选按钮的值?

    我有一个包含单选按钮的组框 例如 o Male o Female 我希望我的代码获取单选按钮的选定值并将其复制到字符串类型变量 请使用简单的代码 因为我不是很专业 thanks 对于Winforms 要从单选按钮中获取值 假设您需要该值 而
  • 使用 pandas 查找列表列表中的所有匹配组

    我想找到 Pandas DataFrame 中所有 id 的所有情况 什么是有效的解决方案 我有大约 10k 条记录 它是在服务器端处理的 创建一个新的 DataFrame 是个好主意 还是可以使用更有效的数据结构 当 id 包含案例中的所
  • 如何在没有许可证页面的情况下构建最小的 WiX 安装程序 UI?

    我想使用 WixUI Minimal 安装程序 但我不需要许可证页面 我怎样才能做到这一点 我只需使用已创建的 WiX UI 之一并覆盖序列 使其更高 以便覆盖之前的设置
  • 无法向连接到 Xcode 的全新存储库推送/拉取

    我对此真的很陌生 所以感谢您的耐心 以及处理我的挫败感 我创建了一个新的 Xcode 项目 将其置于源代码控制之下 并在本地成功进行了更改 提交 我在 Github 创建了一个公共存储库 https github com nyuman Be
  • Visual Studio 有没有清理 CSS 的插件?

    我正在寻找 Visual Studio 2010 的插件来帮助我清理 ASP NET MVC 项目中的 CSS 我们有很多人在同一个网站上工作 在发布之前 我想清理 CSS 以确保没有未使用的选择器 我知道 Firefox 有插件 但它们不
  • AMD (require.js) 如何处理单个非 amd js 文件中的多个类?

    我在用着MootoolsMore 库中的一堆组件 http mootools net more ab0e3a7d86a5d558c13e64a0539eba82它们全部编译成一个 js 文件 有没有一种方法可以在填充程序中定义一次库并可以访
  • Laravel 页面过期异常?

    这在 Laravel 中经常出现 提交表单后 有时应用程序会重定向到一个页面 由于不活动 该页面已过期 请刷新并重试 我知道这是 Laravel 中针对 CSRF 的安全机制 如何防止它显示 因为当应用程序部署在生产服务器中时这可能不合适
  • Entity Framework 4.2 exec sp_executesql 不使用索引(参数嗅探)

    我遇到了针对 SQL Server 2008 R2 运行的实体框架 4 2 生成的简单 SQL 查询的一些主要性能问题 在某些情况下 但不是全部 EF 使用以下语法 exec sp executesql DYNAMIC SQL QUERY