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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 08.12.2021, 11:06   #21  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,710 / 2632 (95) +++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от fed Посмотреть сообщение
Кстати - примерно полтора-два года назад, микрософт сделал новую фичу в D365FO, которая заставляет его в случае использования Azure SQL хранить tempDB таблицы в основной базе данных. И по моему эта фича уже год как включена и после экспорта данных из Tier2-instance можно увидеть в основной БД какое-то количество таблиц с "временными" именами.
А зачем это сделали ?
Они же медленнее должны работать.
Мусор в основной базе опять же.

Это включено всегда теперь или можно как-то менять настройкой?
Старый 08.12.2021, 11:32   #22  
fed is offline
fed
Moderator
Аватар для fed
Ex AND Project
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
2,834 / 5512 (189) ++++++++++
Регистрация: 13.03.2002
Адрес: Hüfingen,DE
Цитата:
Сообщение от Logger Посмотреть сообщение
А зачем это сделали ?
Они же медленнее должны работать.
Мусор в основной базе опять же.

Это включено всегда теперь или можно как-то менять настройкой?
Рискну предположить, что сделали это при переходе на Spartan - разделяемый пул Azure SQL Server. Если у меня несколько разных компаний (в смысле - разных несвязанных между собой клиентов Microsoft) на одном сервере живет, то можно попытаться прочитать чужие данные из tempDB. (не уверен что это так просто, но можно попробовать поискать в SQL Dictionary данные по таблицам в tempDB и потом попробовать почитать из каждой таблицы).
Если мне не изменяет память, раньше для включения/выключения этого режима был Flight, но сейчас я его что-то не смог найти. Наверное в случае Azure SQL режим включен намертво и не отключается.

Последний раз редактировалось fed; 08.12.2021 в 11:42.
За это сообщение автора поблагодарили: Logger (5).
Старый 08.12.2021, 12:49   #23  
fed is offline
fed
Moderator
Аватар для fed
Ex AND Project
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
2,834 / 5512 (189) ++++++++++
Регистрация: 13.03.2002
Адрес: Hüfingen,DE
Ладно - раз уж речь зашла о таблицах tempDB:
Как выяснилось, отключение функциональности Engineering Change в D365FO может очень прилично ускорить массовую вставку строк в складские журналы, заказы и sales quotation.
Есть такой метод: EngChgEcoResProductLifecycleStateRuleCheck::validateFilter(), который срабатывает при вставках в упомянутые выше таблицы. Этот метод копирует данные из таблицы в ее клон в tempDB и потом прогоняет запрос по этой временной копии. (можно у обычной, не временной таблицы вызвать метод vendTable.setTempDB() и система создаст tempDb-клон обычной таблицы) . Dispose() после этого не вызывается, соответственно на каждую вставку система генерирует уникальное новое имя временной таблицы, прогоняет по этой таблице запрос и тд. Если вставка идет в ручную (скажем - 300-400 строк заказов в час), то эти самые левые запросы в SQL Plan Cache погоды не делают. Если у нас имеется массовый импорт и мы пытаемся быстро залить скажем тысяч 20-30 строк, уникальные имена таблиц забивают Plan Cache, загоняя SQL Server на ёлку. (Кэш сбрасывается каждые 20-30 секунд и все запросы попадают на рекомпиляцию). Конечно скорость убивания SQL Server зависит от объема памяти на таковом и числа импортируемых строк, но вот например в моей VM, при ограничении размера памяти SQ Server в 8 Мб для того чтобы загнать сервер на ёлку достаточно было достаточно смешных 1500 строк в складских журналах...

Последний раз редактировалось fed; 08.12.2021 в 15:32.
За это сообщение автора поблагодарили: EVGL (8), sukhanchik (6).
Старый 09.12.2021, 08:31   #24  
skuull is offline
skuull
Участник
Most Valuable Professional
Лучший по профессии 2014
 
696 / 747 (26) +++++++
Регистрация: 08.03.2013
Адрес: ХЗ
В копилку проблем, относительно недавно поменяли что-то с tempdb и раньше preprocessed отчёты которые на tempdb каждый раз создавали новую таблицу но после чейнджа они начали браться из пула но криво. И какое-то время отчёты могли показывать старые данные. После пары нерешённых багов с мс мы на них забили, так что я хз есть ли с этим ещё проблемы и берутся все таблицы из пула или только отчёты.
Старый 09.12.2021, 10:42   #25  
skuull is offline
skuull
Участник
Most Valuable Professional
Лучший по профессии 2014
 
696 / 747 (26) +++++++
Регистрация: 08.03.2013
Адрес: ХЗ
Цитата:
Сообщение от skuull Посмотреть сообщение
В копилку проблем, относительно недавно поменяли что-то с tempdb и раньше preprocessed отчёты которые на tempdb каждый раз создавали новую таблицу но после чейнджа они начали браться из пула но криво. И какое-то время отчёты могли показывать старые данные. После пары нерешённых багов с мс мы на них забили, так что я хз есть ли с этим ещё проблемы и берутся все таблицы из пула или только отчёты.
За это отвечает(отвечал) volatile_isconnectionleveltempdbpoolenabled флаг в sysglobalconfiguration
За это сообщение автора поблагодарили: sukhanchik (4), Logger (3).
Старый 09.12.2021, 16:29   #26  
vmoskalenko is offline
vmoskalenko
Участник
Аватар для vmoskalenko
 
143 / 334 (12) ++++++
Регистрация: 25.01.2007
Адрес: Toronto
Цитата:
Сообщение от Logger Посмотреть сообщение
У меня коллега заморочился этим вопросом, даже написал скрипт по вычищению этих табличек.
Ссылки на утилиты
https://github.com/d365collaborative...empDbTables.md

https://msdyn365fo.wordpress.com/201...x-environment/
За это сообщение автора поблагодарили: Logger (5).
Старый 11.07.2022, 13:20   #27  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,710 / 2632 (95) +++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Делаю модификацию, которая организует некий кеш в TempDb таблице.
При закрытии аксапты хочется корректно его освободить. Т.е. вызвать
tempDb.dispose()

Где правильнее всего разместить этот вызов ?
Напрашивается
\Classes\Application\closingDown
Старый 11.07.2022, 13:28   #28  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4477 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Logger Посмотреть сообщение
Где правильнее всего разместить этот вызов ?
Напрашивается
\Classes\Application\closingDown
при падении Аксапты кэш не будет очищен.

"некий кеш" лучше организовывать при помощи стандартного кэш сервера. например Redis.
В том же Redis есть автопротухание данных.

тогда и несколько инстансев аксапты будут нормально работать.
и другие неаксаптовские подсистемы спасибо скажут.
и эцилопп не имеет права бить по ночам. никогда.
__________________
полезное на axForum, github, vk, coub.
Старый 11.07.2022, 13:36   #29  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,710 / 2632 (95) +++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от mazzy Посмотреть сообщение
при падении Аксапты кэш не будет очищен.
Это да.
Но я и не надеялся такое вылечить. Не все под силу.
Там много г. во временной базе остается при падении аоса.

Это у меня не совсем кеш. Я не совсем корректный термин употребил. В общем времянка хранит некие данные актуальные только для конкретного юзера. Т.е. у каждого юзера свое наполнение.

Соответственно вопрос, с учетом багов ядра по освобождению времянок, куда корректно было бы поместить вызов dispose() для времянки.

Может кто делал и проверял как работает.
Интересно также CIL сессии и те, что создаются по RunAs. Для них ядро вызывает closingDown ?

Хотелось остаться внутри аксапты и не привлекать сторонние инструменты (Redis, etc)
Старый 11.07.2022, 13:53   #30  
fed is offline
fed
Moderator
Аватар для fed
Ex AND Project
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
2,834 / 5512 (189) ++++++++++
Регистрация: 13.03.2002
Адрес: Hüfingen,DE
Мне кажется что проблема зависших времянок в tempDb не так страшна. Когда AOS будет останавливаться, времянки удалятся.
Проблема с времянками в том, что если ты их в цикле создаешь, а потом через dispose() не освобождаешь, то кэш плана запроса забивается тысячам одинаковых запросов, у которых только имя временной таблицы отличается. В твоем случае гарантируется что всего один инстанц времянки на пользователя будет и даже если пользователь из системы выйдет, а времянка не удалится, то новых запросов в кэше по ней появлятся не будет. То есть - я бы с этой проблемой просто не стал бы бороться.
Старый 11.07.2022, 14:30   #31  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,710 / 2632 (95) +++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Да, циклов там не будет.
Согласен, что несущественная проблема.
Просто все мы стремимся к идеалу, хоть чуть-чуть.

Вот и возникает вопрос.
А как бы правильно ...
Старый 26.10.2022, 16:10   #32  
fed is offline
fed
Moderator
Аватар для fed
Ex AND Project
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
2,834 / 5512 (189) ++++++++++
Регистрация: 13.03.2002
Адрес: Hüfingen,DE
Опыт показал, что если в классе создать переменную типа tempDB, положить туда данные, потом FormDataSource прикрепить к этому же инстанцу временной таблицы через myDataSource_ds.cursor().linkPhysicalTableInstance(MyCalculationClass.tempDbBuffer()), а потом вызвать для исходных табличных переменных из MyCalculationClass метод Dispose(), то последствия бывают самые интересные и не вполне предсказуемые. В том числе иногда падает Productive AOS
Я так понимаю, когда форма закрывается, переменные с датасорцами не освобождаются немедленно, а ждут сборки мусора. Потом в какой-то момент времени сборщик мусора просыпается, пытается удалить датасорцы и прикрепленные к ним табличные переменные, а там опаньки - табличные переменные-то уже кто-то удалил. В итоге сервер с заметной вероятностью падает.
В общем - похоже что после linkPhysicalTableInstance() вызывать Dispose для табличных переменных просто нельзя.
P.S. D365FO. Но я подозреваю что в DAX2012 грабли аналогичной конструкции.
За это сообщение автора поблагодарили: sukhanchik (6), Logger (5).
Старый 27.10.2022, 08:45   #33  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,107 / 1249 (46) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
Цитата:
Сообщение от fed Посмотреть сообщение
Опыт показал, что если в классе создать переменную типа tempDB, положить туда данные, потом FormDataSource прикрепить к этому же инстанцу временной таблицы через myDataSource_ds.cursor().linkPhysicalTableInstance(MyCalculationClass.tempDbBuffer()), а потом вызвать для исходных табличных переменных из MyCalculationClass метод Dispose(), то последствия бывают самые интересные и не вполне предсказуемые. В том числе иногда падает Productive AOS
...
В общем - похоже что после linkPhysicalTableInstance() вызывать Dispose для табличных переменных просто нельзя.
P.S. D365FO. Но я подозреваю что в DAX2012 грабли аналогичной конструкции.
Да, совсем недавно на 2012 с этим столкнулся.
Правда у меня падает не АОС, а клиент и не через некоторое время, а практически сразу при закрытии формы.

Но и кейс немного другой, я вызываю linkPhysicalTableInstance не на датасорсе, а наоборот, передаю курсор датасорса и его прикрепляю к локальной переменной:
X++:
public void inventToShipPrepare(
    ShipmentJournalRequestMap_OVK   _journalRequest,
    ShipmentInventToShipMap_OVK     _inventToShip
    )
{
    ShipmentInventToShipMap_OVK         inventToShip;
    ;
    
    inventToShip        = _inventToShip.emptyRecord();
    if (_inventToShip.isTempDb())
    {
        inventToShip.linkPhysicalTableInstance(_inventToShip);
    }

...

    // TODO: AKlim 12.10.2022 Попробовать разобраться в причине падения клиента
    //       Пока освобождение закомментировано, так как падает клиент при закрытии формы
    /*    
    if (_inventToShip.isTempDb())
    {
        inventToShip.dispose();
    }
    */
}
За это сообщение автора поблагодарили: Logger (5).
Старый 27.10.2022, 12:18   #34  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,710 / 2632 (95) +++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Крайне неприятный баг.
Использованные вами методы работают со ссылкой на переменную. Возможно из-за этого дополнительные зависимости появляются и поэтому падает.

А если задействовать методы ?
getPhysicalTableName
useExistingTempDBTable

Там просто реальное SQL имя таблички передается.
Возможно не будет падать.
Я в своей модификации использовал их - не падало. Правда сценарий был немного другой.

Последний раз редактировалось Logger; 27.10.2022 в 12:23.
Старый 27.10.2022, 12:58   #35  
fed is offline
fed
Moderator
Аватар для fed
Ex AND Project
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
2,834 / 5512 (189) ++++++++++
Регистрация: 13.03.2002
Адрес: Hüfingen,DE
Цитата:
Сообщение от Logger Посмотреть сообщение
Крайне неприятный баг.
...
А если задействовать методы ?
getPhysicalTableName
useExistingTempDBTable
Я на эту тему думал, но мы решили, что это все равно настроечная форма, которой в месяц раз пять пользуются. Соответственно - пять мусорных временных табличек в месяц - это дешевле чем эксперименты, которые иногда сервер роняют. (При этом о том, что AOS от этой функциональности иногда падает, мы знали с февраля примерно, но комбинацию данных, при которой это железно происходит - выловили только неделю назад).

Последний раз редактировалось fed; 27.10.2022 в 14:18.
Теги
dispose, tempdb

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
TempDB table populated in CIL Blog bot DAX Blogs 9 05.03.2019 18:23
Axilicious:Permission denied in database ‘TempDB’ Blog bot DAX Blogs 0 27.01.2015 18:11
axinthefield: TempDb blocking with Dynamics AX Blog bot DAX Blogs 0 13.06.2011 00:11
Работа с таблицами Bigzone DAX: Программирование 7 25.10.2006 13:24
Помогите новичку (Работа с таблицами) Sada DAX: Программирование 4 03.06.2005 10:13
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

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