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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 14.06.2005, 18:31   #1  
vey is offline
vey
Участник
 
60 / 12 (1) ++
Регистрация: 15.03.2005
Адрес: Киев
Хранимые процедуры и производительность
Здравствуйте!
Функция «Развертывание» в сводном плане выполняется порядка 28 минут для большого изделия (несколько тысяч составляющих, более 10 уровней вложенности спецификации). Время неприемлемое, разумеется. В алгоритме класса, осуществляющего развертывание (ReqTransExplode) коренных улучшений добиться не удалось; были выбраны требуемые поля в запросах вместо записи целиком, поэкспериментировали с индексами. Основная проблема в том, что суть алгоритма – рекурсивный спуск (или подъем при развертывании вверх) по дереву. А рекурсия никогда особой шустростью не отличалась... В результате для сложного изделия имеем много погружений в рекурсию и множество мелких запросов к БД (таблицы ReqTrans, ReqCalc). Как один из вариантов улучшения ситуации был рассмотрен перенос алгоритма развертывания на SQL-server (написание Stored Procedure). Однако в таком случае алоритм отрабатывает еще медленнее, 4 минуты против 12 секунд в стандартном варианте. С чем это может быть связано? Алгоритм перенесен практически 1:1. Единственное отличие – погружение по дереву реализовано не вширину, а вглубину (соответственно чаще вызывает сама себя ф-ция). Имеются сильные подозрения, что именно в этом дело.:-( Но только ли в этом? Был у кого-нибудь опыт переведения части кода в хранимые процедуры? Насколько хорошо MS SQL server 2000 справляется с рекурсией? Может, возможно повысить скорость отработки хранимой процедуры использованием каких-то ключевых слов, инструкций, параметров и т.д.? Ни за что не стали бы так возиться с развертыванием, однако данный класс используется в очень критичном для клиента алгоритме.
Старый 14.06.2005, 18:33   #2  
vey is offline
vey
Участник
 
60 / 12 (1) ++
Регистрация: 15.03.2005
Адрес: Киев
извините, сделала опечатку.... таблицы ReqTrans, ReqTransCov
Старый 14.06.2005, 19:08   #3  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,952 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Вынос обработки в хранимую процедуру и не должен был помочь, так как у вас много маленьких запросов к базе, а SQL сервер читает данные страницами по 8 кб. Так что реально объем прочитанных данных очень велик. (Я уже не говрю про время поиска).

Самое надежное в данном случае попробовать изменить алгоритм расчета, так чтобы используемые записи кешировались вами. Например в map-е или во временной таблице.

Как вариант использования map посмотрите
класс расчета себестоимости InventCostItemDim
методы
load()
loadTrans()
Старый 14.06.2005, 19:14   #4  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Боюсь советовать не видя базу глазами.

Logger советует в правильном направлении. Надо думать в сторону кэширования. Стоит попробовать изменить режим кэширования у таблицы. Но надо быть очень осторожным.

Программировать надо в последнюю очередь.
__________________
полезное на axForum, github, vk, coub.
Старый 14.06.2005, 19:27   #5  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,952 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
http://www.axforum.info/forums/showt...&threadid=8443
Старый 14.06.2005, 21:51   #6  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1849 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
Сейчас крамольную мысль скажу: если уж решили переносить, то точно не 1:1.

С рекурсией вообще надо бы поосторожнее - ее максимальная глубина в сиквеле ограничена, да и не затачивался он под эти цели

С чтением по 8кб позволю себе маленькое уточнение - все-таки чтение осуществляется не страницами, а экстентами (т.е. как минимум 64к). Про время поиска и объем ввода-вывода спорить можно долго, но это не принципиально

С кэшированием согласен на 100%
Старый 15.06.2005, 10:43   #7  
vey is offline
vey
Участник
 
60 / 12 (1) ++
Регистрация: 15.03.2005
Адрес: Киев
По поводу рекурсии в SQL, но и правда вещь сомнительная, полностью согласна. Кажется, допускается всего 32 уровня вложенности, так что полагаться на то, что этого хватит, опасно, даже если бы прирост производительности был серьезный при переходе на процедуру. :-( Что касается кеширования, то обе таблицы (ReqTrans, ReqTransCov) относятся к типу Transaction. Метод кеширования, соответственно, None...
Старый 15.06.2005, 10:56   #8  
vey is offline
vey
Участник
 
60 / 12 (1) ++
Регистрация: 15.03.2005
Адрес: Киев
А при отработке развертывания из Ахарта те же запросы, посылаемые к серверу, по-другому считываются и обрабатываются разве (не такими же страницами или экстентами), что получается быстрее?
Не совсем понятен этот момент.:-(
Можно подробней объяснить?
Старый 15.06.2005, 12:08   #9  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,952 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Так в том то и дело, что выносом алгоритма в хранимую процедуру вы нисколько не изменили запросы. Нагрузка на движок базы данных осталась прежней. Вы его на колени поставили...

А если используется кеширование, то тогда многих запросов к базе просто нет. Необходимые данные запоминатся на сервере приложений Аксапты и заново не запрашиваются. За счет этого и ускорение.
Старый 16.06.2005, 10:43   #10  
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
Как альтернативу включению кэша таблицы или полного переписывания алгортима на использование map, хочу посоветовать почитать системную документацию по классу recordViewCache. Посмотреть на то как это используется можно в классе inventMovement.viewCacheInventTransId. В вашем случае - основные кандидаты на кэширование - reqTrans и reqTransCov. Есь надежда что все это для данного плана в память на сервере влезет.

Правда - я не знаю чего будет происходить если AOS (ну или клиенту) не хватит на кэширование тех 2Гб которые ему Windows может выделить. Памяти на сервер добавлять бесполезно, поскольку 64битного режима у AOS нету, а AWE как, скажем, MS SQL, он не поддерживает.
Старый 16.06.2005, 10:47   #11  
vey is offline
vey
Участник
 
60 / 12 (1) ++
Регистрация: 15.03.2005
Адрес: Киев
Спасибо за идею, посмотрим; а пока действительно переписали алгоритм развертывания на мар и получили время 10 секунд против прежних почти 30 минут.
Старый 16.06.2005, 22:06   #12  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Изначально опубликовано vey
Спасибо за идею, посмотрим; а пока действительно переписали алгоритм развертывания на мар и получили время 10 секунд против прежних почти 30 минут.
Это ровно до тех пор, пока map в память клиента помещается
Как только мап подрастет будет жуткий своп.

Я ведь не ошибся? Вы, наверняка, начали делать обработку мапа на сервере, правда?
__________________
полезное на axForum, github, vk, coub.
Старый 17.06.2005, 10:45   #13  
vey is offline
vey
Участник
 
60 / 12 (1) ++
Регистрация: 15.03.2005
Адрес: Киев
Получается, не спасет ни использование класса map, ни RecordViewCache, учитывая ограничения на память, и все это лишь временное решение, для сравнительно небольшого объема данных?:-( Очень плохо, конечно. Остаются, значит, только эксперименты с кешированием? Как я уже писала выше, обе таблицы имеют тип "Проводка" (Transaction). Какой тип кеширования может помочь в этом случае?
Старый 17.06.2005, 10:56   #14  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Изначально опубликовано vey
Остаются, значит, только эксперименты с кешированием?
Кэширование тоже завязано на объем памяти.

Но помни! В 12 часов твоя карета превратится в тыкву...
Кучер в крысу... Платье - в гряную рвань..
Туфли... А, собственно, что это я? Я же добрый фей... (С) КВН
__________________
полезное на axForum, github, vk, coub.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Прямое обращение к СУБД, минуя Axapta murad DAX: Программирование 34 12.03.2007 18:26
Производительность БД при смене Recovery Model polygris DAX: Администрирование 7 19.01.2007 18:43
Прошу разъяснить, какие процедуры и методы проходит система при открытии, закрытии. Кандидат DAX: Программирование 9 02.11.2005 14:34
SQL Profiler не показывает процедуры!SOS! naomy DAX: Программирование 13 28.09.2005 14:33
Вызов хранимой процедуры Diman DAX: Программирование 6 17.09.2003 10:24

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

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

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