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

Откуда:
Сообщений: 681
Запрос:

select a, (select count(b) from tab2 where b =1),(select count(b) from tab2 where b=2) from tab1

Как его можно улучшить? Что бы не использовать вложенные запросы.
23 сен 13, 16:21    [14873677]     Ответить | Цитировать Сообщить модератору
 Re: Как оптимизировать запрос  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 33918
Блог
declare @x1 int, @x2 int
set @x1 = (select count(b) from tab2 where b=1)
set @x2 = (select count(b) from tab2 where b=2)

select a, @x1, @x2 from tab1
23 сен 13, 16:30    [14873720]     Ответить | Цитировать Сообщить модератору
 Re: Как оптимизировать запрос  [new]
beaver06
Member

Откуда:
Сообщений: 681
Критик,

так это то же самое, и не одним запросом.
А мне надо одним.
23 сен 13, 16:32    [14873732]     Ответить | Цитировать Сообщить модератору
 Re: Как оптимизировать запрос  [new]
KRS544
Member

Откуда:
Сообщений: 497
select a
, sum(case b when 1 then 1 else 0 end) as x1
, sum(case b when 2 then 1 else 0 end) as x2
from tab1
23 сен 13, 16:35    [14873744]     Ответить | Цитировать Сообщить модератору
 Re: Как оптимизировать запрос  [new]
KRS544
Member

Откуда:
Сообщений: 497
group by забыл
23 сен 13, 16:39    [14873763]     Ответить | Цитировать Сообщить модератору
 Re: Как оптимизировать запрос  [new]
Гость333
Member

Откуда:
Сообщений: 3683
select t1.a, t.cnt_b1, t.cnt_b2
from tab1 t1
     cross apply
     (
       select sum(case when b = 1 then 1 else 0 end) as cnt_b1,
              sum(case when b = 2 then 1 else 0 end) as cnt_b2
       from   tab2
       where  b in (1,2)
     ) t
23 сен 13, 16:48    [14873802]     Ответить | Цитировать Сообщить модератору
 Re: Как оптимизировать запрос  [new]
where
Guest
KRS544
select a
, sum(case b when 1 then 1 else 0 end) as x1
, sum(case b when 2 then 1 else 0 end) as x2
from tab1


where b in (1,2)

а то вдруг там индекс по b есть
23 сен 13, 16:55    [14873845]     Ответить | Цитировать Сообщить модератору
 Re: Как оптимизировать запрос  [new]
KRS544
Member

Откуда:
Сообщений: 497
Только заметил, что таблицы разные...
select 1 as a
into #tab1
union select 2 as a
union select 3 as a
union select 4 as a
union select 5 as a

select 1 as b
into #tab2
union all select 1 as b
union all select 2 as b
union all select 2 as b
union all select 2 as b

select a,x1,x2
from #tab1 cross join
 (select  sum(case b when 1 then 1 else 0 end) as x1
         ,sum(case b when 2 then 1 else 0 end) as x2
  from #tab2
  where b in (1,2)) as t1


drop table #tab1
drop table #tab2

но не факт, что это быстрее будет...
23 сен 13, 16:57    [14873859]     Ответить | Цитировать Сообщить модератору
 Re: Как оптимизировать запрос  [new]
Remind
Member

Откуда: UK
Сообщений: 523
А с чего вы взяли, что улучшить = не использовать вложенные запросы?
23 сен 13, 17:06    [14873900]     Ответить | Цитировать Сообщить модератору
 Re: Как оптимизировать запрос  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 33918
Блог
KRS544,

мне кажется, ваш первый запрос может вывести меньше строк, чем нужно, а второй - больше )
23 сен 13, 17:07    [14873910]     Ответить | Цитировать Сообщить модератору
 Re: Как оптимизировать запрос  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 33918
Блог
вру, второй вроде нормальный )
23 сен 13, 17:09    [14873922]     Ответить | Цитировать Сообщить модератору
 Re: Как оптимизировать запрос  [new]
Гость333
Member

Откуда:
Сообщений: 3683
KRS544
но не факт, что это быстрее будет...

Будет быстрее, если по b нет индекса. Тогда два сканирования таблицы tab2 заменяются на одно.
23 сен 13, 17:12    [14873939]     Ответить | Цитировать Сообщить модератору
 Re: Как оптимизировать запрос  [new]
Алексей Куренков
Member [заблокирован]

Откуда: Москва
Сообщений: 567
beaver06,
может так? ))
select a, (select count(b) from tab2 where b =1),(select count(b) from tab2 where b=2) from tab1
select a,
    count(case when b=1 then 1 else null end) over (),
    count(case when b=2 then 1 else null end) over ()
from tab1
where b in (1,2)
23 сен 13, 20:07    [14874587]     Ответить | Цитировать Сообщить модератору
 Re: Как оптимизировать запрос  [new]
Алексей Куренков
Member [заблокирован]

Откуда: Москва
Сообщений: 567
beaver06,

сори не увидел что сумма из 2й таблицы. Вам дали правильные ответы хоть с JOIN хоть с APPLY...
23 сен 13, 20:22    [14874609]     Ответить | Цитировать Сообщить модератору
 Re: Как оптимизировать запрос  [new]
prog882
Guest
beaver06,

declare @tab1 table(a int)
declare @tab2 table(b int)

insert @tab1
select 1 as a union all
select 2 as a union all
select 3 as a union all
select 4 as a union all
select 5 as a

insert @tab2
select 1 as b union all
select 2 as b union all
select 2 as b union all
select 2 as b

select a, 
x1=SUM(case b when 1 then 1 else 0 end),
x2=SUM(case b when 2 then 1 else 0 end)
from @tab1 inner join @tab2 on b in (1,2)
group by a
24 сен 13, 08:34    [14875652]     Ответить | Цитировать Сообщить модератору
 Re: Как оптимизировать запрос  [new]
beaver06
Member

Откуда:
Сообщений: 681
Спасибо всем большое!
Увидел много интересных решений.
24 сен 13, 09:03    [14875711]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить