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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 04.11.2010, 10:37   #1  
Old is offline
Old
Участник
 
11 / 10 (1) +
Регистрация: 10.10.2004
order by тормозит
X++:
    InventTrans inventTrans;
    Counter     counter;
    TimeOfDay   start;
    ;
    start = timenow();
    for (counter = 1; counter <= 10; counter ++)
        while select inventTrans
            order by statusIssue
            where inventTrans.inventTransId   == '1234567890'               &&
                  inventTrans.statusReceipt   == StatusReceipt::None        &&
                  inventTrans.statusIssue     >= StatusIssue::ReservOrdered &&
                  inventTrans.statusIssue     <= StatusIssue::OnOrder
        {
            info(inventTrans.ItemId);
        }
    info(int2str(timenow() - start));
    start = timenow();
    for (counter = 1; counter <= 10; counter ++)
        while select inventTrans
//            order by statusIssue
            where inventTrans.inventTransId   == '1234567890'               &&
                  inventTrans.statusReceipt   == StatusReceipt::None        &&
                  inventTrans.statusIssue     >= StatusIssue::ReservOrdered &&
                  inventTrans.statusIssue     <= StatusIssue::OnOrder
        {
            info(inventTrans.ItemId);
        }
    info(int2str(timenow() - start));
Info Сообщение (13:28:54) 10
Info Сообщение (13:28:54) 0

Господа, это только у меня, или кто-то решал эту проблему?
Запрос элементарный, проиндексировано по inventTransId.
Сортировка по другим полям тормозит еще больше.
Решение есть, но что-то здесь мне не нравитcя.

Ax3.0 SP3 KR3 SQL2005

Последний раз редактировалось Old; 04.11.2010 в 10:57.
Старый 04.11.2010, 16:41   #2  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1849 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
Цитата:
Сообщение от Old Посмотреть сообщение
это только у меня, или кто-то решал эту проблему?
У Вас WHERE и ORDER BY указаны по группе полей (InventTransId, StatusReceipt, StatusIssue), которая ни одним штатным индексом не покрывается, так что это некоторый челлендж для оптимизатора. Планов исполнения Вы не привели, поэтому предположительно в запросе без сортировки он подхватывает индекс TransIdIdx, отбирает проводки по лоту и далее эту выборку дофильтровывает по StatusReceipt, StatusIssue, а во втором запросе видит для себя дополнительную работу по сортировке и пытается упростить себе жизнь, отобрав уже отсортированные по StatusIssue ключи в StatusItemIdx и потом дофильтровав выборку по лоту. По идее, единичный лот обычно гораздо селективнее любой комбинации {StatusReceipt, StatusIssue} и выборка по нему предпочтительнее, но это уже относится к организации статистик вообще и к их аккуратности и актуальности конкретно в Вашей БД. В качестве workaround-а можно предложить как минимум два варианта:
  • решение "в лоб": создать индекс по {InventTransId, StatusReceipt, StatusIssue}
  • решение "a la DAX 2009": сделать индекс по лоту (TransIdIdx) кластерным, тогда он с большей вероятностью будет использоваться при указании номера лота, плюс много других соображений, в которые мы сейчас углубляться не будем. Мне этот вариант нравится больше
__________________
-ТСЯ или -ТЬСЯ ?
Старый 04.11.2010, 20:43   #3  
Old is offline
Old
Участник
 
11 / 10 (1) +
Регистрация: 10.10.2004
Index кластерный
Решение есть, но мне не нравится, что при элементарном проиндексированном по inventTransId запросе, сортировка по любому полю кроме inventTtransId, такие тормоза.
Старый 04.11.2010, 20:59   #4  
Old is offline
Old
Участник
 
11 / 10 (1) +
Регистрация: 10.10.2004
А у Вас это наблюдается?
Производительность ведь в разы.

Последний раз редактировалось Old; 04.11.2010 в 21:14.
Старый 04.11.2010, 23:59   #5  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
при нормальных индексах и статистиках такого быть не должно.
Старый 10.11.2010, 10:00   #6  
Alexius is offline
Alexius
Участник
Аватар для Alexius
 
461 / 248 (9) ++++++
Регистрация: 13.12.2001
Можно попробовать отключить параллелизм на MS SQL.
В запросе установлен отбор проводок только с определенным лотом, а обычно их число для одного лота не превышает нескольких десятков. Если это так, то сортировка небольшого кол-ва записей не должна ощутимо влиять на производительность.
Старый 10.11.2010, 12:02   #7  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5788 (200) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Мне кажется, не надо танцев с бубном - лучше посмотреть на запрос в том виде, как его получает СУБД: если с ним все в порядке, то посмтотреть на план запроса, подумать, почему он "не такой, как надо", и копать в эту сторону.
Теги
inventtrans, order by, sql server, производительность

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Shekhar: Invoice journal linked with Purchase order Blog bot DAX Blogs 0 31.05.2010 22:05
palleagermark: Annoying bug in AX 2009 Intercompany Sales Order Blog bot DAX Blogs 0 21.01.2010 11:05
dynamicsaxtraining: Create purchase order Blog bot DAX Blogs 0 14.12.2009 14:05
DynamicsAxSCM: Changes in Sales and Transfer Order Picking from Microsoft Dynamics AX 4.0 to Dynamics AX 2009 Blog bot DAX Blogs 0 18.05.2009 02:05
dynamicsmatters: Order stock allocation mechanism Blog bot DAX Blogs 0 24.11.2006 17:50

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 12:11.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.