LINQ到实体摆脱sp_executesql
我想使用Database Engine Tuning Advisor来优化我的数据库,而我面临的问题是我的SQL事件探查器跟踪显示使用sp_executesql
执行的大量查询 - 而且顾问程序无法处理这些。看起来这些查询来自我正在使用的LINQ到实体,所以只是好奇,是否有任何方法可以直接让LINQ-to-Entities调用语句。LINQ到实体摆脱sp_executesql
同意Adam。在实体框架/ ADO.net中使用sp_executesql
是故意的。然后执行类似于参数化存储过程的查询,并且SQL优化器可以重用查询计划。
如果你正在寻找调整你的数据库,你也应该考虑这些查询。我建议你,备份你的数据库,使用重播跟踪模板(在你的SQL分析器中)捕获查询,恢复你的数据库,运行你的调优顾问设置其工作负载到这个跟踪
sp_executesql
的使用是一种ADO.NET效果,不是特定于实体框架的某种东西。据我所知,没有办法指示它不要使用该存储过程。
这只是一个人为因素探查器中显示RPC调用。有两种主要类型的客户端请求:语言(类型0x01)和RPC(类型0x03),如Free TDS protocol documentation所述。当调用是带有参数的SQL批处理时,RPC调用将是类型0x03,长度为0x0A,这是sp_executesql
的快捷方式。
所以你看,真正的情况是,当一个客户端,任何客户端,提交包含参数的批次,它会出现,如果sp_executesql
被调用。对于ODBC,OleDB,SqlClient,Sql Native Client也是如此,正如我所说的,任何客户端。所以不是实体框架,也不是实际调用sp_executesql的ADO.Net(事实上,甚至没有真正调用该过程,虽然这些请求执行起来就像被调用一样,但是很复杂......)。这是协议的人工产物,只要您在请求中添加@parameter
即可。
感谢解释 - 它明确的东西不少。现在我明白了这是怎么回事! – 2010-06-28 12:25:09
LINQ/.NET通过将它们作为sp_executesql
调用发送到SQL服务器来运行SQL查询。但是,数据库引擎优化顾问无法解析这样的,由SQL Server Profiler,捕获的语句,所以调优会话的结果会很差。
这是我将数据库引擎优化顾问供给数据库引擎优化顾问之前,如何“解开”sp_executesql
声明,以便它可以正确分析它们。
- 您已经运行后在SQL Server事件探查(或打开现有的)优化会话,使用文件>导出>提取SQL Server事件>提取的Transact-SQL事件...保存。包含所有SQL语句的SQL文件。
- 打开.SQL文件(在例如记事本++ 6 - http://notepad-plus-plus.org/)并运行以下查找&代用正则表达式拆箱所有
sp_executesql
语句为纯TSQL。查找:^EXEC[\s]+SP_EXECUTESQL[\s]+[N]*'((''|[^'])*)'[\s]*,[\s]*[N]*'((''|[^'])*)'[\s]*,[\s]*([^\n]+)$
替换:BEGIN\nDECLARE \3\nSELECT \5\n\1\nEND
- 接下来,使用“装箱的” .SQL申请,我们已经在数据库引擎优化顾问只是构建找出你neeed添加哪些索引。
快乐调整!请注意,我选择记事本+ + 6(或以上),因为它有一个相当不错的正则表达式实现,其他texteditors可以在运行上面的表达式失败。
你为什么不顶部?这个简单的发现和替换真的有窍门。除了EF为每个过程调用使用相同的变量名称。但是这真的很有帮助。谢了哥们! – Giri 2016-06-30 12:14:06
非常感谢,要去尝试这种方式! – 2010-06-28 12:24:22