Sql server 参数占用时间的SQL查询

Sql server 参数占用时间的SQL查询,sql-server,Sql Server,上面的查询是在一个过程中调用的,执行起来大约需要4秒,其中与下面的查询一样,单独运行时在0秒内执行 declare @Id varchar(9) set @Id='1' select * from vw_testview where id=@Id 有人能帮我一下吗?我需要减少第一个查询的执行时间在您的第一个查询中,SQL Server在执行表扫描时隐式地将varchar转换为int。这会导致性能问题。考虑定义 @ ID>代码>作为代码> int < /p> < p>当SQLServer构建

上面的查询是在一个过程中调用的,执行起来大约需要4秒,其中与下面的查询一样,单独运行时在0秒内执行

declare @Id varchar(9)
set @Id='1'
select *  from vw_testview where id=@Id

有人能帮我一下吗?我需要减少第一个查询的执行时间

在您的第一个查询中,SQL Server在执行表扫描时隐式地将
varchar
转换为
int
。这会导致性能问题。考虑定义<代码> @ ID>代码>作为代码> int <代码> < /p> < p>当SQLServer构建查询计划时,它使用参数值和文字值来计算将返回多少行。如果使用一个包含多行的值,则可能会扫描整个表,然后过滤掉所需的行。如果使用SQL Server知道的值,SQL Server可以采取不同的策略并使用多个搜索来完成相同的工作

在慢速查询中,您使用的是局部变量,SQL Server在创建查询计划时不会嗅探局部变量的值,而是使用平均密度来计算返回的估计行数


看起来您在这里查询一个视图,因此如果不查看所有相关表的表结构和索引,以及使用文字值和局部变量时得到的查询计划,就很难给出任何建议

为什么要将字符串值传递给int字段
id
?id是数据库中的一个varchar字段,我们在数据库中有诸如“achd214”之类的值。很抱歉,我本打算将其写为“1a”,您能否提供一些包含这些字符串Id的示例数据?请尝试使用索引提示强制sql server使用某些索引。Id始终是一个字母数字字段,长度为8。一些示例是72DA7YEF、12J4HJNGT。Id是数据库中的一个varchar字段,我们在数据库中有诸如“achd214”之类的值。很抱歉,我本来打算将其写为“1a”,如果是这样的话,那么请将第二个查询修改为
where id='1'
,并检查它的执行情况。我在第二个查询中对其进行了修改,它总是在0秒内执行。很好的解释。。。发问者可以查看以下链接或其他类似链接,以检查当参数嗅探意外成为性能问题时如何处理。谢谢Mikael!!详细的解释。我试图在这里发布执行计划,但不确定如何发布,因为执行计划非常庞大。很抱歉,我是这里的新生。谢谢kevin的回复,我已经尝试了所有可用的参数嗅探选项,但还没有成功。
select * from vw_testview 
where id='1'