AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 15.12.2011, 15:01   #1  
Pustik is offline
Pustik
Участник
 
807 / 372 (14) ++++++
Регистрация: 04.06.2004
Чистка черновиков или тормоза на форме "Проекты" AX2009 RU5
У нас есть тестовая база со стандартной логикой. Залили туда некоторые данные из рабочей. Открыл форму "Проекты". И вспомнил как мы столкнулись с жуткими тормозами на этой форме при переходе на АХ2009. При открытии формы "Проекты" на тестовой базе тормоза наблюдаются, но не такие заметные, так как данных мы залили не много. А на рабочей с реальными данными просто жуть.
А все потому, что в табличке ProjTable есть метод:
X++:
public boolean trxExists()
{
    ProjId                  projId = this.ProjId;
    boolean                 ret = true;

    ProjJournalTrans        projJournalTrans;
    LedgerJournalTrans      ledgerJournalTrans;
    InventJournalTrans      inventJournalTrans;
    ProjTransPosting        projTransPosting;
    SalesLine               salesLine;
    PurchLine               purchLine;
    SMAAgreementTable       smaAgreementTable;
    SMASubscriptionTable    smaSubscriptionTable;
    ProjRevenueTrans        projRevenueTrans;
    ProjOnAccTrans          projOnAccTrans;
    SMAServiceOrderLine     smaServiceOrderLine;
    PurchReqTable           purchReqTable;
    PurchRFQCaseTable       purchRFQCaseTable;
    ;

    if (this.Header == NoYes::No)
    {
        if(((select firstonly projJournalTrans      where projJournalTrans.ProjId        == projId).RecId == 0) &&
           ((select firstonly ledgerJournalTrans    where ledgerJournalTrans.AccountNum  == projId &&
                                                          ledgerJournalTrans.AccountType == LedgerJournalACType::Project).RecId == 0) &&
           ((select firstonly inventJournalTrans    where inventJournalTrans.ProjId      == projId).RecId == 0) &&
           ((select firstonly projTransPosting      where projTransPosting.ProjId        == projId).RecId == 0) &&
           ((select firstonly salesLine             where salesLine.ProjId               == projId).RecId == 0) &&
           ((select firstonly purchLine             where purchLine.ProjId               == projId).RecId == 0) &&
           ((select firstonly smaAgreementTable     where smaAgreementTable.ProjId       == projId).RecId == 0) &&
           ((select firstonly smaSubscriptionTable  where smaSubscriptionTable.ProjId    == projId).RecId == 0) &&
           ((select firstonly projRevenueTrans      where projRevenueTrans.ProjId        == projId).RecId == 0) &&
           ((select firstonly projOnAccTrans        where projOnAccTrans.ProjID          == projId).RecId == 0) &&
           ((select firstonly smaServiceOrderLine   where smaServiceOrderLine.ProjId     == projId).RecId == 0) &&
           ((select firstonly purchReqTable         where purchReqTable.ProjId           == projId).RecId == 0) &&
           ((select firstonly purchRFQCaseTable     where purchRFQCaseTable.ProjId       == projId).RecId == 0) &&
           (!this.AssetId))
        {
            ret = false;
        }
    }
    else
    {
        ret = false;
    }

    return ret;
}
он дергается из метода на форме setFieldAccess(), а этот, в свою очередь, стоит в методе active() у главного датасоурса: ProjTable.
Сразу скажу, что мы приняли решение во все таблицы добавить индех по полю ProjId, а в таблицу LedgerJournalTrans по AccountNum,AccountType.Скорректировали запросы в этом методе на IndexHint и все зашуршало.
В основном тормоза были на таблицах projJournalTrans,LedgerJournalTrans,inventJournalTrans,SalesLine,PurchLine. Эти таблицы, можно сказать являются справочниками-черновиками. Вся главная информация лежит в проводках. И у меня возникает вопрос: разработчики не обратили на скорость внимание рассчитывая на то, что черновики периодически должны чиститься или просто не подумали? Но главный вопрос вообще о целесообразности чистки черновиков. Кто-нибудь чистит эти таблицы? У нас эти таблицы не чистятся. Записей очень много.
PS: Тему может быть неудачно назвал. Но ведь можно было назвать и так "Чистка черновиков и Экономия место БД" или как-то еще. Решил так как есть, так как задумался об этом на форме.
__________________
-Ты в гномиков веришь?
-Нет.
-А они в тебя верят, смотри, не подведи их.
За это сообщение автора поблагодарили: lev (5).
Старый 15.12.2011, 15:19   #2  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
я в шоке от кода! это на слое SYS?

меня всегда поражала лень человеческая! ну почему нельзя было написать на табличке ProjTable, методы, которые определяют есть записи по проекту в определенной таблице, или нет? Тогда код был бы намного читабельнее, не такой громоздкий и масштабируемый (можно использовать из любого места в системе)!
ведь приятнее смотреть на код типа:
X++:
if (ProjTable.hasProjJournalTrans()     &&
    ProjTable.hasLedgerJournalTrans() &&
    ProjTable.hasInventJournalTrans() && ...)
+
Хочется добавить, что этот код так же попытались с оптимизировать. Ведь конструкция типа:
X++:
(select firstonly projJournalTrans      where projJournalTrans.ProjId        == projId).RecId
позволяет не использовать переменные, что сокращает размер выделяемой памяти под переменные и ускоряет выполнение запроса, минуя переменные.
Но в начале метода все переменные объявлены! И по сути потом нигде не используются!

В общем я опять в шоке от кода от компании Microsoft
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
За это сообщение автора поблагодарили: Pustik (5).
Старый 15.12.2011, 17:35   #3  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,691 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от Pustik Посмотреть сообщение
В основном тормоза были на таблицах projJournalTrans,LedgerJournalTrans,inventJournalTrans,SalesLine,PurchLine. Эти таблицы, можно сказать являются справочниками-черновиками. Вся главная информация лежит в проводках. И у меня возникает вопрос: разработчики не обратили на скорость внимание рассчитывая на то, что черновики периодически должны чиститься или просто не подумали?
Скорее всего, просто не подумали. Точнее, ошибки тестирования.

Кстати, IndexHint я бы использовать не советовал. Индексы должны подхватится и без них, а сам факт использования хинтов, принуждающих сервер к чему-либо, может выйти "боком" при дальнейшем развитии системы.

Цитата:
Сообщение от Pustik Посмотреть сообщение
Но главный вопрос вообще о целесообразности чистки черновиков. Кто-нибудь чистит эти таблицы? У нас эти таблицы не чистятся. Записей очень много.
Зависит от того, как они используются.

Кто-то уже высказывался в том духе, что как правило, при кастомизации, исходные заказы/закупки/журналы получают ряд дополнительных характеристик (полей), которые не транслируются в проводки. Как следствие, чтобы получить отчеты в разрезе этих характеристик возникает необходимость обратится к этим самым "черновикам"

Другими словами, все крутится вокруг отчетности. Если для составления справок и отчетов эти документы не нужны, то и хранить их нет необходимости.
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
За это сообщение автора поблагодарили: Pustik (5).
Старый 15.12.2011, 18:08   #4  
Pustik is offline
Pustik
Участник
 
807 / 372 (14) ++++++
Регистрация: 04.06.2004
Цитата:
Сообщение от lev Посмотреть сообщение
Хочется добавить, что этот код так же попытались с оптимизировать. Ведь конструкция типа:
X++:
(select firstonly projJournalTrans      where projJournalTrans.ProjId        == projId).RecId
позволяет не использовать переменные, что сокращает размер выделяемой памяти под переменные и ускоряет выполнение запроса, минуя переменные.
Я про это не знал..Спасибо.
__________________
-Ты в гномиков веришь?
-Нет.
-А они в тебя верят, смотри, не подведи их.
Старый 15.12.2011, 18:29   #5  
Pustik is offline
Pustik
Участник
 
807 / 372 (14) ++++++
Регистрация: 04.06.2004
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Зависит от того, как они используются.
Кто-то уже высказывался в том духе, что как правило, при кастомизации, исходные заказы/закупки/журналы получают ряд дополнительных характеристик (полей), которые не транслируются в проводки. Как следствие, чтобы получить отчеты в разрезе этих характеристик возникает необходимость обратится к этим самым "черновикам"
Другими словами, все крутится вокруг отчетности. Если для составления справок и отчетов эти документы не нужны, то и хранить их нет необходимости.
Все просто и понятно. Есть места, где используем дополнительные характеристики, а есть и где не используем.Там где не используем, удалять пока боимся . Хотел услышать от кого-нибудь "как плохо жить", если эти черновики не удалять. Пока негатива нет.Так что будем сохранять.
__________________
-Ты в гномиков веришь?
-Нет.
-А они в тебя верят, смотри, не подведи их.
Старый 15.12.2011, 19:13   #6  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,691 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Ну, из негатива - это размер базы данных. В байтах. Сам факт наличия черновиков существенно его увеличивает. Например, у нас таблица SalesLine уже "переплюнула" по размеру InventSettlement. Сопоставления хоть "свернуть" можно...

Если нет проблем с дисковым пространством, то лично я не вижу причин их удалять. Удаление чего-либо - это всегда риск. Всегда остается некое сомнение "а вдруг понадобится"
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Теги
журнал переноса, заказ, заказ на перемещение, заказ на покупку, заказ на продажу, закупка, складские журналы

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Сюрприз Edit-метода AX2009 RU5 Pustik DAX: Программирование 12 22.09.2011 21:38
AX2009 RU5: невозможно открыть "журнал восстановления НДС"... EVGL DAX: Функционал 8 09.09.2010 23:20
поле "Документы к обновлению" в форме "Обработка закупки" sev DAX: Функционал 3 08.12.2005 17:21
Как сбросить флаг "Используется" в форме "Складской журнал" ATimTim DAX: Функционал 1 24.06.2004 19:19
"Пустое" значение Enum в веб-форме LedgerVoucher DAX: Программирование 4 25.07.2002 12:35

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 21:19.