我有这样的查询
select *
from MyTable
where (@Param is null or (FieldCode = 'Whatever' and FieldValue like '%' + @Param + '%'))
当我在 where 子句中添加更多语句时,我的查询速度变慢了。我认为这是因为它在 OR 之前评估 AND 部分(其中包含 LIKE,这可能很慢)。如果@Param 为空,我希望它使用AND 跳过查询,我应该怎么做?
我有这样的查询
select *
from MyTable
where (@Param is null or (FieldCode = 'Whatever' and FieldValue like '%' + @Param + '%'))
当我在 where 子句中添加更多语句时,我的查询速度变慢了。我认为这是因为它在 OR 之前评估 AND 部分(其中包含 LIKE,这可能很慢)。如果@Param 为空,我希望它使用AND 跳过查询,我应该怎么做?
我强烈建议你检查你的索引,你肯定会错过一个。除此之外,您真的需要使用每一列吗?使用 (NOLOCK) 读取数据。此外,如果您真的需要程序的第一个 % 或者您可以在客户端搜索数据(过滤更大的数据子集),那么对于索引外观来说,like 非常糟糕
如果@param 为空,您总是可以将其分开并执行不同的选择语句。
If @Param is not null
select *
from MyTable
where (FieldCode = 'Whatever' and FieldValue like '%' + @Param + '%')
Else
select *
from MyTable
试试这个以获得更好的性能:
select *
from MyTable
where @Param is null or case when @Param is not null and FieldCode = 'Whatever'
then case when FieldValue like '%' + @Param + '%' then 1 end end = 1
这将防止在不必要时进行繁重的通配符比较