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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 30.10.2008, 10:39   #1  
ViV is offline
ViV
Axapta Retail User
Самостоятельные клиенты AX
Axapta Retail User
 
200 / 79 (3) ++++
Регистрация: 14.09.2005
? Тормоза Аксапты в запросе по складским проводкам
Добрый день!

Столкнулись с непонятной ситуацией, нужна помощь в вопросе куда копать дальше:

Axapta 3.0 SP3, MS SQL 2000.

Открываем "Номенклатура" - "В наличии" - "Проводки". Аналитика на форме "В наличии" включена только склад. При открытии формы "Проводки" Аксапта довольно серьезно задумывается, молотя что-то на аос-е. Пытаемся разобраться:
В профайлере видно, что все время уходит на выполнение запроса. Сам запрос:
X++:
SELECT A.ITEMID,A.STATUSISSUE,A.DATEPHYSICAL,A.QTY,A.COSTAMOUNTPOSTED,
A.CURRENCYCODE,A.TRANSTYPE,A.TRANSREFID,A.INVOICEID,A.VOUCHER,
A.DATEEXPECTED,A.DATEFINANCIAL,A.COSTAMOUNTPHYSICAL,
A.INVENTTRANSID,A.STATUSRECEIPT,A.PACKINGSLIPRETURNED,
A.INVOICERETURNED,A.PACKINGSLIPID,A.VOUCHERPHYSICAL,
A.COSTAMOUNTADJUSTMENT,A.QTYSETTLED,A.COSTAMOUNTSETTLED,
A.VALUEOPEN,A.DIRECTION,A.DATESTATUS,A.COSTAMOUNTSTD,
A.DATECLOSED,A.DEL_CONFIGID,A.INVENTTRANSIDFATHER,A.COSTAMOUNTOPERATIONS,
A.INVENTTRANSIDRETURN,A.INVENTDIMID,A.INVENTDIMFIXED,A.DATEINVENT,
A.CUSTVENDAC,A.TRANSCHILDREFID,A.TRANSCHILDTYPE,A.REVENUEAMOUNTPHYSICAL,
A.DEL_TAXAMOUNTPHYSICAL,A.INVENTREFTRANSID,A.COSTAMOUNTSECCURPOSTED_RU,
A.COSTAMOUNTSECCURPHYSICAL_RU,A.COSTAMOUNTSECCURADJUSTMENT_RU,
A.DATECLOSEDSECCUR_RU,A.QTYSETTLEDSECCUR_RU,A.COSTAMOUNTSETTLEDSECCUR_RU,
A.VALUEOPENSECCUR_RU,A.COSTAMOUNTSTDSECCUR_RU,A.INOLAP,A.BATCHID,
A.CREATEDBY,A.RECID,B.INVENTDIMID,B.INVENTBATCHID,B.INVENTSERIALID,B.INVENTLOCATIONID,
B.INVENTGTDID_RU,B.RECID FROM INVENTTRANS A,INVENTDIM B WHERE
((A.DATAAREAID=?) AND (A.ITEMID=?)) AND ((B.DATAAREAID=?) AND 
((B.INVENTLOCATIONID=?) AND (A.INVENTDIMID=B.INVENTDIMID))) ORDER BY
A.DATAAREAID,A.ITEMID,A.DATEPHYSICAL OPTION(FAST 1)
Вроде абссолютно ничего криминального, все четко и по индексам.
При этом в Query Analyzer запрос отрабатывается за 2-3 секунды, в то время как Аксапта думает над открытием формы по пол-минуты. Да и после открытия - листая проводки в форме - Аксапта так же очень старательно задумывается.
Сервера при этом не загружены, SQL сервер тоже, статистика обновлена, с ресурсами проблем не выявлено.
В inventTrans - 4,5 млн записей, inventDim 650 тыс. Из складских аналитик включены склад, партия, серийный номер и ГТД. Еще стоит отметить, что просто форма "Номенклатура" - "Проводки" открывается быстро, видимо вся загвоздка в фильтре по inventDim.InventLocationId - но мне непонятно, почему такая существенная разница? Что еще можно глянуть для выявления причины?
Старый 30.10.2008, 11:08   #2  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от ViV Посмотреть сообщение
Вроде абссолютно ничего криминального, все четко и по индексам.
При этом в Query Analyzer запрос отрабатывается за 2-3 секунды, в то время как Аксапта думает над открытием формы по пол-минуты. Да и после открытия - листая проводки в форме - Аксапта так же очень старательно задумывается.
1. Проверяйте сеть.
2. Но скорее всего проблема в том, что задействуется tempdb для сортировки результатов выборки (в аксапте group by всегда сопровождается опцией order by, а вручную вы наверняка order by пропускаете). Поищите на форуме по поводу tempdb.
__________________
полезное на axForum, github, vk, coub.
Старый 30.10.2008, 12:04   #3  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
А можно вас попросить выполнить запрос с теми же параметрами, но в таком виде
X++:
SELECT 
A.DATAAREAID,A.ITEMID,A.INVENTDIMID,B.DATAAREAID,B.INVENTLOCATIONID,A.INVENTDIMID,B.INVENTDIMID 
FROM INVENTTRANS A,INVENTDIM B WHERE ((A.DATAAREAID=@P1) AND (A.ITEMID=@P2)) AND ((B.DATAAREAID=@P3) AND ((B.INVENTLOCATIONID=@P4) AND (A.INVENTDIMID=B.INVENTDIMID))) ORDER BY 
A.DATAAREAID,A.ITEMID OPTION(FAST 1)
т.е. ограничить выбираемые поля только теми, которые есть в поисковых индексах и убрать из сортировки поле DATEPHYSICAL
__________________
Axapta v.3.0 sp5 kr2
Старый 30.10.2008, 12:50   #4  
ViV is offline
ViV
Axapta Retail User
Самостоятельные клиенты AX
Axapta Retail User
 
200 / 79 (3) ++++
Регистрация: 14.09.2005
?
Цитата:
Сообщение от mazzy Посмотреть сообщение
1. Проверяйте сеть.
2. Но скорее всего проблема в том, что задействуется tempdb для сортировки результатов выборки (в аксапте group by всегда сопровождается опцией order by, а вручную вы наверняка order by пропускаете). Поищите на форуме по поводу tempdb.
1. Точно все хорошо, иначе вылезло бы еще в куче мест.
2. Вручную order by не убирали, да и он полностью соответсвует индексу - вроде никакой сильной доп нагрузки быть не должно? Кстати сама база весит 70 гб, а размер tempdb 14 гб - это нормальное соотношение?

Цитата:
Сообщение от AndyD Посмотреть сообщение
А можно вас попросить выполнить запрос с теми же параметрами, но в таком виде
X++:
SELECT 
A.DATAAREAID,A.ITEMID,A.INVENTDIMID,B.DATAAREAID,B.INVENTLOCATIONID,A.INVENTDIMID,B.INVENTDIMID FROM INVENTTRANS A,INVENTDIM B WHERE ((A.DATAAREAID=@P1) AND (A.ITEMID=@P2)) AND ((B.DATAAREAID=@P3) AND ((B.INVENTLOCATIONID=@P4) AND (A.INVENTDIMID=B.INVENTDIMID))) ORDER BY 
A.DATAAREAID,A.ITEMID OPTION(FAST 1)
т.е. ограничить выбираемые поля только теми, которые есть в поисковых индексах и убрать из сортировки поле DATEPHYSICAL
Хм. Сделать в QueryAnalyzer? Сделали, разницы не почувствовали (план запроса тот же). Или Вы предлагаете его скормить Аксапте? Не верится, что дело только в длине передаваемой записи - ведь без фильтра по inventLocationId работает с такой же записью (набором полей), но гораздо шустрее.
Старый 30.10.2008, 13:12   #5  
dn is offline
dn
Участник
Самостоятельные клиенты AX
 
486 / 159 (6) ++++++
Регистрация: 26.03.2003
Адрес: Москва
1) Сравните планы выполнения запроса через Axapta и через аналайзер. Возможно Аксапта через ядро навязывает не оптимальный индекс.

2) Попробуйте убрать сортировку по дате в аксапта
Старый 30.10.2008, 13:13   #6  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Да. Попробуйте в аксапте
Дело не в длине записи, дело в том, что после поиска по индексам данные надо еще достать из таблицы

И насчет плана запроса вы уверены?
Насколько я понимаю, планы должны отличаться как раз на пробег по страницам таблицы для выборки недостающих данных
__________________
Axapta v.3.0 sp5 kr2
Старый 30.10.2008, 13:18   #7  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Еще - приведите план исполнения для обоих запросов.
__________________
Axapta v.3.0 sp5 kr2
Старый 30.10.2008, 13:30   #8  
vc is offline
vc
Участник
Самостоятельные клиенты AX
Axapta Retail User
 
89 / 23 (1) +++
Регистрация: 03.06.2005
Цитата:
Сообщение от AndyD Посмотреть сообщение
Да. Попробуйте в аксапте
Дело не в длине записи, дело в том, что после поиска по индексам данные надо еще достать из таблицы

И насчет плана запроса вы уверены?
Насколько я понимаю, планы должны отличаться как раз на пробег по страницам таблицы для выборки недостающих данных
Поисковые индексы в плане запроса - ItemIdIdx таблицы InventTrans, и DimIdIdx таблицы InventDim.
Поэтому Bookmark Lookup по InventDim происходит в любом случае. Чтобы его не было, нужно из запроса убрать фильтр по складу, и убрать склад из выводимых полей.
Bookmark Lookup по InventTrans происходит в любом случае, чтобы получить InventDimId (для объединения с InventDim).
Старый 30.10.2008, 13:46   #9  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Насчет InventDim, согласен.
Она у меня меня маленькая, по-этому погоды не делает. У вас влияние будет оказывать существенное.
А вот насчет InventTrans - у меня в запросе используется DimIdIdx, по-этому и букмарков нет.

Но, в любом случае, посмотрите, какая стоимость Bookmark Lookup.
__________________
Axapta v.3.0 sp5 kr2
Старый 30.10.2008, 13:50   #10  
vc is offline
vc
Участник
Самостоятельные клиенты AX
Axapta Retail User
 
89 / 23 (1) +++
Регистрация: 03.06.2005
Цитата:
Сообщение от AndyD Посмотреть сообщение
Насчет InventDim, согласен.
Она у меня меня маленькая, по-этому погоды не делает. У вас влияние будет оказывать существенное.
А вот насчет InventTrans - у меня в запросе используется DimIdIdx, по-этому и букмарков нет.

Но, в любом случае, посмотрите, какая стоимость Bookmark Lookup.
Стоимость у обоих Bookmark Lookup нулевая, по 50% стоимости уходит на Index Seek по InventTrans и InventDim
Старый 30.10.2008, 13:56   #11  
vc is offline
vc
Участник
Самостоятельные клиенты AX
Axapta Retail User
 
89 / 23 (1) +++
Регистрация: 03.06.2005
Цитата:
Сообщение от AndyD Посмотреть сообщение
Насчет InventDim, согласен.
Она у меня меня маленькая, по-этому погоды не делает. У вас влияние будет оказывать существенное.
А вот насчет InventTrans - у меня в запросе используется DimIdIdx, по-этому и букмарков нет.

Но, в любом случае, посмотрите, какая стоимость Bookmark Lookup.
Ну и еще, в реальной то ситуации для отображения на форме проводок, все равно понадобятся не поисковые поля (количество, код исходного документа, типы прихода, расхода из InventTrans, как минимум). Bookmark lookup представляется неизбежным
Старый 30.10.2008, 14:04   #12  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Это понятно. Отсекаем лишнее, так сказать.

А план запроса такой получается в QA или при вызове из Аксапты?
__________________
Axapta v.3.0 sp5 kr2
Старый 30.10.2008, 14:12   #13  
vc is offline
vc
Участник
Самостоятельные клиенты AX
Axapta Retail User
 
89 / 23 (1) +++
Регистрация: 03.06.2005
Цитата:
Сообщение от AndyD Посмотреть сообщение
Это понятно. Отсекаем лишнее, так сказать.

А план запроса такой получается в QA или при вызове из Аксапты?
Это было в QA, сейчас попробовал в Аксапте. План получается аналогичный (стоимости нет в форме "План исполнения оператора")
Старый 30.10.2008, 15:55   #14  
petergunn is offline
petergunn
Участник
 
118 / 274 (10) ++++++
Регистрация: 30.08.2005
Адрес: Tyumen
DimIdIdx
2 vc:
Вадим, попробуйте немного модифицировать функционал метода InventTrans.queryAddHintFromCaller() и сообщите результаты:
X++:
Client Server Static void queryAddHintFromCaller(QueryBuildDataSource qbs,Args callerArgs)
{
    switch(callerArgs.dataset())
    {
        // --> Добавлено: для InventSum использовать индекс DimIdIdx
        case(tableNum(InventSum)):
        // <-- добавлено
        case(tableNum(InventBatch)):
        case(tableNum(InventSerial)):
        case(tableNum(WMSPallet)):
        case(tableNum(WMSLocation)):

            qbs.addSortIndex(indexNum(InventTrans,DimIdIdx));
            qbs.indexIsHint(True);
            break;

        default:
            break;
    }
}
За это сообщение автора поблагодарили: vc (1).
Старый 30.10.2008, 16:27   #15  
vc is offline
vc
Участник
Самостоятельные клиенты AX
Axapta Retail User
 
89 / 23 (1) +++
Регистрация: 03.06.2005
Цитата:
Сообщение от petergunn Посмотреть сообщение
2 vc:
Вадим, попробуйте немного модифицировать функционал метода InventTrans.queryAddHintFromCaller() и сообщите результаты:
Попробовал, результаты интересные. В плане запросов Index seek по таблице InventTrans послушно переключился на InvendDimIdx. Форма кажется стала открываться быстрее . Скроллинг по проводкам стал тормозить заметно меньше. Пропала сортировка по физической дате, вроде логично, ее нету в InventDimIdx. Пользователи сильно привыкли (очень просили) к тому, что при открытии проводок первые строки - строки резервов и предложений. Без сортировки по дате будет тяжело. Попробуем добавить физическую дату в InventDimIdx.
В общем спасибо большое, появилось направление, в котором можно поэкспериментировать.
Теги
оптимизация, производительность, ax3.0

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Как сильно модифицировано ваше приложение Аксапты? mazzy DAX: Прочие вопросы 30 14.04.2011 17:26
Вставка строк в таблицы Аксапты сторонними средствами Андре DAX: База знаний и проекты 1 07.05.2009 16:49
Как сильно модифицировано ваше приложение Аксапты? (% новых объектов) mazzy DAX: Прочие вопросы 1 12.03.2009 17:40
Экспорт / импорт Help topics и запуск второй сессии Аксапты из-под себя DmitrySt DAX: Программирование 0 25.11.2004 00:22
Установка Аксапты Новичок DAX: Администрирование 1 08.01.2002 10:30

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

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

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