|
03.12.2021, 00:50 | #1 |
Banned
|
Цитата:
Сообщение от sukhanchik
TempDB-таблицы себя замечательно ведут и замечательно джойнятся. А уж тот факт, что RecId там является счетчиком, который управляется СУБД - вообще достойно уважения. Так что джойны с TempDB-шными таблицами очень даже хороши. Особенно, когда нужно отфильтровать по списку RecId (RecordReferenceList тоже работает - но его потом нужно чистить)
Вот как там в Prod Azure DB TempDB чистится? Черт его знает. |
|
03.12.2021, 01:39 | #2 |
Administrator
|
Цитата:
Старый объект удаляется, как только он становится не нужным. Поэтому таблица как таковая не чистится - она просто становится мусором. И через некоторое время то место, на котором она находилась в файле базы TempDB - перезаписывается данными другой временной таблицы. Поэтому тут никаких чисток нет, принцип един и общий и какой-то мегаособенности работы SQL Server с TempDB в Azure (по сравнению с локальной версией) нет.
__________________
Возможно сделать все. Вопрос времени |
|
03.12.2021, 02:27 | #3 |
Участник
|
Вот это кстати интерестный момент. А кто ее удаляет? На одном из клиентов наблюдал что таблицы были в большом кол-ве в tempdb
|
|
03.12.2021, 07:44 | #4 |
Administrator
|
Цитата:
Цитата:
SQL Server PDW drops tables from tempdb when:
Ну и самый простой способ проверить. Берем табличку в АХ, которая является временной в tempDB (например, TmpRecIdFilter). Пишем джобик на Х++ (класс в D365), где делаем select из этой таблицы, после чего получаем в локальную переменную значение метода cursor.getPhysicalTableName() - это и будет настоящее имя таблицы. Останавливаем исполнение кода в отладчике (чтобы сессия не закрылась), идем в SQL Manamegent Studio и делаем запрос select * from tempDB..[то имя, которое мы получили из метода getPhysicalTableName()]. После завершения работы джобика (если мы отпустим отладчик) этот запрос уже невозможно будет выполнить (будет ошибка)
__________________
Возможно сделать все. Вопрос времени Последний раз редактировалось sukhanchik; 03.12.2021 в 07:49. |
|
03.12.2021, 11:06 | #5 |
Moderator
|
Цитата:
Сообщение от sukhanchik
Ну и самый простой способ проверить. Берем табличку в АХ, которая является временной в tempDB (например, TmpRecIdFilter). Пишем джобик на Х++ (класс в D365), где делаем select из этой таблицы, после чего получаем в локальную переменную значение метода cursor.getPhysicalTableName() - это и будет настоящее имя таблицы. Останавливаем исполнение кода в отладчике (чтобы сессия не закрылась), идем в SQL Manamegent Studio и делаем запрос select * from tempDB..[то имя, которое мы получили из метода getPhysicalTableName()].
После завершения работы джобика (если мы отпустим отладчик) этот запрос уже невозможно будет выполнить (будет ошибка) Фраза "A session is disconnected. Only temporary tables for the session are dropped." относиться, в моем понимании, только к временным таблицам самого SQL Server, имена которых, по правилам, должны начинаться с символов # или ##. А Аксаптовские tempDb таблицы, с точки зрения SQL Server, это самые обычные таблицы, вполне постоянные, только они храняться в tempDB и рестарта сервера БД не переживают. Я подозреваю, что как только таблица в Аксапте перемещается между SQL сессиями (например - после заполнения в серверном методе начинает использоваться как data source в форме; а все формы для броузинга таблиц используют одну shared-сессию), весь механизм автоматического удаления таблицы отключается и она (возможно после удаления из нее смысловых данных) болтается в БД до остановки AOS. Возможно микрософт просто не смог сделать нормального сборщика мусора для временных таблиц и часть из них удаляет только при останове сервера... Кстати - примерно полтора-два года назад, микрософт сделал новую фичу в D365FO, которая заставляет его в случае использования Azure SQL хранить tempDB таблицы в основной базе данных. И по моему эта фича уже год как включена и после экспорта данных из Tier2-instance можно увидеть в основной БД какое-то количество таблиц с "временными" именами. |
|
|
За это сообщение автора поблагодарили: trud (5), sukhanchik (5), Logger (5), ax_mct (5). |
03.12.2021, 11:26 | #6 |
Участник
|
Цитата:
Сообщение от fed
С другой стороны, я неоднократно наблюдал такую картину: После скажем месяца аптайма останавливаем AOSы и оно как-то очень медленно останавливается. Если в этот момет понаблюдать за происходящим на сервере БД, то можно обнаружить что туда сотнями идут запросы вида Drop table tempdb.tXXXXXX_YYY..YYYY
Более того - если аос падает или его пристрелили не дожидаясь пока он сам остановится, то множество этих табличек во временной базе так и остаются пока не рестартуют SQL целиком. У меня коллега заморочился этим вопросом, даже написал скрипт по вычищению этих табличек. |
|
05.12.2021, 23:38 | #7 |
Участник
|
Цитата:
Сообщение от Logger
Да, точно так.
Более того - если аос падает или его пристрелили не дожидаясь пока он сам остановится, то множество этих табличек во временной базе так и остаются пока не рестартуют SQL целиком. У меня коллега заморочился этим вопросом, даже написал скрипт по вычищению этих табличек. X++: custTmpAccountSum.dispose(); |
|
|
За это сообщение автора поблагодарили: fed (5), Vadik (1), trud (2), sukhanchik (4), Logger (3), ax_mct (5), S.Kuskov (5). |
09.12.2021, 16:29 | #8 |
Участник
|
Цитата:
https://github.com/d365collaborative...empDbTables.md https://msdyn365fo.wordpress.com/201...x-environment/ |
|
|
За это сообщение автора поблагодарили: Logger (5). |
03.12.2021, 19:31 | #9 |
Administrator
|
Спасибо. Я не обращал на это внимание. Буду знать. Тогда прошу прощения за мое неверное понимание работы механизма
__________________
Возможно сделать все. Вопрос времени |
|
08.12.2021, 11:06 | #10 |
Участник
|
Цитата:
Сообщение от fed
Кстати - примерно полтора-два года назад, микрософт сделал новую фичу в D365FO, которая заставляет его в случае использования Azure SQL хранить tempDB таблицы в основной базе данных. И по моему эта фича уже год как включена и после экспорта данных из Tier2-instance можно увидеть в основной БД какое-то количество таблиц с "временными" именами.
Они же медленнее должны работать. Мусор в основной базе опять же. Это включено всегда теперь или можно как-то менять настройкой? |
|
08.12.2021, 11:32 | #11 |
Moderator
|
Цитата:
Если мне не изменяет память, раньше для включения/выключения этого режима был Flight, но сейчас я его что-то не смог найти. Наверное в случае Azure SQL режим включен намертво и не отключается. Последний раз редактировалось fed; 08.12.2021 в 11:42. |
|
|
За это сообщение автора поблагодарили: Logger (5). |