SQL Server:通配符惩罚

时间:2013-11-26 16:57:51

标签: sql-server performance tsql wildcard

我需要知道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在这里仍无效。

1 个答案:

答案 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