我现在正在尝试使用Database Engine Tuning Advisor优化我的数据库,而我面临的问题是我的 SQL Profiler 跟踪显示了大量使用执行的查询sp_executesql
- 而顾问无法处理这些查询。这些查询似乎来自我正在使用的 LINQ-to-Entities,所以只是好奇是否有任何方法可以让 LINQ-to-Entities 直接调用语句。
4 回答
LINQ/.NET 通过将 SQL 查询作为sp_executesql
调用发送到 SQL 服务器来运行它们。但是,数据库引擎优化顾问无法通过SQL Server Profiler解析捕获的语句,因此优化会话的结果会很差。
这就是我在将sp_executesql
语句提供给数据库引擎优化顾问之前将它们“拆箱”的方式,以便它可以正确分析它们。
- 在SQL Server Profiler中运行(或打开现有)优化会话后,使用File>Export>Extract SQL Server Events>Extract Transact-SQL Events...保存包含所有 SQL 语句的 .SQL 文件。
- 打开 .SQL 文件(在例如Notepad++ 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 文件找出您需要添加的索引。
快乐调音!请注意,我选择了 Notepad++ 6(或更高版本),因为它有一个非常好的正则表达式实现,其他文本编辑器可能无法运行上面的表达式。
同意亚当。sp_executesql
在实体框架/ADO.net 中使用是有意的。然后执行类似于参数化存储过程的查询,SQL 优化器可以重用查询计划。
如果您正在寻找调整您的数据库,您也应该考虑这些查询。我建议你备份你的数据库,使用重放跟踪模板(在你的 SQL 分析器中)捕获查询,恢复你的数据库,运行你的调整顾问设置它的工作负载到这个跟踪
这只是分析器中如何显示 RPC 调用的产物。有两种主要类型的客户端请求:语言(类型 0x01)和 RPC(类型 0x03),如免费 TDS 协议文档中所述。当调用是带有参数的 SQL 批处理时,RPC 调用的类型为 0x03,长度为 0x0A,这是sp_executesql
.
所以你看,真正发生的是当一个客户端,任何客户端,提交一个包含参数的批处理时,它看起来好像sp_executesql
正在被调用。正如我所说的,对于 ODBC、OleDB、SqlClient、Sql Native Client,任何客户端都是如此。实体框架和实际调用 sp_executesql 的 ADO.Net 也不是(事实上,该过程甚至没有真正被调用,尽管请求的执行就像它被调用一样。很复杂......)。它是协议的产物,在@parameter
您向请求中添加任何时候都会发生。
的用法sp_executesql
是 ADO.NET 效果,而不是特定于实体框架的东西。据我所知,没有办法指示它不要使用该存储过程。