SQL Server:条件需要更多时间时的情况
我有以下SQL查询,它需要更多的时间运行,即执行时间超过4分钟,而使用静态“1”或“0”值执行同一查询所需的时间要少得多,即少于3-4秒:SQL Server:条件需要更多时间时的情况,sql,sql-server,Sql,Sql Server,我有以下SQL查询,它需要更多的时间运行,即执行时间超过4分钟,而使用静态“1”或“0”值执行同一查询所需的时间要少得多,即少于3-4秒: select column1, column2 from tablename where bitColumn_1 = (case when @bitColumn_1_param is null then bitColumn_1
select
column1, column2
from
tablename
where
bitColumn_1 = (case when @bitColumn_1_param is null
then bitColumn_1
else @bitColumn_1_param
end)
and bitColumn_2 = (case when @bitColumn_2_param is null
then bitColumn_2
else @bitColumn_2_param
end)
and bitColumn_3 = (case when @bitColumn_3_param is null
then bitColumn_3
else @bitColumn_3_param
end)
and bitColumn_4 = (case when @bitColumn_4_param is null
then bitColumn_4
else @bitColumn_4_param
end)
and bitColumn_5 = (case when @bitColumn_5_param is null
then bitColumn_5
else @bitColumn_5_param
end)
and bitColumn_6 = (case when @bitColumn_6_param is null
then bitColumn_6
else @bitColumn_6_param
end)
and bitColumn_7 = (case when @bitColumn_7_param is null
then bitColumn_7
else @bitColumn_7_param
end)
任何改进查询的帮助都会很有帮助
提前感谢您可以尝试下面的查询,这可能会对您有所帮助
select column1,column2 from tablename
where bitColumn_1 = ISNULL(@bitColumn_1_param,bitColumn_1)
AND bitColumn_2 =ISNULL(@bitColumn_2_param,bitColumn_2)
AND bitColumn_3 =ISNULL(@bitColumn_3_param,bitColumn_3)
AND bitColumn_4 =ISNULL(@bitColumn_4_param,bitColumn_4)
AND bitColumn_5 =ISNULL(@bitColumn_5_param,bitColumn_5)
AND bitColumn_6 =ISNULL(@bitColumn_6_param,bitColumn_6)
AND bitColumn_7 =ISNULL(@bitColumn_1_param,bitColumn_7)
你从未向我们展示过另一个问题。你能做到吗?也许你使用的是一组不同的参数,比如1返回很多结果,0只返回很少的结果。另一种可能性是,如果一个查询是不同的,那么它不是“同一个查询”,而是返回一个不同的查询(可能)相同的结果-为了正确地进行比较并实际回答,我们需要看到两者-执行计划可能在这两个不同的查询上有所不同。为什么您认为OP应该尝试您的查询?在我的查询中,
coalesce
在哪里??ISNULL
在其差异中也使用类型转换。您能解释一下您的问题吗回答?您需要简单的case isnull规则第一个null或第二个null使用colaesce这是位置see我想您的参数可能需要相反的顺序coalesce(bitcolumn1,@bitcolumn1)
可能需要是coalesce(@bitcolumn1,bitcolumn1)
,因为它返回第一个非空结果
create table #test
(bitcolumn1 nchar(10),
bitcolumn2 nchar(10),
bitcolumn3 nchar(10),
bitcolumn4 nchar(10),
bitcolumn5 nchar(10),
bitcolumn6 nchar(10),
bitcolumn7 nchar(10)
)
insert #test
values
('x1',null,'x3','x4',null,'x6','x7')
declare
@bitcolumn1 nchar(10)=null,
@bitcolumn2 nchar(10)='z2',
@bitcolumn3 nchar(10)='z3',
@bitcolumn4 nchar(10)=null,
@bitcolumn5 nchar(10)='z5',
@bitcolumn6 nchar(10)='z6',
@bitcolumn7 nchar(10)='z7'
select * from #test
where bitcolumn1 = coalesce(bitcolumn1,@bitcolumn1) and
bitcolumn2= coalesce(bitcolumn2,@bitcolumn2) and
bitcolumn3 = coalesce(bitcolumn3,@bitcolumn3) and
bitcolumn4 = coalesce(bitcolumn4,@bitcolumn4) and
bitcolumn5 = coalesce(bitcolumn5,@bitcolumn5) and
bitcolumn6 = coalesce(bitcolumn6,@bitcolumn6) and
bitcolumn7 = coalesce(bitcolumn7,@bitcolumn7)