我需要知道SQL Server在使用通配符或在WHERE
子句中复制相同过滤器时是否会显着降低性能。
我将在WHERE
语句中有2个变量,这些变量由存储过程代码控制。我需要知道这些查询是否会导致性能问题
清单1
declare @filter1 varchar(20)
declare @filter2 varchar(20)
(...)
set @filter2 = @filter1
(...)
select Col1, Col2, Col3
from Table1
where Col1 like @filter1 or Col1 like @filter2
清单2
declare @filter1 varchar(20)
declare @filter2 varchar(20)
(...)
set @filter2 = '%'
(...)
select Col1, Col2, Col3
from Table1
where Col1 like @filter1 and Col1 like @filter2
我知道你可能会质疑为什么我要转向这种奇怪的代码。根据传递给存储过程的第一个变量,我只有不同数量的过滤器,我需要随意分配第二个过滤器。但有时不需要第二个过滤器。我在CASE
条款中使用了WHERE
,但是尽管对此门户网站给出了积极的反馈,CASE
在这里仍无效。
答案 0 :(得分:3)
关于数据库需要记住的是,性能几乎完全由索引驱动。良好的索引和使用=良好的性能。索引编制或使用不当=性能不佳。在调优查询时,您所做的很多事情只是将其编写为与索引更好地对齐,或者修改索引以便更好地与查询对齐。
领先的通配符会阻止您使用普通索引!所以,是的,这可能会对性能造成严重损失。
超越通配符:即使OR
条件也会使Sql Server不太可能使用索引。您可以考虑编写如下查询:
select Col1, Col2, Col3
from Table1
where Col1 like @filter1
union
select Col1, Col2, Col3
from Table1
where Col1 like @filter2
向Sql Server明确说明它可以使用索引,或者:
Set @filter2 = COALESCE(@filter2, @filter1)
select Col1, Col2, Col3
from Table1
where Col1 like @filter1 and Col1 like @filter2
同样,如果可能,仅使用尾随通配符。这仍然不适合索引,但它总比没有好。
如果这是一个非常大的text / varchar(max)类型的列,您还应该考虑full-text index。