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

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

31.01.2025 13:40


13.04.2015 15:40
"Медленный" - это даже слишком ласковая характеристика. Полный перенос данных после очистки аналитики у нас занимает 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.PayCash, XOut.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.SupplierInvoice, XOut.Invoice),
         nvl(XIn.SupplInvoiceCreate, XOut.InvoiceDate),
         H.TotalSumVAT
    from (select H.DocType,
                 H.ID,
                 TRUNC(H.CreatedAt) CreatedAt,
                 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.UserOp) H,
         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
Сверить структуры с эталоном, убедиться в наличии индексов на таблице smdoclog
их должно быть
SMCDOCLOG_PK (EVENTTIME, RECID)
SMDOCLOG_ACIDX (DOCTYPE, ACTIONCODE)
SMDOCLOG_IDIDX (ID, DOCTYPE)
SMDOCLOG_TEIDX (DOCTYPE, EMPLOYEE)
13.04.2015 15:52
Версия Oracle? Супермага? Почему бы не закрыть период? Используешь ли опт? Размер БД?
Рассказал, на самом деле, достаточно мало, чтобы посоветовать что-то конкретное, но для начала можно сравнить план запроса до и после сбора статистики.
13.04.2015 15:53
Цитата:
kadr Сверить структуры с эталоном, убедиться в наличии индексов на таблице smdoclog
статистика бы тут не помогала...
14.04.2015 01:46
это понятно, что мало рассказал. я пока даже не могу сообразить, что рассказать ))

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

оракл 11.2.0.3

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

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

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

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

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

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