Sql 视图上的where条件存在性能问题
我有一个视图,并尝试通过应用where过滤器访问视图数据 当我直接使用name进行筛选时,马上就会得到结果。但当声明一个变量并将该变量传递到where条件时,我得到的结果是20sec。。请让我知道为什么在where条件下使用变量时会出现如此大的差异Sql 视图上的where条件存在性能问题,sql,sql-server,Sql,Sql Server,我有一个视图,并尝试通过应用where过滤器访问视图数据 当我直接使用name进行筛选时,马上就会得到结果。但当声明一个变量并将该变量传递到where条件时,我得到的结果是20sec。。请让我知道为什么在where条件下使用变量时会出现如此大的差异 select count(1) from vw_Student where studentName='raja'; (result in 1sec) declare @name char(4); set @name='raja' select
select count(1) from vw_Student where studentName='raja'; (result in 1sec)
declare @name char(4);
set @name='raja'
select count(1) from vw_Student where studentName=@name;(result in 20sec)
他们有相同的执行计划吗?(如何检查执行计划:)它既不是
where
条件,也不是视图。重要的信息是执行计划、表定义、视图语句和索引,这些都没有出现在这个问题中。变量是一个固定宽度值,char(4)
,而不是更常见的varchar(..)
。这意味着必须使用固定长度语义对数据进行过滤-必须首先将较短的值填充到完整长度。这意味着在studentName
上创建的任何索引都是无用的,因为它们基于全文,而不是填充/截断的值。将变量类型更改为varchar(4)
@PanagiotisKanavos,您错了,varchar的优先级高于char,因此当然不会填充较短的值。变量将隐式转换为varchar,反之亦然。@DenisRubashkin没有任何我们只能猜测的信息。缺少索引很容易产生延迟。如果发生这种情况,则意味着索引不合适——要么是因为基础字段的类型错误,要么是在使用索引之前需要进行转换。排序规则不匹配、字段上的函数以及在本例中比较固定宽度和可变长度字符串就是这种情况。它们有相同的执行计划吗?(如何检查执行计划:)它既不是where
条件,也不是视图。重要的信息是执行计划、表定义、视图语句和索引,这些都没有出现在这个问题中。变量是一个固定宽度值,char(4)
,而不是更常见的varchar(..)
。这意味着必须使用固定长度语义对数据进行过滤-必须首先将较短的值填充到完整长度。这意味着在studentName
上创建的任何索引都是无用的,因为它们基于全文,而不是填充/截断的值。将变量类型更改为varchar(4)
@PanagiotisKanavos,您错了,varchar的优先级高于char,因此当然不会填充较短的值。变量将隐式转换为varchar,反之亦然。@DenisRubashkin没有任何我们只能猜测的信息。缺少索引很容易产生延迟。如果发生这种情况,则意味着索引不合适——要么是因为基础字段的类型错误,要么是在使用索引之前需要进行转换。排序规则不匹配、字段上的函数以及在本例中比较固定宽度和可变长度字符串就是这种情况。