15.12.2011, 15:01 | #1 |
Участник
|
Чистка черновиков или тормоза на форме "Проекты" 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; } Сразу скажу, что мы приняли решение во все таблицы добавить индех по полю ProjId, а в таблицу LedgerJournalTrans по AccountNum,AccountType.Скорректировали запросы в этом методе на IndexHint и все зашуршало. В основном тормоза были на таблицах projJournalTrans,LedgerJournalTrans,inventJournalTrans,SalesLine,PurchLine. Эти таблицы, можно сказать являются справочниками-черновиками. Вся главная информация лежит в проводках. И у меня возникает вопрос: разработчики не обратили на скорость внимание рассчитывая на то, что черновики периодически должны чиститься или просто не подумали? Но главный вопрос вообще о целесообразности чистки черновиков. Кто-нибудь чистит эти таблицы? У нас эти таблицы не чистятся. Записей очень много. PS: Тему может быть неудачно назвал. Но ведь можно было назвать и так "Чистка черновиков и Экономия место БД" или как-то еще. Решил так как есть, так как задумался об этом на форме.
__________________
-Ты в гномиков веришь? -Нет. -А они в тебя верят, смотри, не подведи их. |
|
|
За это сообщение автора поблагодарили: lev (5). |
15.12.2011, 15:19 | #2 |
Ищущий знания...
|
я в шоке от кода! это на слое 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 |
Участник
|
Цитата:
Сообщение от Pustik
В основном тормоза были на таблицах projJournalTrans,LedgerJournalTrans,inventJournalTrans,SalesLine,PurchLine. Эти таблицы, можно сказать являются справочниками-черновиками. Вся главная информация лежит в проводках. И у меня возникает вопрос: разработчики не обратили на скорость внимание рассчитывая на то, что черновики периодически должны чиститься или просто не подумали?
Кстати, IndexHint я бы использовать не советовал. Индексы должны подхватится и без них, а сам факт использования хинтов, принуждающих сервер к чему-либо, может выйти "боком" при дальнейшем развитии системы. Цитата:
Кто-то уже высказывался в том духе, что как правило, при кастомизации, исходные заказы/закупки/журналы получают ряд дополнительных характеристик (полей), которые не транслируются в проводки. Как следствие, чтобы получить отчеты в разрезе этих характеристик возникает необходимость обратится к этим самым "черновикам" Другими словами, все крутится вокруг отчетности. Если для составления справок и отчетов эти документы не нужны, то и хранить их нет необходимости.
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
|
За это сообщение автора поблагодарили: Pustik (5). |
15.12.2011, 18:08 | #4 |
Участник
|
Цитата:
Сообщение от lev
Хочется добавить, что этот код так же попытались с оптимизировать. Ведь конструкция типа:
X++: (select firstonly projJournalTrans where projJournalTrans.ProjId == projId).RecId
__________________
-Ты в гномиков веришь? -Нет. -А они в тебя верят, смотри, не подведи их. |
|
15.12.2011, 18:29 | #5 |
Участник
|
Цитата:
Сообщение от Владимир Максимов
Зависит от того, как они используются.
Кто-то уже высказывался в том духе, что как правило, при кастомизации, исходные заказы/закупки/журналы получают ряд дополнительных характеристик (полей), которые не транслируются в проводки. Как следствие, чтобы получить отчеты в разрезе этих характеристик возникает необходимость обратится к этим самым "черновикам" Другими словами, все крутится вокруг отчетности. Если для составления справок и отчетов эти документы не нужны, то и хранить их нет необходимости.
__________________
-Ты в гномиков веришь? -Нет. -А они в тебя верят, смотри, не подведи их. |
|
15.12.2011, 19:13 | #6 |
Участник
|
Ну, из негатива - это размер базы данных. В байтах. Сам факт наличия черновиков существенно его увеличивает. Например, у нас таблица SalesLine уже "переплюнула" по размеру InventSettlement. Сопоставления хоть "свернуть" можно...
Если нет проблем с дисковым пространством, то лично я не вижу причин их удалять. Удаление чего-либо - это всегда риск. Всегда остается некое сомнение "а вдруг понадобится"
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
Теги |
журнал переноса, заказ, заказ на перемещение, заказ на покупку, заказ на продажу, закупка, складские журналы |
|
|