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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 16.08.2007, 17:58   #1  
SHiSHok is offline
SHiSHok
Участник
Аватар для SHiSHok
Дети Юза
 
219 / 103 (4) +++++
Регистрация: 28.07.2005
Адрес: Донецк
Post оптимизируем запросы.
если у вас тормоза при нажатии кнопочки запросы в шапках (заказо/закупок..) то предлагаю следующее:
есть такой метод на карте (MAP) - CustVendInvoiceJour.factureJourSortedList_RU

X++:
 DIS :

        // Header markups
        while select factureJour
            join RecId from factureTrans
            join RecId from markupTrans
            where factureJour.Module                 == module                          &&
                  factureJour.CustVendInvoiceAccount == this.InvoiceAccount             &&
                  factureTrans.FactureId             == factureJour.FactureId           &&
                  factureTrans.Module                == module                          &&
                  factureTrans.FactureLineType       == FactureLineType_RU::Markup      &&
                  markupTrans.RecId                  == factureTrans.MarkupRefRecId     &&
                  markupTrans.TransTableId           == this.TableId                    &&
                  markupTrans.TransRecId             == this.RecId
        {
            if ( ! ret.find(factureJour))
            {
                ret.ins(factureJour);
            }
        }

        // Line markups
        while select factureJour
            join RecId from factureTrans
            join RecId from markupTrans
            join RecId from custVendInvoiceTrans
            where factureJour.Module                 == module                       &&
                  factureJour.CustVendInvoiceAccount == this.InvoiceAccount          &&
                  factureTrans.FactureId             == factureJour.FactureId        &&
                  factureTrans.Module                == module                       &&
                  factureTrans.FactureLineType       == FactureLineType_RU::Markup   &&
                  markupTrans.RecId                  == factureTrans.MarkupRefRecId  &&
                  markupTrans.TransTableId           == custVendInvoiceTrans.TableId &&
                  custVendInvoiceTrans.RecId         == markupTrans.TransRecId       &&
                  custVendInvoiceTrans.SalesPurchId  == this.Num                     &&
                  custVendInvoiceTrans.InvoiceNum    == this.InvoiceId               &&
                  (module == FactureModule_RU::Cust  ||
                   (module == FactureModule_RU::Vend  &&
                    custVendInvoiceTrans.PurchInternalInvoiceId == this.PurchInternalInvoiceId)) &&
                  custVendInvoiceTrans.InvoiceDate  == this.InvoiceDate             &&
                  custVendInvoiceTrans.NumberSequenceGroupId
                                                    == this.NumberSequenceGroupId
        {
            if ( ! ret.find(factureJour))
            {
                ret.ins(factureJour);
            }
        }
в запросах вся надежда на сиквел (как бы правильно), но вот сиквел на нашей базе начал интересный план придумывать : оба запроса начинаются с выборки по factureTrans, что чем дальше - тем больше выражается в задержках.
Пришлось явно сиквелу сказать что делать: для первого запроса наилучшую селективность обеспечивает MARKUPTRANS, для второго карта CUSTINVOICETRANS - имеем:
X++:
        // Header markups
        // SHiSHok.FRA_Optimize -->
        factureJour.clear();
        while select forceselectorder forcenestedloop forceplaceholders RecId from markupTrans
            join RecId from factureTrans
            join * from factureJour index CustVendModuleIdx
            where
                  markupTrans.TransTableId           == this.TableId                    &&
                  markupTrans.TransRecId             == this.RecId                      &&
                  factureTrans.FactureLineType       == FactureLineType_RU::Markup      &&
                  factureTrans.MarkupRefRecId        == markupTrans.RecId               &&
                  factureJour.FactureId              == factureTrans.FactureId          &&
                  factureJour.Module                 == factureTrans.Module             &&
                  factureJour.Module                 == module                          &&
                  factureJour.CustVendInvoiceAccount == this.InvoiceAccount
        {
            if ( ! ret.find(factureJour))
            {
                ret.ins(factureJour);
            }
        }

        // Line markups
        while select forceselectorder forcenestedloop forceplaceholders RecId from custVendInvoiceTrans
            join RecId from markupTrans
            join RecId from factureTrans
            join * from factureJour index CustVendModuleIdx
            where
                  custVendInvoiceTrans.SalesPurchId  == this.Num                     &&
                  custVendInvoiceTrans.InvoiceNum    == this.InvoiceId               &&
                  custVendInvoiceTrans.InvoiceDate   == this.InvoiceDate             &&
                  custVendInvoiceTrans.NumberSequenceGroupId
                                                    == this.NumberSequenceGroupId    &&
                  (module == FactureModule_RU::Cust  ||
                   (module == FactureModule_RU::Vend  &&
                    custVendInvoiceTrans.PurchInternalInvoiceId == this.PurchInternalInvoiceId)) &&
                  markupTrans.TransTableId           == custVendInvoiceTrans.TableId &&
                  markupTrans.TransRecId             == custVendInvoiceTrans.RecId   &&
                  factureTrans.FactureId             == factureJour.FactureId        &&
                  factureTrans.Module                == factureJour.Module           &&
                  factureTrans.FactureLineType       == FactureLineType_RU::Markup   &&
                  factureTrans.MarkupRefRecId        == markupTrans.RecId            &&
                  factureJour.Module                 == module                       &&
                  factureJour.CustVendInvoiceAccount == this.InvoiceAccount
        {
            if ( ! ret.find(factureJour))
            {
                ret.ins(factureJour);
            }
        }
        // SHiSHok.FRA_Optimize <--
теперь запросы не нервируют.
__________________
--- SHiSHok

Последний раз редактировалось SHiSHok; 16.08.2007 в 18:43.
За это сообщение автора поблагодарили: kashperuk (3).
Теги
axapta, faq, запрос (query), производительность

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Производство. Запросы\Развертывание\Обработка не дает нужный результат e@gle DAX: Функционал 11 11.05.2007 18:10
Сложные запросы в RLS Ruff DAX: Администрирование 12 30.08.2005 18:02
Запросы в Аксапта ibc DAX: Программирование 5 08.08.2005 22:47
Разные запросы в 2-х и 3-х уровневой конфигурациях. Что делать?! Anais DAX: Программирование 12 04.11.2004 12:47
Сложные while select-запросы или вложенные циклы Atani DAX: Программирование 10 03.02.2004 13:46

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

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

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