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

Откуда: msk
Сообщений: 10
добрый день!
подскажите, пожалуйста, как можно успростить-ускорить
отбираю по людям документы за период. разных типов, из нескольких таблиц, select такого вида:

insert into #T
select Empl, dt1, dt2 from
(
select t11 as Empl,
(case when t12<@dt1 then @dt1 else t12 end) as dt1,
(case when ((t13>@dt2) OR (t13='19000101')) then @dt2 else t13 end) as dt2
from t1
where t15 = '01'

union

select t21 as Empl,
(case when t22<@dt1 then @dt1 else t22 end) as dt1,
(case when t23>@dt2 then @dt2 else t23 end) as dt2
from t2
where t25 = '02'

union

select t31 as Empl,
(case when t32<@dt1 then @dt1 else t32end) as dt1,
(case when t33>@dt2 then @dt2 else t33 end) as dt2
from t3
where t35 = '03'
) a
join tt on tt1 = Empl
where ((charindex(RTrim(a.Empl),RTrim(@EmplList))>0 and @EmplList>'') or (@EmplList=''))

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

оптимизировать пытаюсь запихнув людей во временную таблицу и потом селект из нее, и джойнить все остальное, в итоге получилась некрасивая конструкция вида:

select tt1 as Empl into #pers from tt where ((charindex(RTrim(tt1),RTrim(@EmplList))>0 and @EmplList>'')

insert into #T (Empl, dt1, dt2)

select t11 as Empl,
(case when t12<@dt1 then @dt1 else t12 end) as dt1,
(case when ((t13>@dt2) OR (t13='19000101')) then @dt2 else t13 end) as dt2
from #pers
join t1 on t11 = Empl
where t15 = '01'

union

select t21 as Empl,
(case when t22<@dt1 then @dt1 else t22 end) as dt1,
(case when t23>@dt2 then @dt2 else t23 end) as dt2
from #pers
join t2 on t21 = Empl
where t25 = '02'

union

select t31 as Empl,
(case when t32<@dt1 then @dt1 else t32end) as dt1,
(case when t33>@dt2 then @dt2 else t33 end) as dt2
from #pers
join t3 on t31 = Empl
where t35 = '03'

получается, конечно, быстрее в три раза, но кажется мне, что сделать можно куда как красивше и изящнее...
23 дек 09, 17:28    [8109253]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом. пажалуста)  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
индексы построить, разобрать каждый запрос сколько выполняется по времени.
не помогает - тогда структуру таблиц в студию и сколько строк в каждой таблице

для спящего время бодрствования равносильно сну
23 дек 09, 17:33    [8109288]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом. пажалуста)  [new]
homyak
Member

Откуда: msk
Сообщений: 10
Алексей2003,
спасибо
индексы правда не на всех таблицах есть... начну тогда с них)
23 дек 09, 17:39    [8109337]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом. пажалуста)  [new]
iljy
Member

Откуда:
Сообщений: 8711
homyak,

интересно, какой индекс вам поможет отработать ТАКОЕ
((charindex(RTrim(a.Empl),RTrim(@EmplList))>0 and @EmplList>'') or (@EmplList=''))
? Никакой, только полный скан таблицы. Так что начинать надо с переделки условия, а именно - разбора @EmpList в таблицу и соединения с ней.
23 дек 09, 18:12    [8109526]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить