所以我写了一个 Linq 查询,运行需要 16 秒。决定查看查询计划是什么,所以我从 Linq to SQL Profiler 中得到它,查询只需要 2 秒即可运行。 感叹
在花了一天的大部分时间研究事物并最终开始使用 SQL Server Profiler 之后,我看到 Linq2SQL 正在使用 sp_executesql 来运行查询。我知道它应该提高性能,因为它更有可能重新使用执行计划......但它似乎选择了一个可怕的执行计划来使用。
奇怪的是,如果我加入一个特定的表,它只会变慢,而且我不知道为什么那个特定的表会导致问题。
编辑只是为了澄清这里的实际问题:
它实际上是针对不同的查询。一个是,本质上,
SELECT col1, col2, ... FROM table1, table2 WHERE table1.val IN (1234, 2343, 2435)
另一个是
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
最佳答案
您的问题并非源于使用 sp_executesql,因此绕过它(您不能)不会解决您的问题。我建议您阅读 Erland Sommarskog 的优秀文章:
Slow in the Application, Fast in SSMS?
Understanding Performance Mysteries
这将使您深入了解为什么会出现性能差异、如何诊断和一致地重现它,以及最后如何解决它。
关于sql-server-2005 - 你能强制 Linq2SQL 不使用 sp_executesql 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8685909/