我现在正在尝试使用Database Engine Tuning Advisor优化我的数据库,我面临的问题是,我的SQL Profiler跟踪显示了大量使用sp_executesql执行的查询-而顾问无法处理这些查询。这些查询似乎来自我正在使用的LINQ- to -Entities,所以我只是好奇是否有任何方法可以让LINQ-to-Entities直接调用语句。
发布于 2010-06-27 13:21:54
同意Adam的观点。在实体框架/ADO. Use中使用sp_executesql是有意的。然后执行查询,类似于参数化的存储过程,SQL优化器可以重用查询计划。
如果你想调优你的数据库,你也应该考虑这些查询。我建议您备份数据库,使用重放跟踪模板(在SQL分析器中)捕获查询,恢复数据库,运行调优顾问将其工作负载设置为此跟踪
发布于 2012-07-25 18:31:55
LINQ/.NET通过将SQL查询作为sp_executesql调用发送到SQL server来运行SQL查询。但是,数据库引擎优化顾问无法分析SQL Server事件探查器捕获的此类语句,因此优化会话的结果将很差。
这就是我如何在将sp_executesql语句提供给数据库引擎优化顾问之前对它们进行“拆箱”,以便它可以正确地分析它们。
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调优愉快!请注意,我选择了Notepad++ 6(或更高版本),因为它有一个很好的正则表达式实现,其他文本编辑器可能无法运行上面的表达式。
发布于 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时都会发生。
https://stackoverflow.com/questions/3126437
复制相似问题