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

Откуда:
Сообщений: 9
Есть проблема со временем выполнения запроса. Очень хотелось бы его оптимизировать. Чувствую что что-то не так делаю, но преобразовать ни как не получается.
Проблема в том, что в зависимости от условия нужно записать значение либо в одну, либо в другую переменную:

...
declare
@P   integer,       
@S   integer,   
@P1   integer,       
@S1   integer,     
@P2   integer,  
@S2   integer
...
Begin 
   (
     select 
        @P1 = count(distinct(t.pole1 + t.pole2)),
        @S1 = count(distinct(t.pole1 + t.pole2 + t.pole3))
        from Table1 t
        join Table2 ...
        join Table3 ...
        where 1=1--некоторые условия
   )
                                    
   (
     select 
       @P2 = count(distinct(t.pole1 + t.pole2)),
       @S2 = count(distinct(t.pole1 + t.pole2 + t.pole3))
       from Table1 t
       join Table2 ...
       join Table3 ...
       join Table4 ...
       where 2=2-- не много другие условия чем в предыдущем                                                        
   )

   set @P = (@P1-@P2) 
   set @S = (@S1-@S2) 
End     


Как видно из кода, соответствующие переменные P1-P2-P и S1-S2-S, заполняются из одних и тех же полей, одной и той же таблицы. Разница только в условии отбора записей. Переменные эти потом нужны для вычисления. Таблица Table1 просто огромная, и выборка происходит крайне долго. Можно ли как-то оптимизировать? Я завис...
Заранее спасибо!
28 фев 16, 15:35    [18873791]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31427
koly4ii
Можно ли как-то оптимизировать?
Можно сделать всё в одном запросе, при этом в where записать общие условия, а различия написать в CASE, вставив его в вычисление COUNT (и помня, что значения NULL в COUNT не считаются), или заменить COUNT на SUM+CASE.
28 фев 16, 16:49    [18873946]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Mike_za
Member

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

Индексы? Полное выражение в where приведите
28 фев 16, 18:28    [18874257]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
_djХомяГ
Guest
[url=][/url]
Mike_za
koly4ii,

Индексы? Полное выражение в where приведите

Думаю ТС скорее интересует написание более изящного кода (рефакторинг) нежели время выполнения запроса
28 фев 16, 18:32    [18874274]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
_djХомяГ
Guest
Mike_za
Сорри Беру слова обратно Ключевая фраза выборка происходит крайне долго
28 фев 16, 18:44    [18874311]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
значение либо в одну
Guest
koly4ii,

шо там план? в where триллион конвертаций, даты хранятся в строках, кроме ПК никаких индексов?
28 фев 16, 19:54    [18874507]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
koly4ii
Member [заблокирован]

Откуда:
Сообщений: 9
alexeyvg,
alexeyvg
Можно сделать всё в одном запросе, при этом в where записать общие условия, а различия написать в CASE, вставив его в вычисление COUNT (и помня, что значения NULL в COUNT не считаются), или заменить COUNT на SUM+CASE.


А по конкретней? Пытался с CASE? что-то придумать, но всё время ошибки получаются...
29 фев 16, 08:45    [18875734]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
koly4ii
Member [заблокирован]

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

Сейчас всё напишу.
29 фев 16, 08:47    [18875736]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
koly4ii
Member [заблокирован]

Откуда:
Сообщений: 9
Дело в том, что код не мой, поэтому пытаюсь в нём разобраться. Нашёл место, в котором скорее всего происходит это торможение. В функции используется курсор, а этот запрос уже внутри курсора. Может кто подскажет как заменить курсор на что-то более быстродействующее? Может @@ROWCOUNT или типа того. Вот код:

declare
@P   integer,       
@S   integer,   
@P1   integer,       
@S1   integer,     
@P2   integer,  
@S2   integer,
...

declare CUR1 cursor

for select distinct
      T1.ID1,
      (select T2.ID2 from Table_1 T2 where T2.ID2=T1.ID1) as ID2     
from Table_1 T1
order by T1.ID1

open CUR1
fetch next from CUR1 into @ID2, @ID1
while(@@FETCH_STATUS<>-1)
    begin
      declare CUR2 cursor

      for select 
        T3.ID ,
        T3.NOM
      from @POM_TABLE T3
      order by T3.ID

      open CUR2
      fetch next from CUR2 into @VSPOM, @NPOM
      while(@@FETCH_STATUS<>-1)
         Begin

if (@VSPOM=1) Begin
   (
     select 
        @P1 = count(distinct(t.pole1 + t.pole2)),
        @S1 = count(distinct(t.pole1 + t.pole2 + t.pole3))
        from Table1 t
        join Table2 TT2...
        join Table3 ...
        where TT2.ID = @ID2
        ...
   )
                                    
   (
     select 
       @P2 = count(distinct(t.pole1 + t.pole2)),
       @S2 = count(distinct(t.pole1 + t.pole2 + t.pole3))
       from Table1 t
       join Table2 TT2 ...
       join Table3 ...
       join Table4 ...
       where TT2.ID = @ID2                                                      
   )

   set @P = (@P1-@P2) 
   set @S = (@S1-@S2) 
End 

if (@VSPOM=2) Begin
...
End 

if (@VSPOM=3) Begin
...
End 

if (@VSPOM=4) Begin
...
End 

if (@VSPOM=5) Begin
...
End 

fetch next from CUR2 into @VSPOM, @NPOM 
        end
      deallocate CUR2  
   
      fetch next from CUR1 into @ID2, @ID1
    end 
  deallocate CUR1


Получается что в запросе 2 цикла с курсорами. Причем далее в условиях запросов используется переменная @ID2, заполняемая в курсоре CUR1. Я думаю, что проблема производительности в этом. Может кто-нибудь предложить как от этого уйти и уменьшить время выполнения функции??
29 фев 16, 09:18    [18875780]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Glory
Member

Откуда:
Сообщений: 104760
koly4ii
Может кто подскажет как заменить курсор на что-то более быстродействующее?

- Узнать задачу
- Написать код для решения этой задачи
29 фев 16, 09:24    [18875793]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
koly4ii
Member [заблокирован]

Откуда:
Сообщений: 9
значение либо в одну,

С индексами и данными всё в порядке. Проблема в самой функции
29 фев 16, 09:24    [18875795]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
koly4ii
Member [заблокирован]

Откуда:
Сообщений: 9
Опять я начал сомневаться, что проблема в курсоре. Напишу подробнее одну из выборок.

...
select 
        @P1 = count(distinct(t.pole1 + t.pole2)),
        @S1 = count(distinct(t.pole1 + t.pole2 + t.pole3))
        from Table1 T1
        join Table2 T2 on T2.IDT1 = T.ID
        join Table3 T3 on T3.ID = T2.IDT3
        join Table4 T4 on T4.ID = T3.IDT4
        join Table4 T5 on T5.PRODUCT = T3.PRODUCT
        where T1.A = '15-12'
                 and T4.ID_PROD = 'AA'
                 and T5.ID_DOP = 5
                 and ((T2.ID3=10) or
                        (T2.ID3=10 in (5,7)   
                         and ((T3.NAME='Y' and T2.NAME = '12345')
                                or (T3.NAME='Y' and T2.NAME between '123' and '567')
                                or (T3.NAME='Y' and T2.NAME between '78' and '90')
                               )
                        )
                       )
...


Эта выборка получается самой долгой. Остальные делаются менее секунду. Эта кружится около минуты. табличка Т3 огромная (десятки миллионов записей).
29 фев 16, 09:52    [18875869]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Glory
Member

Откуда:
Сообщений: 104760
koly4ii
Опять я начал сомневаться, что проблема в курсоре. Напишу подробнее одну из выборок.

На какой ответ рассчитываете ?
Что в вам в ваших 100500 строк кода укажут ту единственную строку, где надо поменять AND на OR что ли ?
29 фев 16, 09:54    [18875876]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Остальные делаются менее
Guest
koly4ii
Опять я начал сомневаться, что проблема в курсоре. Напишу подробнее одну из выборок.

...
select 
        @P1 = count(distinct(t.pole1 + t.pole2)),
        @S1 = count(distinct(t.pole1 + t.pole2 + t.pole3))
        from Table1 T1
        join Table2 T2 on T2.IDT1 = T.ID
        join Table3 T3 on T3.ID = T2.IDT3
        join Table4 T4 on T4.ID = T3.IDT4
        join Table4 T5 on T5.PRODUCT = T3.PRODUCT
        where T1.A = '15-12'
                 and T4.ID_PROD = 'AA'
                 and T5.ID_DOP = 5
                 and ((T2.ID3=10) or
                        (T2.ID3=10 in (5,7)   
                         and ((T3.NAME='Y' and T2.NAME = '12345')
                                or (T3.NAME='Y' and T2.NAME between '123' and '567')
                                or (T3.NAME='Y' and T2.NAME between '78' and '90')
                               )
                        )
                       )
...


Эта выборка получается самой долгой. Остальные делаются менее секунду. Эта кружится около минуты. табличка Т3 огромная (десятки миллионов записей).

и зачем нам эти глупости если с индексами "и данными" все в порядке?
29 фев 16, 09:57    [18875880]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
koly4ii
Member [заблокирован]

Откуда:
Сообщений: 9
Если комментирую условие
and T4.ID_PROD = 'AA'
, то опять же всё отрабатывает быстро, хотя бредово, ибо я наоборот этим условием выборку же ограничиваю... Запутался в край...
29 фев 16, 09:59    [18875883]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Glory
Member

Откуда:
Сообщений: 104760
koly4ii
то опять же всё отрабатывает быстро, хотя бредово, ибо я наоборот этим условием выборку же ограничиваю...

Вы думаете, что чем больше условий, тем быстрее должен работать запрос ?
29 фев 16, 10:00    [18875887]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
koly4ii
Member [заблокирован]

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

Не надо в 100500, достаточно в последней выборке. Надеюсь что кто-то сталкивался с такой проблемой и подскажет как её решить, а не будет попусту писать бесполезные комментарии.
29 фев 16, 10:02    [18875888]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Glory
Member

Откуда:
Сообщений: 104760
koly4ii
Не надо в 100500, достаточно в последней выборке.

Да какая разница
Нет волшебной команды, которая ускоряет любой запрос

koly4ii
Надеюсь что кто-то сталкивался с такой проблемой и подскажет как её решить, а не будет попусту писать бесполезные комментарии.

Вот если сейчас кто-то продолжит постить сюда свой поток сознания, то он столкнется с проблемой бана.
Для начала идете и читаете Рекомендации по офорлению сообщений
Потом выполняете их
29 фев 16, 10:04    [18875897]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
_djХомяГ
Guest
А например это что
 and ((T2.ID3=10) or
                        (T2.ID3=10 in (5,7)  
29 фев 16, 10:09    [18875910]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Не надо в 100500
Guest
koly4ii
Glory,

Не надо в 100500, достаточно в последней выборке. Надеюсь что кто-то сталкивался с такой проблемой и подскажет как её решить, а не будет попусту писать бесполезные комментарии.

вот полезные:
18874507 18875793

вот бесполезные:
18875795 18875888
29 фев 16, 10:11    [18875915]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
koly4ii
Member [заблокирован]

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

автор
Запрещается:
публикация грубых, оскорбляющих и унижающих сообщений. Ненормативная лексика разрешена только в исключительных случаях, когда изъятие нецензурных слов из предложения полностью изменяет смысл сообщения. В случае употребления нецензурных слов, бОльшая часть слова должна быть замаскирована спецсимволами;


Я ни кого не оскорблял, не унижал и т.п.
Создал я это топик с надеждой на помощь. Если Вы не заметили, то Ваши сообщения не сильно помогают. Если же у Вас большое желание меня забанить, то это Ваше право.
29 фев 16, 10:14    [18875924]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить