Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Нужна помощь в оптимизации запроса  [new]
Davulcu
Member

Откуда:
Сообщений: 21
Всем доброго времени суток!

Возникла следующая задача:

Имеем таблицу (см. вложение), в которой записано значительное количество переменных. Необходимо из таблицы переменных получить набор ID по именам переменных, т.к. переменных в условии много, то конструкция IN сильно снижает быстродействие (Вариант 1), я пытался пойти путем использования конструкции SUBSTRING (Вариант 2), но результат оказался еще хуже. Необходимо оптимизировать этот запрос (он является подзапросом в значительно большей конструкции). Может кто то имеет похожие задачи или решал похожие, буду благодарен за помощь. Если кто то толкнет меня в нужном направлении с моим вариантом, то тоже буду благодарен. Спасибо заранее!

Вариант 1

select V.VarID, V.VarName
from Var V
where V.VarName in ('Наименование', 'Масса', 'НН', 'Дата')


Вариант 2

select V.VarID, V.VarName
from (select 0 S, 13 E 
	union all select 13, 5 
	union all select 18, 2 
	union all select 20, 4) X
left join Var V on V.VarName = SUBSTRING ('НаименованиеМассаННДата', X.S, X.E)


К сообщению приложен файл. Размер - 12Kb
12 мар 14, 17:46    [15712363]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в оптимизации запроса  [new]
aleks2
Guest
declare @t table (s nvarchar(128) primary key clustered);

insert @t values('Наименование'), ('Масса'), ('НН'), ('Дата');


select V.VarID, V.VarName
from Var V inner join @t t on t.s = V.VarName;
12 мар 14, 17:54    [15712426]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в оптимизации запроса  [new]
wizli
Member

Откуда: Minsk
Сообщений: 270
Davulcu, А на таблице Var навешаны, какие-либо индексы?
Просто может медленно из-за того, что там нет индексов, а не потому что, в условие in слишком много значений.
12 мар 14, 18:00    [15712472]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в оптимизации запроса  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8584
Постройте покрывающий индекс по VarName.
create index ix1 on [var] (VarName) include (VarID)
12 мар 14, 18:17    [15712578]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в оптимизации запроса  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
Davulcu,

Davulcu
т.к. переменных в условии много, то конструкция IN сильно снижает быстродействие (Вариант 1)

Присоединяюсь к вопросу выше, вы уверены что запрос работает медленно именно из-за количества условий, а не самого факта наличия такой проверки?

Т.е., грубо говоря, если вы комментируете всю проверку и работает быстро, включаете проверку - медленно - дело может быть не в количестве условий IN. Вообще количество условий в IN имеет некоторую логику основанную на "магических" числах, например с 16 констант в IN оптимизатор может вынести проверку из scan + residual predicate в filter + scan. А с 65 заменить условие IN сканированием таблицы констант.
+
use opt;
go
set statistics xml on;
select * from t1 where b in (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15)
select * from t1 where b in (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16)
select * from t1 where a in 
(
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,
35,36,37,38,39,40,41,42,43,44,45,46,47,47,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65
)
select * from t1 where a in 
(
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,
35,36,37,38,39,40,41,42,43,44,45,46,47,47,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66
)
set statistics xml off

Картинка с другого сайта.

Но вряд ли дело в этом, при наличии нужных индексов все варианты должны нормально работать. Посмотрите, что говорит план.

Телепатически, можно предположить, что нет нужного индекса. Кроме того, если список может быть большим, я бы воспользовался приемом который продемонстрировал aleks2, разве что выбрал бы временную таблицу, а не табличную переменную.
12 мар 14, 18:40    [15712697]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить