LINQ-to-Entities摆脱了sp_executesql

Mic*_*kin 3 linq sql-server linq-to-entities sqlperformance sql-server-2008

我正在尝试使用数据库引擎优化顾问来优化我的数据库,我面临的问题是我的SQL事件探查器跟踪显示使用了大量的查询sp_executesql- 并且顾问程序无法处理这些查询.看起来这些查询来自我正在使用的LINQ到实体,所以只是好奇是否有任何方法可以使LINQ-to-Entities直接调用语句.

Fre*_*son 6

LINQ/.NET通过将它们作为sp_executesql对SQL Server的调用发送来运行SQL查询.但是,数据库引擎优化顾问无法通过SQL Server Profiler解析捕获的语句,因此调优会话的结果将很差.

这是我在将sp_executesql语句提供给数据库引擎优化顾问之前将其"解包"的方式,以便它可以正确分析它们.

  1. SQL Server Profiler中运行(或打开现有的)调优会话后,使用" 文件">"导出">"提取SQL Server事件">"提取Transact-SQL事件..."来保存包含所有SQL语句的.SQL文件.
  2. 打开.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
  3. 接下来,使用我们刚刚在Database Engine Tuning Advisor中构建的'unboxed'.SQL字段来找出您需要添加的索引.

快乐的调整!请注意,我选择了Notepad ++ 6(或更高版本),因为它有一个非常好的正则表达式实现,其他texteditor可能无法运行上面的表达式.