Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M Новый топик    Ответить
 Помогите отработать говнокод:)  [new]
dartveider13
Member

Откуда: Омск
Сообщений: 701
Опять же после нашего великого обновления Cache, осталась еще одна проблема выборки платежей из базы, но в отличии от предыдущей моей темы (<Maxstring>File+6^%qarmac), этот запрос теперь виснет намертво... Получается что тут кроется какой то говнокод. Сам уже перечитал раз на 100 этот запрос, но к сожалению пока понять не могу почему зависает. Сам запрос предоставляю. Понимаю что для пущей необходимости нужен DDL таблицы. Я его постараюсь после обеда достать, а пока вот сам скул-код)
+
select 
  
IsNull(ENTNMB, 65999999999) as ENTNMB,
  
cast(IsNull(GOD, 2000) as numeric(4,0)) as GOD,
  
cast(IsNull(KVARTAL, 0) as numeric(2,0)) as KVARTAL,
  
SUM(PAY_SUM_STRas STR,
  
SUM(PAY_SUM_NAKas NAK
from 
(
  
select 
    
cast(Insurerfk->RegNumberPFR as numeric(12,0)) as ENTNMB,
    
PAY_SUM_STR,
    
PAY_SUM_NAK,
    
YEAR(PayDateas GOD,
    
case 
      when 
YEAR(PayDate) = 2010 then
        case
          when 
(MONTH(PayDate) between 1 and 6) then 1
          
when (MONTH(PayDate) between 7 and 12) then 2
        
end
      else 
        case
          when 
(MONTH(PayDate) between 1 and 3) then 1
          
when (MONTH(PayDate) between 4 and 6) then 2
          
when (MONTH(PayDate) between 7 and 9) then 3
          
when (MONTH(PayDate) between 10 and 12) then 4
        
end
    end as 
KVARTAL
  
from
    
(
    /* нефиктивные приходные платежи по банку */
    
select
      
Id,
      
Insurerfk
      
case when (IsIncome = 1) and (KBKFK = 39210202010061000160) then "SUM" 
         
when (IsIncome = 0) and (KBKFK = 39210202010061000160) then -"SUM" 
         
else 
      
end as PAY_SUM_STR
        
case when (IsIncome = 1) and (KBKFK = 39210202020061000160) then "SUM" 
           
when (IsIncome = 0) and (KBKFK = 39210202020061000160) then -"SUM"
        
else 0
      
end as PAY_SUM_NAK,
      
DateBankOut as PayDate
    
from
      
ASV_Entities.Payment
    
where
      
(IsFiction = 0) 
      and (
IsIncome = 1) 
      and (
InnerBankDocumentNumber is null)
      and (
KBKFK = 39210202010061000160 or KBKFK = 39210202020061000160)
      and (
IsComposite = 0)
    
union
    
/* внебанковские приходы + все расходы */
      
select
        
case 
          when 
q1.InsurerFK is null then q2.Id
          
else q1.Id
        
end as Id,
        
case 
          when 
q1.InsurerFK is null then q2.InsurerFK
          
else q1.InsurerFK
        
end as Insurerfk,
        
case 
          when 
q1.InsurerFK is null then 
            case when 
q2.IsFiction = 0 then 
              
q2.PAY_SUM_STR
            
else 
              
0  
            
end
          when 
q2.InsurerFK is null then q1.PAY_SUM_STR
          
else q1.PAY_SUM_STR q2.PAY_SUM_STR
        
end as PAY_SUM_STR,
        
case 
          when 
q1.InsurerFK is null then 
            case when 
q2.IsFiction = 0 then 
              
q2.PAY_SUM_NAK
            
else 
              
0  
            
end
          when 
q2.InsurerFK is null then q1.PAY_SUM_NAK
          
else q1.PAY_SUM_NAK q2.PAY_SUM_NAK
        
end as PAY_SUM_NAK,        
        
case 
          when 
q1.InsurerFK is null then q2.PayDate
          
when q2.InsurerFK is null then q1.PayDate
          
else q2.PayDate
        
end as PayDate          
      
from
      
/* внебанковские приходные платежи */
(      
select
        
Id,
        
InnerBankDocumentNumber,
        
Insurerfk
        
"SUM",
        
case when (IsIncome = 1) and (KBKFK = 39210202010061000160) then "SUM" 
           
when (IsIncome = 0) and (KBKFK = 39210202010061000160) then -"SUM" 
           
else 
        
end as PAY_SUM_STR
          
case when (IsIncome = 1) and (KBKFK = 39210202020061000160) then "SUM" 
             
when (IsIncome = 0) and (KBKFK = 39210202020061000160) then -"SUM"
          
else 0
        
end as PAY_SUM_NAK,
        
DateBankOut as PayDate
      
from
        
ASV_Entities.Payment
      
where
        
(IsFiction = 0) 
        and (
IsIncome = 1) 
        and  (not 
InnerBankDocumentNumber is null)
        and (
IsComposite = 0) 
  ) 
q1                                               
  
full join  
  
(
      /* внебанковские "парные" расходные платежи */
      
select 
        
Id,  
                
InnerBankDocumentNumber,
        
Insurerfk
        
"SUM",
        
IsFiction,
        
case when (not InnerBankDocumentNumber is null) or (not OrdersFolderFK is nullthen
          case when 
(not OrdersFolderFK is nullthen 
            case when 
(OrdersFolderFK->BaseDocumentInternalType 'ClarifyPayment') or (OrdersFolderFK->BaseDocumentInternalType 'RepaymentResolution'then 
              
cast(OrdersFolderFK->BaseDocumentDate as date)
            
else
              
DateBankOut
            
end  
          else 
            case when 
(not InnerBankDocumentDate is nullthen
              
InnerBankDocumentDate  
            
else
              
DateBankOut
            
end
          end  
        else
          
DateBankOut       
        
end  as PayDate,
        
case when (IsIncome = 1) and (KBKFK = 39210202010061000160) then "SUM" 
           
when (IsIncome = 0) and (KBKFK = 39210202010061000160) then -"SUM" 
           
else 
        
end as PAY_SUM_STR
          
case when (IsIncome = 1) and (KBKFK = 39210202020061000160) then "SUM" 
             
when (IsIncome = 0) and (KBKFK = 39210202020061000160) then -"SUM"
          
else 0
        
end as PAY_SUM_NAK
      
from
        
ASV_Entities.Payment
      
where
        
(IsIncome = 0)
        and (
KBKFK = 39210202010061000160 or KBKFK = 39210202020061000160)
        and (
IsComposite = 0)
  ) 
q2      
  
on
    
(q1.InsurerFK q2.InsurerFK and q1.InnerBankDocumentNumber q2.InnerBankDocumentNumber and q1."SUM" q2."SUM")    
  )
)
group by 
  
EntNmbGodKvartal
23 янв 13, 09:13    [13813261]     Ответить | Цитировать Сообщить модератору
 Re: Помогите отработать говнокод:)  [new]
Блок А.Н.
Member

Откуда: Новосибирск
Сообщений: 3811
Не читал, но осуждаю :)
Во-первых, скорее всего запрос не виснет, а просто долго делается. Какой размер данных примерно?
Во-вторых, если у вас более-менее современный вариант каше, то там в портале можно посмотреть план запроса. Почитайте его внимательно, там много интересного будет, в частности будет указано, какие индексы используются. Бывает, что используются не те индексы, либо вообще индексы не используются. Навскидку можно попробовать перестроить селективности
d $system.SQL.TuneTable("название таблицы",1,1)

В-третьих, хорошо бы поразбирать запрос на кусочки и проверить, какой именно тормозит, в таком большом с ходу понять мне, например, сложно, что зачем должно делаться.
23 янв 13, 09:42    [13813397]     Ответить | Цитировать Сообщить модератору
 Re: Помогите отработать говнокод:)  [new]
krvsa
Member

Откуда: г Волжский
Сообщений: 13298
dartveider13
Получается что тут кроется какой то говнокод.

А ребята там явно работящие!
23 янв 13, 10:13    [13813557]     Ответить | Цитировать Сообщить модератору
 Re: Помогите отработать говнокод:)  [new]
dartveider13
Member

Откуда: Омск
Сообщений: 701
Просто работаю еще только 4 месяц... Тот который до меня был раньше ушел и поэтому сижу сам разгребаю... Грамотешки еще не особо хватает. Кстати чо то я прогнал. Запрос действительно работает только думает около 4 минут.
23 янв 13, 11:03    [13813871]     Ответить | Цитировать Сообщить модератору
 Re: Помогите отработать говнокод:)  [new]
servit
Member

Откуда: г. Кишинёв, Республика Молдова
Сообщений: 3120
Блог
dartveider13,

Попробуйте включить подсказку %NOUNIONOROPT.
Если подобных запросов много, то лучше на уровне системы.
Не забудьте после этого удалить закешированные запросы и запустите запрос снова: увеличится скорость?
23 янв 13, 11:22    [13814000]     Ответить | Цитировать Сообщить модератору
 Re: Помогите отработать говнокод:)  [new]
dartveider13
Member

Откуда: Омск
Сообщений: 701
Я бы с радостью, но доступа к самой СУБД я не имею. У меня есть самопальная программа, написанная на Delphi, Которая позволяет мне просматривать таблицы данной БД и делать выбоки из них
23 янв 13, 17:34    [13817133]     Ответить | Цитировать Сообщить модератору
 Re: Помогите отработать говнокод:)  [new]
servit
Member

Откуда: г. Кишинёв, Республика Молдова
Сообщений: 3120
Блог
dartveider13,

А в сам запрос вставить подсказку можете?
23 янв 13, 18:24    [13817467]     Ответить | Цитировать Сообщить модератору
 Re: Помогите отработать говнокод:)  [new]
dartveider13
Member

Откуда: Омск
Сообщений: 701
Да, могу, только я не пробовал использовать подсказки. Подскажите куда ее надо вставлять
24 янв 13, 06:20    [13819116]     Ответить | Цитировать Сообщить модератору
 Re: Помогите отработать говнокод:)  [new]
servit
Member

Откуда: г. Кишинёв, Республика Молдова
Сообщений: 3120
Блог
dartveider13
Подскажите куда ее надо вставлять
Непосредственно за FROM (ссылку на документацию дал выше, посмотрите начало страницы).
24 янв 13, 10:01    [13819680]     Ответить | Цитировать Сообщить модератору
 Re: Помогите отработать говнокод:)  [new]
Аленочка
Member

Откуда: Владик
Сообщений: 2162
ужас..
сделайте часть полей через хранимки хотя бы, хотя бы улучшит читабельность кода
28 янв 13, 08:43    [13837238]     Ответить | Цитировать Сообщить модератору
 Re: Помогите отработать говнокод:)  [new]
Андрей Васильевич
Member

Откуда:
Сообщений: 281
узнаю код. это база ПТК АСВ :-)
11 фев 13, 11:24    [13907354]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Помогите отработать говнокод:)  [new]
dartveider13
Member

Откуда: Омск
Сообщений: 701
Андрей Васильевич
узнаю код. это база ПТК АСВ :-)


Да да... Она самая))) Единственная вещь помоему написанная на СУБД Cache в России
11 сен 14, 17:02    [16565116]     Ответить | Цитировать Сообщить модератору
 Re: Помогите отработать говнокод:)  [new]
DAiMor
Member

Откуда: Volzhsky -> Moscow -> CZ, Brno -> Moscow
Сообщений: 2732
dartveider13
Андрей Васильевич
узнаю код. это база ПТК АСВ :-)


Да да... Она самая))) Единственная вещь помоему написанная на СУБД Cache в России
Я наверно вас удивлю, но на Cache в России написано много проектов, и новые появляется.
11 сен 14, 17:07    [16565149]     Ответить | Цитировать Сообщить модератору
Все форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M Ответить