首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LINQ-to-Entities摆脱sp_executesql

LINQ-to-Entities摆脱sp_executesql
EN

Stack Overflow用户
提问于 2010-06-27 13:04:05
回答 4查看 2.2K关注 0票数 3

我现在正在尝试使用Database Engine Tuning Advisor优化我的数据库,我面临的问题是,我的SQL Profiler跟踪显示了大量使用sp_executesql执行的查询-而顾问无法处理这些查询。这些查询似乎来自我正在使用的LINQ- to -Entities,所以我只是好奇是否有任何方法可以让LINQ-to-Entities直接调用语句。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-06-27 13:21:54

同意Adam的观点。在实体框架/ADO. Use中使用sp_executesql是有意的。然后执行查询,类似于参数化的存储过程,SQL优化器可以重用查询计划。

如果你想调优你的数据库,你也应该考虑这些查询。我建议您备份数据库,使用重放跟踪模板(在SQL分析器中)捕获查询,恢复数据库,运行调优顾问将其工作负载设置为此跟踪

票数 4
EN

Stack Overflow用户

发布于 2012-07-25 18:31:55

LINQ/.NET通过将SQL查询作为sp_executesql调用发送到SQL server来运行SQL查询。但是,数据库引擎优化顾问无法分析SQL Server事件探查器捕获的此类语句,因此优化会话的结果将很差。

这就是我如何在将sp_executesql语句提供给数据库引擎优化顾问之前对它们进行“拆箱”,以便它可以正确地分析它们。

  1. SQL Server事件探查器中运行(或打开现有)优化会话后,请使用File>Export>Extract SQL Server Transact-SQL Events...要保存包含所有SQL的.SQL文件,请将.SQL文件(例如,在Notepad++ 6 -http://notepad-plus-plus.org/中)并运行以下查找和替换正则表达式,以将所有sp_executesql语句解包为普通的TSQL。Find:^EXEC[\s]+SP_EXECUTESQL[\s]+[N]*'((''|[^'])*)'[\s]*,[\s]*[N]*'((''|[^'])*)'[\s]*,[\s]*([^\n]+)$ Replace:BEGIN\nDECLARE \3\nSELECT \5\n\1\nEND
  2. Next,使用我们刚刚在数据库引擎优化顾问中构造的“未装箱”.SQL文件来找出您需要添加哪些索引。

调优愉快!请注意,我选择了Notepad++ 6(或更高版本),因为它有一个很好的正则表达式实现,其他文本编辑器可能无法运行上面的表达式。

票数 6
EN

Stack Overflow用户

发布于 2010-06-28 06:23:17

这只是profiler中RPC调用显示方式的一部分。根据Free TDS protocol documentation的文档,客户端请求主要有两种类型:语言(类型0x01)和远程过程调用(类型0x03)。当调用是带参数的SQL批处理时,RPC调用的类型为0x03,长度为0x0A,这是sp_executesql的快捷方式。

因此,您可以看到,实际发生的情况是,当一个客户端提交一个包含参数的批处理时,它看起来就像是在调用sp_executesql。对于ODBC、OleDB、SqlClient、Sql Native Client,正如我所说的,任何客户端都是如此。因此不是实体框架,也不是实际调用sp_executesql的ADO.Net (实际上,该过程甚至没有真正被调用,尽管请求的执行方式就像它被调用一样)。很复杂...)。它是协议的一个工件,每当您向请求添加@parameter时都会发生。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3126437

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档