Форум OlegON > Компьютеры и Программное обеспечение > Операционные системы и программное обеспечение > Oracle

очень медленный перенос в аналитику перед расчетом ТД в СМ+ : Oracle

29.03.2024 3:52


13.04.2015 15:40
akonev
 
"Медленный" - это даже слишком ласковая характеристика. Полный перенос данных после очистки аналитики у нас занимает 3.5 часа. Долгонько, но приемлемо.

Частичный - который только изменения от последнего переноса - на нашей базе должен работать ~15 минут. В реальности же перенос не завершается и через 6 часов. Уходит отбирать документы и не возвращается.

При этом работает вот такой запрос
запрос:
SQL код:
insert /*+ APPEND NOLOGGING */
into TTFIFOChangedDocs
  
(RowIdx,
   
DocType,
   
ID,
   
CreatedAt,
   
OpCode,
   
LocationFrom,
   
LocationTo,
   
PayCash,
   
TotalSum,
   
ClientIndex,
   
GoodsOwner,
   
CurrencyType,
   
CurrencyRate,
   
CurrencyMultOrder,
   
IsRoubles,
   
TotalSumCur,
   
UserOp,
   
SupplierDoc,
   
SupplierInvoice,
   
SupplInvoiceCreate,
   
TotalSumVAT)
  
select ROWNUM,
         
H.DocType,
         
H.ID,
         
H.CreatedAt,
         
H.OpCode,
         
H.LocationFrom,
         
H.LocationTo,
         
nvl(nvl(XIn.PayCashXOut.PayCash),
             
decode(H.DocType,
                    :
"SYS_B_00",
                    :
"SYS_B_01",
                    :
"SYS_B_02",
                    :
"SYS_B_03",
                    :
"SYS_B_04")) PayCash,
         
H.TotalSum,
         
H.ClientIndex,
         
nvl(XIn.GoodsOwner, :"SYS_B_05"),
         
H.CurrencyType,
         
H.CurrencyRate,
         
H.CurrencyMultOrder,
         
H.IsRoubles,
         
H.TotalSumCur,
         
H.UserOp,
         
XIn.SupplierDoc,
         
nvl(XIn.SupplierInvoiceXOut.Invoice),
         
nvl(XIn.SupplInvoiceCreateXOut.InvoiceDate),
         
H.TotalSumVAT
    from 
(select H.DocType,
                 
H.ID,
                 
TRUNC(H.CreatedAtCreatedAt,
                 
H.OpCode,
                 
H.LocationFrom,
                 
H.LocationTo,
                 
H.TotalSum,
                 
H.ClientIndex,
                 
H.CurrencyType,
                 
H.CurrencyRate,
                 
H.CurrencyMultOrder,
                 
H.IsRoubles,
                 
H.TotalSumCur,
                 
H.UserOp,
                 
nvl(sum(T.TaxSum), :"SYS_B_06"TotalSumVAT
            from 
(select D.ID,
                         
D.DocType,
                         
D.CreatedAt,
                         
D.LocationFrom,
                         
D.LocationTo,
                         
D.OpCode,
                         
D.UserOp,
                         
D.ClientIndex,
                         
D.CurrencyType,
                         
D.CurrencyRate,
                         
D.CurrencyMultOrder,
                         
D.IsRoubles,
                         
D.TotalSum,
                         
D.TotalSumCur
                    from SMDocuments D
                   where D
.DocType in
                         
(:"SYS_B_07", :"SYS_B_08", :"SYS_B_09", :"SYS_B_10",
                          :
"SYS_B_11", :"SYS_B_12", :"SYS_B_13", :"SYS_B_14")
                     and 
D.CreatedAt <= to_date(:"SYS_B_15", :"SYS_B_16")
                     and 
D.DocState = :"SYS_B_17"
                     
and D.CreatedAt >= to_date(:"SYS_B_18", :"SYS_B_19")
                     and (
D.CreatedAt to_date(:"SYS_B_20", :"SYS_B_21") or
                         
exists
                          
(select :"SYS_B_22"
                             
from SMDocLog L
                            where L
.DocType D.DocType
                              
and L.ID D.ID
                              
and (L.EventTime >
                                  
to_date(:"SYS_B_23", :"SYS_B_24") and
                                  
L.EventTime <=
                                  
to_date(:"SYS_B_25", :"SYS_B_26"))))) H,
                 
SMDocTax T
           where T
.DocType(+) = H.DocType
             
and T.DocID(+) = H.ID
             
and T.TaxId(+) = :"SYS_B_27"
           
group by H.DocType,
                    
H.ID,
                    
TRUNC(H.CreatedAt),
                    
H.OpCode,
                    
H.LocationFrom,
                    
H.LocationTo,
                    
H.TotalSum,
                    
H.ClientIndex,
                    
H.CurrencyType,
                    
H.CurrencyRate,
                    
H.CurrencyMultOrder,
                    
H.IsRoubles,
                    
H.TotalSumCur,
                    
H.UserOpH,
         
SMWayBillsIn XIn,
         
SMWayBillsOut XOut
   where H
.DocType XIn.DocType(+)
     and 
H.ID XIn.ID(+)
     and 
H.DocType XOut.DocType(+)
     and 
H.ID XOut.ID(+) 


в это время ожидания дискового ввода-вывода на два порядка превышают все остальные

штатные 15 минут на перенос получаются, если непосредственно перед запуском переноса прогнать сбор статистики
по журналу документов
SQL код:
analyze table smdoclog compute statistics
занимает это минут 10, запущенный после этого перенос работает, как положено.
причем статистику надо собрать именно так. dbms_stats такого эффекта не дает.

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

Вопрос: чего бы такого помониторить, поискать, подергать? хочется нащупать путь, как вернуть нормальное время переноса.
13.04.2015 15:49
kadr
 
Сверить структуры с эталоном, убедиться в наличии индексов на таблице smdoclog
их должно быть
SMCDOCLOG_PK (EVENTTIME, RECID)
SMDOCLOG_ACIDX (DOCTYPE, ACTIONCODE)
SMDOCLOG_IDIDX (ID, DOCTYPE)
SMDOCLOG_TEIDX (DOCTYPE, EMPLOYEE)
13.04.2015 15:52
OlegON
 
Версия Oracle? Супермага? Почему бы не закрыть период? Используешь ли опт? Размер БД?
Рассказал, на самом деле, достаточно мало, чтобы посоветовать что-то конкретное, но для начала можно сравнить план запроса до и после сбора статистики.
13.04.2015 15:53
OlegON
 
Цитата:
kadr Сверить структуры с эталоном, убедиться в наличии индексов на таблице smdoclog
статистика бы тут не помогала...
14.04.2015 01:46
akonev
 
это понятно, что мало рассказал. я пока даже не могу сообразить, что рассказать ))

индексы проверял, ребилдил

оракл 11.2.0.3

супермаг 1.030.4 сп3

опт бегает, но у меня от 20 ночей и более в месяц - ревизии. соответственно, он работать не может, отпадает по "СТОП" в сличилке.

DB Size : 270Gb - это опт так говорит

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

план до статистики добуду, ага. но только на выходных. потому что без статистики оно в 10 случаях из 10 подвисает. придется снова чистить аналитику и делать полный перенос.
добуду - тогда поглядим, посравниваем.
14.04.2015 08:56
OlegON
 
Внимательно проверь, какие задания у тебя в БД работают по ночам. Системные. Там виндовый подход "напхаем, чтобы все было" при штатном создании базы и большинство заданий надо отрубить.
Часовой пояс GMT +3, время: 03:52.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.