24.08.2009, 11:40 | #1 |
Участник
|
Сильные тормоза при разноске Заказа на продажу
Коллеги,
проблема с обработкой Заказов на продажу. Проявляется разными способами: 1. При нажатии кнопки Запросы/Итоги система зависает. Форма Итоги открывается после очень длительного времени (несколько минут). 2. При обработке документов: Отгрузочная накладная, Накладная - система зависает надолго (дождаться завершения выполнения невозможно). После переиндексации производительность восстанавливается. Исходные данные: Axapta 4.0, SQL 2005. Каждую ночь на SQL запускается джоб по реиндексации базы. Раз в неделю делается Shrink. В чем может быть проблема? Какими средствами можно найти "слабое место"? |
|
24.08.2009, 11:47 | #2 |
Гость
|
Помню раньше была в аксапте такая проблема - все строки разносятся в одной транзакции и MSSQL после обработки нескольких строк принимал решение "блокировать всю таблицу"
Проблема решалась добавлением одной строчки в коде: X++: sort by itemId |
|
24.08.2009, 13:09 | #3 |
Участник
|
Аксаптовскими http://axapta.mazzy.ru/lib/querytuning/
а также новой утилитой TraceParser, которая пришла на смену аксаптовским средствам (ищите на форуме) |
|
24.08.2009, 13:16 | #4 |
Участник
|
спасибо.
|
|
25.08.2009, 00:49 | #5 |
Модератор
|
Перестаньте мучать животное
Stop Shrinking Your Database Files. Seriously. Now.
__________________
-ТСЯ или -ТЬСЯ ? |
|
25.08.2009, 09:56 | #6 |
Участник
|
Цитата:
Сообщение от mazzy
Аксаптовскими http://axapta.mazzy.ru/lib/querytuning/
а также новой утилитой TraceParser, которая пришла на смену аксаптовским средствам (ищите на форуме) За сутки Журнал трасирвоки запросов SQL пустой. Что-то недонастроил или зпросы все быстро выполняются? |
|
25.08.2009, 10:10 | #7 |
Участник
|
Цитата:
Во-вторых, в ax4 и выше в конфигурационной утилите надо включать галочки на закладке Tracing (по крайней мере эти) Об этом Еременко где-то в своих блогах писал. |
|
|
За это сообщение автора поблагодарили: ena_ax (1). |
25.08.2009, 10:38 | #8 |
Administrator
|
Хм... а я пользовался трассировкой и без этих галок. Единственное что требовалось - это в конфигурации аоса поставить галки:, по крайней мере нижнюю.
А дальше - выставляешь апертуру, вывод в инфолог и уже все сразу сыпется Не, понятно - что без флажка Bind variables к примеру - значения переменных не увидишь, но отловить долгий запрос и понять где он в коде генерируется - вполне можно
__________________
Возможно сделать все. Вопрос времени Последний раз редактировалось sukhanchik; 25.08.2009 в 10:40. |
|
31.08.2009, 11:45 | #9 |
Участник
|
При помощи Tracer выявил запрос, который долго обрабатывается (время выполнения - 222598). Помогите разобраться в причине столь медленного выполненния. После реиндексации запрос обрабатывается без замедлений.
SELECT SUM(A.POSTEDQTY),SUM(A.POSTEDVALUE),SUM(A.PHYSICALVALUE),SUM(A.DEDUCTED),SUM(A.RECEIVED),SUM(A.RESERVPHYSICAL),SUM(A.RESERVORDERED),SUM(A.REGISTERED),SUM(A.PICKED),SUM(A.ONORDER),SUM(A.ORDERED),SUM(A.ARRIVED),SUM(A.QUOTATIONRECEIPT),SUM(A.QUOTATIONISSUE),SUM(A.AVAILPHYSICAL),SUM(A.AVAILORDERED),SUM(A.POSTEDVALUESECCUR_RU),SUM(A.PHYSICALVALUESECCUR_RU),SUM(A.PHYSICALINVENT) FROM INVENTSUM A WHERE ((A.DATAAREAID=?) AND ((A.ITEMID=?) AND (A.CLOSED=?))) AND EXISTS (SELECT 'x' FROM INVENTDIM B WHERE ((B.DATAAREAID=?) AND ((B.INVENTDIMID=A.INVENTDIMID) AND (B.INVENTLOCATIONID=?)))) Место в коде таблица InventSum\findSum X++: ********* default: select #inventSumFields from inventSum where inventSum.ItemId == _itemId && inventSum.Closed == NoYes::No #inventDimExistsJoin(inventSum.InventDimId,inventDim,_InventDimCriteria,_InventDimParm); |
|
31.08.2009, 12:06 | #10 |
Гость
|
У вас в заказах строк сколько?
есть ли одинаковые номенклатуры? Последний раз редактировалось AX2009; 31.08.2009 в 12:08. |
|
31.08.2009, 12:13 | #11 |
Administrator
|
Есть еще в Tracer такая кнопочка - План исполнения, а затем Рассчитать новый план - там показывается по какому индексу идет выборка.
Для начала попробуйте в индексе \Data Dictionary\Tables\InventSum\Indexes\ClosedItemDimIdx поставить первым полем ItemId, а вторым Closed. А также скажите - какие индексы у Вас на таблице InventSum (интересует список полей по индексам с учетом положения поля в индексе). Плюс скажите по какому индексу ведется выборка по InventSum. Общие правила такие: 1. Поля, в которых содержится большее количество разнородной информации должны быть раньше в индексе. Очевидно, что в ItemId содержится больше разнородной информации, чем в Closed 2. Наибольшее количество полей с наибольшим количеством разнородной информации, участвующие в предложениях Where, Join, Group by, Order by запроса должны присутствовать в индексе. При этом БД должна правильно выбрать индекс (не запутаться в многообразии). Неправильно выбранный индекс приведет к более долгому исполнению запроса. Например, наличие енума в индексе на производительность может не повлиять (мало разнородной информации), но может повлиять на выбор индекса. 3. Увеличение количества индексов на таблице увеличивает время на вставку записей.
__________________
Возможно сделать все. Вопрос времени Последний раз редактировалось sukhanchik; 31.08.2009 в 12:33. |
|
31.08.2009, 13:19 | #12 |
Участник
|
Количество строк в Заказе порядка 10, одинаковых номенклатур нет.
Цитата:
Сообщение от sukhanchik
Есть еще в Tracer такая кнопочка - План исполнения, а затем Рассчитать новый план - там показывается по какому индексу идет выборка.
Для начала попробуйте в индексе \Data Dictionary\Tables\InventSum\Indexes\ClosedItemDimIdx поставить первым полем ItemId, а вторым Closed. А также скажите - какие индексы у Вас на таблице InventSum (интересует список полей по индексам с учетом положения поля в индексе). Плюс скажите по какому индексу ведется выборка по InventSum. Общие правила такие: 1. Поля, в которых содержится большее количество разнородной информации должны быть раньше в индексе. Очевидно, что в ItemId содержится больше разнородной информации, чем в Closed 2. Наибольшее количество полей с наибольшим количеством разнородной информации, участвующие в предложениях Where, Join, Group by, Order by запроса должны присутствовать в индексе. При этом БД должна правильно выбрать индекс (не запутаться в многообразии). Неправильно выбранный индекс приведет к более долгому исполнению запроса. Например, наличие енума в индексе на производительность может не повлиять (мало разнородной информации), но может повлиять на выбор индекса. 3. Увеличение количества индексов на таблице увеличивает время на вставку записей. 1. ClosedItemDimIdx - по рекомендации выставил порядок полей ItemId, Closed 2. ItemDimIdx - ItemId, InventDimId 3. DimIdIdx - InventDimId, Closed План запроса показал использование индексов ItemDimIdx, DimIdIdx. Последний раз редактировалось ena_ax; 31.08.2009 в 13:27. |
|
31.08.2009, 13:29 | #13 |
Administrator
|
Помогла моя рекомендация? Если нет - вертайте все взад
Вот индекс DimIdIdx при этой выборке не сдался совершенно. В нем нет ItemId, по которому идет выборка. Индекс ItemDimIdx в общем-то нормальный... Количество записей в InventTable больше количества записей в InventDim ? (иначе в этом индексе можно попробовать переставить поля)
__________________
Возможно сделать все. Вопрос времени |
|
31.08.2009, 13:51 | #14 |
Участник
|
Цитата:
Сообщение от sukhanchik
Помогла моя рекомендация? Если нет - вертайте все взад
Вот индекс DimIdIdx при этой выборке не сдался совершенно. В нем нет ItemId, по которому идет выборка. Индекс ItemDimIdx в общем-то нормальный... Количество записей в InventTable больше количества записей в InventDim ? (иначе в этом индексе можно попробовать переставить поля) К сожалению экспериментировать могу только на боевой базе, так как поймать момент падения производительности - не получается, а после поднятия бэкапа ошибка пропадает. |
|
31.08.2009, 14:41 | #15 |
Administrator
|
Цитата:
Игра с производительностью часто происходит на рабочей БД, т.к. не всегда на тестовой все воспроизводится. Не забывайте, что если Вы хоть как-то тронете индекс ItemDimIdx, по которому у Вас идет выборка - то это будет эквивалентно переиндексации InventSum по данному индексу, т.е. после этого у Вас опять все будет летать.
__________________
Возможно сделать все. Вопрос времени |
|
31.08.2009, 14:54 | #16 |
Administrator
|
А можно подетальнее сообщить по плану запроса? Интересуют параметры, нарисованные в зеленых овалах. А в нижней строке - интересует где больше просаживается производительность - на объединении таблиц или на поиске.
__________________
Возможно сделать все. Вопрос времени |
|
31.08.2009, 15:26 | #17 |
Участник
|
Странно, по плану небольшие затраты и ожижаемое кол-во строк.
|
|
31.08.2009, 15:41 | #18 |
Участник
|
Цитата:
Сообщение от ena_ax
При помощи Tracer выявил запрос, который долго обрабатывается (время выполнения - 222598). Помогите разобраться в причине столь медленного выполненния. После реиндексации запрос обрабатывается без замедлений.
Место в коде таблица InventSum\findSum X++: default: select #inventSumFields from inventSum where inventSum.ItemId == _itemId && inventSum.Closed == NoYes::No #inventDimExistsJoin(inventSum.InventDimId,inventDim,_InventDimCriteria,_InventDimParm); 2. Сколько записей в InventDim сколько записей в InventSum ? 3. Можно попробовать заменить #inventDimExistsJoin на #inventDimInnerJoin а) кажется такой есть b) думаю что нарушений алгоритма не будет - но если не уверены - выложите плиз сюда полный текст X++ метода, какая версия системы, какая структура вызова - из какого метода был вызван InventSum\findSum Последний раз редактировалось Волчара; 31.08.2009 в 15:43. Причина: уточнение |
|
31.08.2009, 15:56 | #19 |
Administrator
|
А на суммировании? (Stream Aggregate)
Может просто сейчас не тормозит запрос? Возможны по идее еще варианты - если кто-то другой лочит InventSum - и Вы подвисаете. Например - один (пакетник к примеру) запустил сводное планирование (пересчет склада), остальные наслаждаются скоростью работы.
__________________
Возможно сделать все. Вопрос времени Последний раз редактировалось sukhanchik; 31.08.2009 в 15:59. |
|
31.08.2009, 16:14 | #20 |
Участник
|
Цитата:
Сообщение от Волчара
1. Проблема всегда возникает только в этом запросе?
2. Сколько записей в InventDim сколько записей в InventSum ? 3. Можно попробовать заменить #inventDimExistsJoin на #inventDimInnerJoin а) кажется такой есть b) думаю что нарушений алгоритма не будет - но если не уверены - выложите плиз сюда полный текст X++ метода, какая версия системы, какая структура вызова - из какого метода был вызван InventSum\findSum 2. В InventDim - 192685 записей в InventSum - 174377 записей 3. Версия kernel 4.0.2501.116 Appl - 4.0.2501.347 |
|
Теги |
ax4.0, sql 2005, заказ на продажу, производительность, тормоза |
|
|