declare @Id varchar(9)
set @Id='1'
select * from vw_testview where id=@Id
上述查询在一个过程中被调用,并且需要大约4秒才能执行,其中以下查询单独执行时会在0秒内执行
select * from vw_testview
where id='1'
有人可以请我帮忙,我需要减少第一次查询的执行时间
答案 0 :(得分:2)
当SQL Server构建查询计划时,它使用参数和文字的值来确定将返回多少行。如果使用包含许多行的值,则最终可能会扫描整个表,然后筛选出所需的行。如果使用SQL Server知道的值很少,SQL Server可以采取不同的策略并使用多个搜索来完成相同的工作。
在慢速查询中,您使用的是本地变量,SQL Server在创建查询计划时不会嗅探局部变量的值,但会使用平均密度来计算返回的估计行数。
看起来你在这里查询一个视图,所以很难在不查看所涉及的所有表的表结构和索引的情况下给出任何建议,也很难在使用文字值时获得的查询计划以及使用局部变量。
答案 1 :(得分:0)
在第一次查询时,SQL Server在实现表扫描时隐式地将varchar
转换为int
。这会导致性能问题。考虑将@Id
定义为int