我遇到了由对SQL Server 2008 R2运行的entity framework(4.2)生成的简单SQL查询的一些主要性能问题。 在某些情况下(但不是全部),EF使用以下语法: exec sp_executesql 'DYNAMIC-SQL-QUERY-HERE', @param1… 在其他情况下,只需执行提供的参数烘焙到查询中的原始SQL。 我遇到的问题是,使用sp_executesql执行的查询忽略了目标表上的所有索引,导致性能极差(通过检查SSMS中的执行计划进行确认)。 经过一番研究,听起来这个问题可能是由“参数嗅探”造成的。 如果我追加OPTION(RECOMPILE)查询提示像这样: exec sp_executesql 'DYNAMIC-SQL-QUERY-HERE OPTION(RECOMPILE)', @param1… 使用目标表上的索引,查询执行速度非常快。 我也尝试切换用于禁用数据库实例( http://support.microsoft.com/kb/980653 )上的参数嗅探(4136)的跟踪标志,但是这看起来没有任何效果。 这给我留下了几个问题: 有没有办法将OPTION(RECOMPILE)查询提示附加到Entity Framework生成的SQL? 无论如何阻止Entity Framework使用exec sp_executesql,而只是运行原始SQL? 有没有人遇到这个问题? 任何其他提示/提示? 附加信息: 我没有通过SSMS重新启动数据库实例,但是,我将尝试从服务pipe理控制台重新启动服务。 参数化设置为SIMPLE(is_parameterization_forced:0) 优化特别工作负载有以下设置 值:0 最小值:0 最大:1 value_in_use:0 is_dynamic:1 is_advanced:1 我还应该提到,如果我通过服务pipe理控制台在使用下面的脚本启用跟踪标志4136后重新启动SQL Server服务,似乎实际上清除跟踪标志…也许我应该这样做一个不同的方式… DBCC TRACEON(4136,-1)