Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2005 可以强制Linq2SQL不使用sp_executesql吗?_Sql Server 2005_Tsql_Linq To Sql - Fatal编程技术网

Sql server 2005 可以强制Linq2SQL不使用sp_executesql吗?

Sql server 2005 可以强制Linq2SQL不使用sp_executesql吗?,sql-server-2005,tsql,linq-to-sql,Sql Server 2005,Tsql,Linq To Sql,所以我写了一个Linq查询,运行需要16秒。决定查看查询计划是什么,因此我从LINQtoSQLProfiler中获得了该计划,查询只需2秒钟即可运行。叹息 在花了一天的大部分时间研究问题并最终开始使用SQL Server Profiler之后,我看到Linq2SQL正在使用sp_executesql来运行查询。我知道它应该提高性能,因为它更有可能重复使用执行计划。。。但它似乎选择了一个可怕的执行计划 更奇怪的是,如果我加入一个特定的表,它只会变慢,我不知道为什么这个特定的表会导致问题 编辑此处只

所以我写了一个Linq查询,运行需要16秒。决定查看查询计划是什么,因此我从LINQtoSQLProfiler中获得了该计划,查询只需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

如果一个应用程序或服务器的查询速度很快,而另一个应用程序或服务器的查询速度很慢,那么通常都是关于执行计划的。执行计划是服务器用于运行查询的蓝图。计划应该创建一次,然后重新用于仅在参数值上不同的所有查询

不同的执行计划可能会导致巨大的性能差异,系数100一点也不奇怪。作为第一步,检查执行计划是否不同。探查器事件
performance->showplan xml
记录计划

如果计划不同,一个可能的原因可能是会话选项,如:

另一种可能是不同的登录(蓝图包含安全信息,因此每个安全上下文都有自己的缓存执行计划集)

清除计划缓存的最简单方法是重新启动SQL Server服务。还有一个高级命令用于:


另外,如果您有一个根据参数值执行不同的存储过程,那么值得一看。但是,由于您正在从探查器复制完全相同的过程,我假设慢速调用和快速调用的参数都是相同的。

要回答您的问题


不,您不能…

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


这将使您深入了解为什么会出现性能差异,如何诊断和持续复制性能差异,以及最后如何解决性能差异。

那么为什么要使用LINQ?LINQ非常适合基础知识。如果需要优化查询,请查询SQL。NET可以直接与SQL对话。但我不需要调整查询。。。查询本身工作正常。请确保您加入的表具有适当的索引,并且主要在您加入的列上。您的统计信息是最新的吗?请看,我认为是参数嗅探。对于慢速调用和快速调用,OP使用相同的参数进行调用是不相关的。参数嗅探的整个问题是,它为看到的第一批参数值编译计划,然后重新使用它。当粘贴到SSMS中时,它有一个不同的默认选项,用于
ARITH_ABORT
,它不会重用应用程序使用的缓存计划,但会生成一个新的计划,该计划是为OP当前正在调查的参数值定制的。因此性能更好。@MartinSmith:问题是相同的参数值存在性能差异。嗅探如何解释这一点?因为当从应用程序运行时,它可能正在重新使用为不同参数值集编译的计划。OP可以通过检索执行计划并查看XML@MartinSmith:如果计划是为不同的参数集编译的,这可以解释为什么调用很慢。但它无法解释为什么两个参数相同的调用具有不同的性能,因为它们使用的计划不同。SSMS对
ARITH\u ABORT
选项有不同的默认设置。这是用作计划缓存键的设置之一,这意味着具有不同的
开/关设置的连接不能重用彼此的计划。缓存中可能没有适合SSMS连接的预先存在的计划,直到OP粘贴问题查询并运行它,从而为这些值生成一个新的好计划。
SET ANSI_NULLS 
DBCC FREEPROCCACHE