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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 03.03.2015, 16:22   #1  
Art_Tanis is offline
Art_Tanis
Участник
 
225 / 36 (2) +++
Регистрация: 04.02.2014
Долго отрабатывает Select
Добрый день!
Есть следующая проблема в которой причину которой мне не удается понять.
Следующий жоб:
X++:
static void Job54(Args _args)
{

    Dialog       dialog = new dialog();

    DialogField  dlgTransDateStart;
    DialogField  dlgTransDateEnd;

    InventTable  inventTable;
    inventTrans   inventTrans;
    int timeFullStart, timeFullFinish, timeFullTotal, i;

    ;
    dlgTransDateStart = Dialog.addField(typeid(TransDate));
    dlgTransDateEnd = Dialog.addField(typeid(TransDate));
    dialog.run();
    timeFullStart = timenow();
    i = 1;
    while select inventTable
        where inventTable.ItemGroupId == "FP_BDiap"
        {

              select forceLiterals sum(Qty), sum(CostAmountPosted) from inventTrans
                        where inventTrans.ItemId == inventTable.itemId
                        && InventTrans.DatePhysical >= dlgTransDateStart.value()
                        &&    inventTrans.DatePhysical <= dlgTransDateEnd.value()
                        &&    InventTrans.TransType == InventTransType::Sales || InventTrans.TransType == InventTransType::InventLossProfit;
              i++;

        }
        timeFullFinish = timenow();
        timeFullTotal = timeFullFinish - timeFullStart;
        info(strfmt("%1, %2", int2str(i), int2str(timeFullTotal)));
}
Итог очень плачевный. вывод следующий: 47 секунд позиций 61, период выборки с 0101 по текущую дату.
Вопрос - как ускорить.
Старый 03.03.2015, 16:39   #2  
raz is offline
raz
NavAx
Аватар для raz
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1,494 / 1065 (38) ++++++++
Регистрация: 22.07.2003
Адрес: МО
использовать join и один запрос.

X++:
           while select inventTrans
                        where InventTrans.DatePhysical >= dlgTransDateStart.value()
                        &&    inventTrans.DatePhysical <= dlgTransDateEnd.value()
                        &&   (InventTrans.TransType == InventTransType::Sales || InventTrans.TransType == InventTransType::InventLossProfit)
                   join inventTable
                        where inventTable.itemId == inventTrans.ItemId 
                        && inventTable.ItemGroupId == "FP_BDiap"
                   {}
непонятно, что Вы пытаетесь получить.
для чего это?
X++:
sum(Qty), sum(CostAmountPosted)
PS. ну и запрос с ошибкой. скобки забыли?

Последний раз редактировалось raz; 03.03.2015 в 16:46.
Старый 03.03.2015, 16:42   #3  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
взять в скобки
X++:
(InventTrans.TransType == InventTransType::Sales || InventTrans.TransType == InventTransType::InventLossProfit)
Старый 03.03.2015, 16:43   #4  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,738 / 404 (17) +++++++
Регистрация: 23.03.2006
во втором селекте ошибка в условии
Старый 04.03.2015, 12:39   #5  
Napalm is offline
Napalm
Участник
 
80 / 88 (3) ++++
Регистрация: 23.05.2012
Цитата:
Сообщение от raz Посмотреть сообщение
использовать join и один запрос.

X++:
           while select inventTrans
                        where InventTrans.DatePhysical >= dlgTransDateStart.value()
                        &&    inventTrans.DatePhysical <= dlgTransDateEnd.value()
                        &&   (InventTrans.TransType == InventTransType::Sales || InventTrans.TransType == InventTransType::InventLossProfit)
                   join inventTable
                        where inventTable.itemId == inventTrans.ItemId 
                        && inventTable.ItemGroupId == "FP_BDiap"
                   {}
EXISTS join? Нет, не слышал.
Старый 05.03.2015, 11:44   #6  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от Napalm Посмотреть сообщение
EXISTS join? Нет, не слышал.
Если хотели пошутить, то неудачно. В Axapta, по возможности, Exists join следует избегать. Если это возможно по логике запроса, то лучше использовать inner join. В данном случае - это возможно, поэтому именно так и следует делать.

Причина в том, что план выполнения запроса с Exists может меняться в зависимости от размера таблиц (количества записей). Это значит, что "сегодня" такой запрос работает быстро, а "завтра" начинаются дикие тормоза. И Вам потребуется много времени и сил, чтобы понять, в чем проблема... Для Inner join такой проблемы нет.
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Старый 05.03.2015, 11:57   #7  
fed is offline
fed
Moderator
Аватар для fed
Ex AND Project
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
2,909 / 5730 (197) ++++++++++
Регистрация: 13.03.2002
Адрес: Hüfingen,DE
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Если хотели пошутить, то неудачно. В Axapta, по возможности, Exists join следует избегать. Если это возможно по логике запроса, то лучше использовать inner join. В данном случае - это возможно, поэтому именно так и следует делать.

Причина в том, что план выполнения запроса с Exists может меняться в зависимости от размера таблиц (количества записей). Это значит, что "сегодня" такой запрос работает быстро, а "завтра" начинаются дикие тормоза. И Вам потребуется много времени и сил, чтобы понять, в чем проблема... Для Inner join такой проблемы нет.
Рекомендация изначально не очень верна. Да - были проблемы с exists join в ранних версиях оракла, с которыми Axapta 2.1-2.5 работала. У MS SQL (Даже версии 2000) подобных проблем не наблюдалось. Кроме того - со времен Oracle 8.0.6 и MS SQL 2000 прошло уже 16 лет и ни то ни другой особых проблем именно с Exists join не имеют. То есть - проблемы с execution plan везде возникают время от времени, но именно с exists /not exists join они не связаны.
Старый 05.03.2015, 12:09   #8  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от fed Посмотреть сообщение
Рекомендация изначально не очень верна. Да - были проблемы с exists join в ранних версиях оракла, с которыми Axapta 2.1-2.5 работала. У MS SQL (Даже версии 2000) подобных проблем не наблюдалось. Кроме того - со времен Oracle 8.0.6 и MS SQL 2000 прошло уже 16 лет и ни то ни другой особых проблем именно с Exists join не имеют. То есть - проблемы с execution plan везде возникают время от времени, но именно с exists /not exists join они не связаны.
Проблемы связаны как раз с MS SQL. Ну, лично у меня Подробности по ссылке.

Проблемы с Exists Join

Не знаю, как в Ax2012, но в Ax2009 механика процесса не изменилась, поэтому не вижу причин для оптимизма
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
За это сообщение автора поблагодарили: Товарищ ♂uatr (2).
Старый 05.03.2015, 13:15   #9  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1849 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Причина в том, что план выполнения запроса с Exists может меняться в зависимости от размера таблиц (количества записей). Это значит, что "сегодня" такой запрос работает быстро, а "завтра" начинаются дикие тормоза. И Вам потребуется много времени и сил, чтобы понять, в чем проблема... Для Inner join такой проблемы нет
Т.е. для INNER JOIN план исполнения не от размера таблиц, селективности и имеющихся индексов строится, а из ГосПлана распространяется фелдъегерями раз в год, так получается ?
Цитата:
В Axapta, по возможности, Exists join следует избегать
Интерпретация фактов и соответственно рекомендация довольно странные
Цитата:
Проблемы связаны как раз с MS SQL
С тем же успехом можно порекомендовать отказаться от MS SQL
__________________
-ТСЯ или -ТЬСЯ ?
Старый 05.03.2015, 13:48   #10  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
А по ссылке посмотреть с чем связана рекомендация не...?
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Старый 05.03.2015, 14:15   #11  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1849 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
А по ссылке посмотреть с чем связана рекомендация не...?
Ну типа Вы разобрались в причинах подземного стука в итоге и потому рекомендуете ? Из той ветки просто неочевидно
__________________
-ТСЯ или -ТЬСЯ ?
Старый 05.03.2015, 19:07   #12  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от Vadik Посмотреть сообщение
Ну типа Вы разобрались в причинах подземного стука в итоге и потому рекомендуете ? Из той ветки просто неочевидно
Да. При определенных условиях, использование exists "внезапно" порождает совершенно не ожидАемые проблемы. При том, что "еще вчера все прекрасно работало" Вот чтобы на эти "грабли" не наступать, по возможности, и стоит избегать exists.
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
emeadaxsupport: AX Content: Select invoices to pay Blog bot DAX Blogs 0 23.10.2013 02:11
atinkerersnotebook: Using Service Management to Track Service Orders Blog bot DAX Blogs 1 25.08.2013 19:16
dynamicsaxtraining: Select statement patterns Blog bot DAX Blogs 10 20.08.2010 14:01
Разница NotInTTS и Found Logger DAX: База знаний и проекты 6 18.09.2008 12:35
Вопрос про Demand Planner slava09 DAX: Функционал 4 25.09.2006 11:43
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

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