Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/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 为什么同一查询的执行计划不同_Sql Server_Tsql - Fatal编程技术网

Sql server 为什么同一查询的执行计划不同

Sql server 为什么同一查询的执行计划不同,sql-server,tsql,Sql Server,Tsql,实际上,我被分配了一项任务,其中我必须从SP中删除动态查询和循环(如果可能)。为此,我创建了原始SP的副本,并在新复制的SP上工作。我在新SP中进行了某些更改,并尝试比较两者的性能(旧SP和新SP)SP使用实际执行计划,为此,我使用相同的参数执行两个SP 问题在于,在我们的数据库中,我们拥有的所有SP都接受一个通用参数,即session_code(varchar类型),在所有SP中,我们首先调用另一个SP,以验证调用应用程序提供的session_code参数。在我的新SP中,我没有更改会话验证S

实际上,我被分配了一项任务,其中我必须从SP中删除动态查询和循环(如果可能)。为此,我创建了原始SP的副本,并在新复制的SP上工作。我在新SP中进行了某些更改,并尝试比较两者的性能(旧SP和新SP)SP使用实际执行计划,为此,我使用相同的参数执行两个SP

问题在于,在我们的数据库中,我们拥有的所有SP都接受一个通用参数,即session_code(varchar类型),在所有SP中,我们首先调用另一个SP,以验证调用应用程序提供的session_code参数。在我的新SP中,我没有更改会话验证SP的调用,也没有在其他动态查询中进行更改。但是,当我比较(旧的和新的)SP的实际执行计划时,我可以看到会话验证SP的执行成本不同。对于我新创建的SP,它显示的成本比旧SP高


你们能帮我理解一下优化器的这种行为吗?我在SP/查询中没有做任何修改。

两个词-参数嗅探这就是@Raj所说的参数嗅探:通常它意味着反问题。您的原始计划将保持不变,即使它与输入相比已经过时。但您指出SPs中存在动态查询。这将导致每次重新编译SPs。感谢朋友的建议@model_dialog实际上我每次都在使用DBCC FREEPROCCACHE清除过程缓存,这样我们就可以随时得到新的计划来密切关注性能。
DBCC FREEPROCCACHE
将如何帮助您评估实际性能?要么您正在使用(重新编译)而它什么也不做,要么您没有,而您得到的结果是扭曲的。@Luaan,我使用DBCC FREEPROCCACHE只是为了清空过程缓存。是的,每次运行后我都会得到不同的执行。实际上,我的两个SP(旧的和新的)也调用了其他SP,并且使用DBCC,我试图阻止优化器在仅测试性能时缓存任何查询。如果这不是测试性能的最佳方法,请提出建议,并应遵循其他方法。