你能强迫Linq2SQL不使用sp_executesql吗?

Cod*_*ick 2 t-sql sql-server-2005 linq-to-sql

所以我写了一个Linq查询,运行需要16秒.决定查看查询计划是什么,所以我从Linq到SQL Profiler得到了它,并且查询只需要2秒就可以运行.

在花了大量时间进行操作并最终使用SQL Server Profiler后,我发现Linq2SQL正在使用sp_executesql来运行查询.我知道它应该提高性能,因为它更有可能重新使用执行计划......但它似乎选择了一个可怕的执行计划来使用.

更奇怪的是,如果我加入一个特定的表,它只会变慢,我不知道为什么这个特定的表引起了问题.

编辑只是为了澄清这里的实际问题:

它实际上是在进行不同的查询.一个是,基本上,

SELECT col1, col2, ... FROM table1, table2 WHERE table1.val IN (1234, 2343, 2435)
Run Code Online (Sandbox Code Playgroud)

另一个是

EXEC sp_executesql 'SELECT col1, col2, ... FROM table1, table2 WHERE table1.val IN (@p1, @p2, @p3)', 
N'@p0 int,@p1 int,@p2 int,@p3 int',
@p0=1234, @p1=2343, @p3=2435
Run Code Online (Sandbox Code Playgroud)

All*_*nek 5

您的问题不是源于使用sp_executesql,因此绕过它(您不能)将无法解决您的问题.我建议你阅读Erland Sommarskog的优秀文章:

应用程序速度慢,SSMS速度快?
了解性能之谜

这将使您深入了解为什么您会获得性能差异,如何诊断和一致地重现它,最后,如何解决它.