2013-11-26 5 views
0

Мне нужно знать, будет ли SQL Server значительно снижать производительность за использование подстановочного знака или дублирование одного и того же фильтра в предложении WHERE.SQL Server: подстановочный знак

У меня будет 2 переменные в операторе WHERE, которые контролируются кодом хранимой процедуры. Мне нужно знать, если эти запросы будут вызывать проблемы с производительностью

Листинг 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

Возможно, вы захотите изучить динамические SQL и EXEC. – Becuzz

ответ

3

Вещь, которую следует помнить о базах данных, состоит в том, что производительность почти полностью управляется индексированием. Хорошая индексация и использование = хорошая производительность. Плохая индексация или использование = плохая производительность. Многое из того, что вы делаете при настройке запроса, просто записывает его, чтобы лучше соответствовать вашим индексам или модифицировать индексы, чтобы лучше соответствовать запросу.

Ведущие подстановочные знаки не позволяют использовать обычные индексы вообще! Итак, да, для этого, вероятно, будет крутая оценка эффективности.

Перемещение за пределы подстановочных знаков: даже условие OR сделает сервер Sql менее вероятным для использования индекса. Вы могли бы рассмотреть писать запрос, как это:

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 

Опять же, если это возможно, использовать только завершающие символы. Это еще не очень хорошо для индексации, но это лучше, чем ничего.

Если это очень большой столбец текста/varchar (max), вы также должны рассмотреть full-text index.

+0

Просто примечание: существуют СУБД, которые могут использовать индекс даже для ведущего wildard. Но для SQL Server ваше утверждение абсолютно правильно. –

+0

Просто для того, чтобы завершить свой ответ: вы можете создать обратный индекс для управления ведущим шаблоном. Нет шансов, вместо этого, улучшить двойной подстановочный знак (ведущий и конечный) – LittleSweetSeas

+0

Отредактировано в небольшой формулировке, чтобы разрешить (редкие) исключения для ведущих диких карт. –

Смежные вопросы