|
30.10.2008, 10:39 | #1 |
Axapta Retail User
|
Тормоза Аксапты в запросе по складским проводкам
Добрый день!
Столкнулись с непонятной ситуацией, нужна помощь в вопросе куда копать дальше: 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 |
Участник
|
Цитата:
Сообщение от ViV
Вроде абссолютно ничего криминального, все четко и по индексам.
При этом в Query Analyzer запрос отрабатывается за 2-3 секунды, в то время как Аксапта думает над открытием формы по пол-минуты. Да и после открытия - листая проводки в форме - Аксапта так же очень старательно задумывается. 2. Но скорее всего проблема в том, что задействуется tempdb для сортировки результатов выборки (в аксапте group by всегда сопровождается опцией order by, а вручную вы наверняка order by пропускаете). Поищите на форуме по поводу tempdb. |
|
30.10.2008, 12:04 | #3 |
Участник
|
А можно вас попросить выполнить запрос с теми же параметрами, но в таком виде
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)
__________________
Axapta v.3.0 sp5 kr2 |
|
30.10.2008, 12:50 | #4 |
Axapta Retail User
|
Цитата:
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) |
|
30.10.2008, 13:12 | #5 |
Участник
|
1) Сравните планы выполнения запроса через Axapta и через аналайзер. Возможно Аксапта через ядро навязывает не оптимальный индекс.
2) Попробуйте убрать сортировку по дате в аксапта |
|
30.10.2008, 13:13 | #6 |
Участник
|
Да. Попробуйте в аксапте
Дело не в длине записи, дело в том, что после поиска по индексам данные надо еще достать из таблицы И насчет плана запроса вы уверены? Насколько я понимаю, планы должны отличаться как раз на пробег по страницам таблицы для выборки недостающих данных
__________________
Axapta v.3.0 sp5 kr2 |
|
30.10.2008, 13:30 | #7 |
Участник
|
Цитата:
Поэтому Bookmark Lookup по InventDim происходит в любом случае. Чтобы его не было, нужно из запроса убрать фильтр по складу, и убрать склад из выводимых полей. Bookmark Lookup по InventTrans происходит в любом случае, чтобы получить InventDimId (для объединения с InventDim). |
|
30.10.2008, 13:18 | #8 |
Участник
|
Еще - приведите план исполнения для обоих запросов.
__________________
Axapta v.3.0 sp5 kr2 |
|
30.10.2008, 13:46 | #9 |
Участник
|
Насчет InventDim, согласен.
Она у меня меня маленькая, по-этому погоды не делает. У вас влияние будет оказывать существенное. А вот насчет InventTrans - у меня в запросе используется DimIdIdx, по-этому и букмарков нет. Но, в любом случае, посмотрите, какая стоимость Bookmark Lookup.
__________________
Axapta v.3.0 sp5 kr2 |
|
30.10.2008, 13:50 | #10 |
Участник
|
Цитата:
Сообщение от AndyD
Насчет InventDim, согласен.
Она у меня меня маленькая, по-этому погоды не делает. У вас влияние будет оказывать существенное. А вот насчет InventTrans - у меня в запросе используется DimIdIdx, по-этому и букмарков нет. Но, в любом случае, посмотрите, какая стоимость Bookmark Lookup. |
|
30.10.2008, 13:56 | #11 |
Участник
|
Цитата:
Сообщение от AndyD
Насчет InventDim, согласен.
Она у меня меня маленькая, по-этому погоды не делает. У вас влияние будет оказывать существенное. А вот насчет InventTrans - у меня в запросе используется DimIdIdx, по-этому и букмарков нет. Но, в любом случае, посмотрите, какая стоимость Bookmark Lookup. |
|
30.10.2008, 14:04 | #12 |
Участник
|
Это понятно. Отсекаем лишнее, так сказать.
А план запроса такой получается в QA или при вызове из Аксапты?
__________________
Axapta v.3.0 sp5 kr2 |
|
30.10.2008, 14:12 | #13 |
Участник
|
|
|
30.10.2008, 15:55 | #14 |
Участник
|
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 |
Участник
|
Цитата:
В общем спасибо большое, появилось направление, в котором можно поэкспериментировать. |
|
Теги |
оптимизация, производительность, ax3.0 |
|
|