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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 26.01.2024, 20:31   #1  
Lankey is offline
Lankey
Участник
 
127 / 28 (1) +++
Регистрация: 19.05.2020
Trace parcer в D365
D365

На sandbox пользователь открывает форму global address book и пытается создать новую запись
В этот момент повисает система


Я новичок в 365. Чтобы понять причину пытаюсь воспользоваться Trace parcer
В одном и том же окне браузера открываю GAB и запускаю там же Help-> Trace parcer
Но:
1) Пока процесс не закончится я не могу остановить trace parcer
2) Когда по таймату выпаает ошибка , то только тогда могу сохранить его, но
a) лог занимает 200 МБ
b) почему-то в логах нет таблиц, что используются формой, хотя сообщение об ошибке появляется на экране, что не удалось выбрать запись в DirPartyRelationship
c) В Trace parcer , когда импортирую trace, то вверху экрана есть dropdown "select Grouping" . Там в колонке username вместо имени выпадают GUIDs. Как понять, какую запись нужно выбрать(какая относится к моему процессу)?

Eще небольшой вопрос - могу ли я через VS на devbox подключиться к sandbox , чтобы подебаггить открытие формы?


Спасибо за помощь!
Старый 27.01.2024, 11:01   #2  
Stitch_MS is offline
Stitch_MS
Участник
Аватар для Stitch_MS
Соотечественники
 
397 / 478 (16) +++++++
Регистрация: 27.02.2006
Адрес: Дания
1) А вы открывайте дополнительную вкладку в браузере, и стартуйте/останавливайте трейспарсер оттуда. Тогда зависание на первой вкладке не помешает остановке.

2с) Можно в трейспарсере на закладке X++ или SQL в строке поиска написать что-то типа *SalesTable*, и переключаться между GUID. Сессия, в которой такой поиск что-нибудь найдёт с текстом "SalesTable" в названии метода или в теле SQL-выражения, с большой вероятностью ваша.

Подебаггить можно. https://learn.microsoft.com/en-us/dy...ario-debugdiag
За это сообщение автора поблагодарили: MorpheusX (1).
Старый 27.01.2024, 15:50   #3  
Lankey is offline
Lankey
Участник
 
127 / 28 (1) +++
Регистрация: 19.05.2020
Спасибо.
Да, две вкладки тоже открывала. Trace лог оказался в более чем 10 раз меньше, чем когда в окне, где подвисает форма. Поэтому была не уверена, что это правильный подход. У вас так работает?

Когда фильтрую по таблице, то ненахожу dirParty* записей вообще(пункт (b) выше), поэтому и вопрос как найти User Name (GUID), что соответсвует моей сессии.

Спасибо за ссылку на то, как дебагить UAT из-под DEV.
"Make sure that the version of the code and binaries in the DevTest environment exactly match the version in the UAT environment" - шикарно MS придумал Как может код быть он таким же, если на DEV разработка проводится? Может, я просто не знаю, как быстро временно восстановить копию UAT на DEV и также быстро вернуть после дебаггинга все обратно)?
Старый 27.01.2024, 21:07   #4  
Stitch_MS is offline
Stitch_MS
Участник
Аватар для Stitch_MS
Соотечественники
 
397 / 478 (16) +++++++
Регистрация: 27.02.2006
Адрес: Дания
Трейспарсер на второй вкладке часто использую, никаких проблем с этим не было.

Если фильтр "*dirparty*" не находит ничего, может это из-за кеширования? Еще можно правой кнопкой на форме кликнуть, чтобы из контекстного меню узнать ее название, и дальше в парсере искать по названию формы на закладке x++.

Абсолютно идентичный код необязательно, просто нужно понимать, что код на dev работает в этом режиме с базой данных uat. Если на dev в таблице есть новое поле, и во время отладки эта таблица используется, то может вывалиться ошибка.
За это сообщение автора поблагодарили: Lankey (1).
Старый 29.01.2024, 15:28   #5  
fed is offline
fed
Moderator
Аватар для fed
Ex AND Project
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
2,907 / 5717 (196) ++++++++++
Регистрация: 13.03.2002
Адрес: Hüfingen,DE
Я бы еще посмотрел на список blocking statements в LCS. Скорее всего, зависание происходит из за блокировок в SQL. При этом если в X++ insert (или update) statement отвалился по таймауту, то этот отвалившийся statement в трассировку, если я правильно помню, не попадает.
Старый 30.01.2024, 17:15   #6  
Lankey is offline
Lankey
Участник
 
127 / 28 (1) +++
Регистрация: 19.05.2020
Я сделала DBREINDEX на PreProd для DirPartyRelationships индекс по Partition, у которого fragmentation был 98% и создание новой записи стало мгновенно выполняться.

Только не ясно, что теперь делать, если PreProd - это копия prod и там все индексы микрософт поддерживает.

Последний раз редактировалось Lankey; 30.01.2024 в 17:34.
Старый 30.01.2024, 17:27   #7  
Lankey is offline
Lankey
Участник
 
127 / 28 (1) +++
Регистрация: 19.05.2020
Кстати, зодно заметила, что на форме DirPartyTable, если посмотреть используемый запрос (Form info->show hidden elements), то там в (стандартном, форма не модифицирована) запросе есть
DirPartyTable.INVALID FIELD = DirNAmeAffix.RecId
и
DirPartyTable.INVALID FIELD = DirNameSequence.RecId
Но ошибок никаких не выдается.
То есть, будто база не синхнонизирована.
У вас тоже так?


Installed product version 10.0.37
Platform version Update61

Последний раз редактировалось Lankey; 30.01.2024 в 17:41.
Старый 30.01.2024, 17:41   #8  
fed is offline
fed
Moderator
Аватар для fed
Ex AND Project
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
2,907 / 5717 (196) ++++++++++
Регистрация: 13.03.2002
Адрес: Hüfingen,DE
Цитата:
Сообщение от Lankey Посмотреть сообщение
Кстати, зодно заметила, что на форме DirPartyTable, если посмотреть используемый запрос (Form info->show hidden elements), то там в (стандартном, форма не модифицирована) запросе есть
DirPartyTable.INVALID FIELD = DirNAmeAffix.RecId
и
DirPartyTable.INVALID FIELD = DirNameSequence.RecId
То есть, будто база не синхнонизирована.
У вас тоже так?


Installed product version 10.0.37
Platform version Update61
У меня в 10.0.38 точно также и мне кажется что это только потому, что Form information не умеет толком с наследованием таблиц работать и не показывает поля из дочерних таблиц (хотя по ним как раз есть какие-то условия для joinов)
А по поводу индексов - я бы тупо написал небольшие скриптики для переиндексации нужных таблиц (через классы Connection и Statement) и выполнил бы их в PROD через вот этот механизм.
За это сообщение автора поблагодарили: Logger (3), MorpheusX (1), Lankey (1).
Старый 31.01.2024, 17:31   #9  
Lankey is offline
Lankey
Участник
 
127 / 28 (1) +++
Регистрация: 19.05.2020
Извините, что снова к вам...
За ночь обновили базу в PrePROD новой версией с PROD. Заново прогнала reindex, чтобы убедиться, что точно дело в индексах (вчера, как только переиндексировала, то сразу стала форма открываться) и .... никакого эффекта. Создание новой записи в GAB (кнопка "New") висит снова по полчаса. За эти полчаса два раза появляется сообщение, что предлагает продолжать ждать. И в конце концов вываливается сообщение,что запись в DirPartyRelationship не может быть выбрана
В LCS посмотрела, нет блокировок (и заодно в dbo.sysprocesses перепроверила. Там тоже нет блокировок. Зато у моего процесса заметила lastwaittype = SOS_SCHEDULER_YIELD)
На SQL сервере ничего больше нет, только "мой" запрос и у него ... logical reads = 1 366 710 036 и растет. Ну то есть, просто умопомрачительно много, хотя все индексы переделала в используемых таблицах. Может быть, что кэш старый и обновленные индексы не влияют на исполнение запроса?
DROPCLEANBUFFERS не могу прогнать(прав нет) , как и FREEPROCCACHE(plan_handle) для конкретного плана. Хотя, надо сказать, что у плана creation_time свежий, то есть, он создан уже после индексации создан. План этот содержит placeholders, т.е параметры с @
Если запускаю через sql server management studio запрос, отловленый traceParcer , т.е уже с подставленными параметрами, то мгновенно выполняется.

Что делать-то ?

Последний раз редактировалось Lankey; 31.01.2024 в 17:45.
Старый 31.01.2024, 18:39   #10  
fed is offline
fed
Moderator
Аватар для fed
Ex AND Project
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
2,907 / 5717 (196) ++++++++++
Регистрация: 13.03.2002
Адрес: Hüfingen,DE
Вообще в Azure SQL DBCC Freeproccache() не работает. Надо пользоваться синтаксисом
Код:
ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE <plan_handle>
или просто
Код:
ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE
Прав для этого в тестовых инстанцах должно хватать (только что проверил).
Еще есть вариант, что у вас там самооптимизатор SQL Server ухитрился сам себе прописать plan guide. (Я, правда, такого никогда не видел, но как гипотеза). Так что если чистка кэша не поможет, ищите список plan guide и нету ли там вашего запроса.
Еще любопытно, а как, собственно, этот висящий запрос выглядит ? Я сталкивался с тем, что если у вас в форме определены saved views, то генератор запросов сходит с ума и добавляет в запрос многократно продублированные копии какой-то таблицы и десятки (если не сотни) каких-то достаточно странных range. Если такое случилось, SQL может вместо обычных миллисекунд думать эдак минуту-полторы.
Старый 31.01.2024, 18:53   #11  
Lankey is offline
Lankey
Участник
 
127 / 28 (1) +++
Регистрация: 19.05.2020
X++:
(@P1 bigint,@P2 bigint,@P3 int,@P4 int,@P5 int,@P6 int,@P7 int,@P8 int)
SELECT T1.CHILDPARTY,T1.LEGALENTITYDATAAREAID,T1.PARENTPARTY,T1.RELATIONSHIPTYPEID,
T1.VALIDFROM,T1.VALIDFROMTZID,T1.VALIDTO,T1.VALIDTOTZID,T1.SCHEMAVERSION,T1.RECVERSION,
T1.PARTITION,T1.RECID,T2.CHILDPARENTNAME,T2.CHILDPARTYTYPE,T2.DESCRIPTION,
T2.ISSYMMETRIC,T2.PARENTCHILDNAME,T2.PARENTPARTYTYPE,T2.RELATIONSHIPTYPEID,T2.SYSTEMTYPE,
T2.RECVERSION,T2.PARTITION,T2.RECID,T3.NAME,T3.RECVERSION,T3.RECID,T3.INSTANCERELATIONTYPE,T4.NAME,T4.RECVERSION,T4.RECID,
T4.INSTANCERELATIONTYPE 

FROM DIRPARTYRELATIONSHIP T1 CROSS JOIN DIRRELATIONSHIPTYPETABLE T2 

LEFT OUTER JOIN DIRPARTYTABLE T3 
ON ((T3.PARTITION=5637144576) AND (T1.CHILDPARTY=T3.RECID)) 

LEFT OUTER JOIN DIRPARTYTABLE T4 
ON ((T4.PARTITION=5637144576) AND (T1.PARENTPARTY=T4.RECID)) 
WHERE ((T1.PARTITION=5637144576) AND ((T1.PARENTPARTY=@P1) OR (T1.CHILDPARTY=@P2))) 
AND ((T2.PARTITION=5637144576) AND (((T2.SYSTEMTYPE<@P3) OR (T2.SYSTEMTYPE>@P4)) 
AND (T1.RELATIONSHIPTYPEID=T2.RELATIONSHIPTYPEID))) 

AND 
(EXISTS (SELECT 'x' FROM DIRPARTYRELATIONSHIPSUNIONVIEW T5 
WHERE ((T5.PARTITION=5637144576) 
AND (((T5.SYSTEMTYPE<@P5) OR (T5.SYSTEMTYPE>@P6)) AND (T1.CHILDPARTY=T5.OTHERPARTY))))) 
AND 

(EXISTS (SELECT 'x' FROM DIRPARTYRELATIONSHIPSUNIONVIEW T6 
WHERE ((T6.PARTITION=5637144576) AND (((T6.SYSTEMTYPE<@P7) OR (T6.SYSTEMTYPE>@P8)) AND (T1.PARENTPARTY=T6.OTHERPARTY))))) 
ORDER BY T1.VALIDFROM DESC OPTION(FAST 8)
В dirPartyTable 84024 записи
В dirPartyRelationship 284046 записи
В dirRelationshipTypeTable 42 записи

В трейспарсере то же самое, но с подставленными значениями

Последний раз редактировалось Lankey; 31.01.2024 в 18:57.
Старый 31.01.2024, 19:02   #12  
Lankey is offline
Lankey
Участник
 
127 / 28 (1) +++
Регистрация: 19.05.2020
X++:
SELECT T1.CHILDPARTY,
	T1.LEGALENTITYDATAAREAID,
	T1.PARENTPARTY,
	T1.RELATIONSHIPTYPEID,
	T1.VALIDFROM,
	T1.VALIDFROMTZID,
	T1.VALIDTO,
	T1.VALIDTOTZID,
	T1.SCHEMAVERSION,
	T1.RECVERSION,
	T1.PARTITION,
	T1.RECID,
	T2.CHILDPARENTNAME,
	T2.CHILDPARTYTYPE,
	T2.DESCRIPTION,
	T2.ISSYMMETRIC,
	T2.PARENTCHILDNAME,
	T2.PARENTPARTYTYPE,
	T2.RELATIONSHIPTYPEID,
	T2.SYSTEMTYPE,
	T2.RECVERSION,
	T2.PARTITION,
	T2.RECID,
	T3.NAME,
	T3.RECVERSION,
	T3.RECID,
	T3.INSTANCERELATIONTYPE,
	T4.NAME,
	T4.RECVERSION,
	T4.RECID,
	T4.INSTANCERELATIONTYPE 
FROM DIRPARTYRELATIONSHIP T1 CROSS 
JOIN DIRRELATIONSHIPTYPETABLE T2 LEFT 
OUTER 
JOIN DIRPARTYTABLE T3 ON ((T3.PARTITION=5637144576) 
	AND (T1.CHILDPARTY=T3.RECID)) LEFT 
OUTER 
JOIN DIRPARTYTABLE T4 ON ((T4.PARTITION=5637144576) 
	AND (T1.PARENTPARTY=T4.RECID)) 
WHERE ((T1.PARTITION=5637144576) 
	AND ((T1.PARENTPARTY=0) 
	OR (T1.CHILDPARTY=0))) 
	AND ((T2.PARTITION=5637144576) 
	AND (((T2.SYSTEMTYPE<29) 
	OR (T2.SYSTEMTYPE>40)) 
	AND (T1.RELATIONSHIPTYPEID=T2.RELATIONSHIPTYPEID))) 
	AND (
EXISTS (
SELECT 'X' 
FROM DIRPARTYRELATIONSHIPSUNIONVIEW T5 
WHERE ((T5.PARTITION=5637144576) 
	AND (((T5.SYSTEMTYPE<29) 
	OR (T5.SYSTEMTYPE>40)) 
	AND (T1.CHILDPARTY=T5.OTHERPARTY))))) 
	AND (
EXISTS (
SELECT 'X' 
FROM DIRPARTYRELATIONSHIPSUNIONVIEW T6 
WHERE ((T6.PARTITION=5637144576) 
	AND (((T6.SYSTEMTYPE<29) 
	OR (T6.SYSTEMTYPE>40)) 
	AND (T1.PARENTPARTY=T6.OTHERPARTY))))) 
	ORDER BY T1.VALIDFROM DESC OPTION(FAST 9)
Это из трейспарсера. В SQL Server Management Studio возвращает тут же 0 записей.

Последний раз редактировалось Lankey; 31.01.2024 в 19:08.
Старый 31.01.2024, 23:15   #13  
Lankey is offline
Lankey
Участник
 
127 / 28 (1) +++
Регистрация: 19.05.2020
( а из формы GlobalAddressBook->New около 30 минут висит, а потом выдается сообщение, что запись в DirPartyRelationship не может быть выбрана )
Старый 01.02.2024, 10:30   #14  
fed is offline
fed
Moderator
Аватар для fed
Ex AND Project
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
2,907 / 5717 (196) ++++++++++
Регистрация: 13.03.2002
Адрес: Hüfingen,DE
Запросы, с виду, нормальные. Может стоит просто обновить статистику по таблицам из запроса (и таблицам из view DIRPARTYRELATIONSHIPSUNIONVIEW)?
Старый 01.02.2024, 12:16   #15  
Lankey is offline
Lankey
Участник
 
127 / 28 (1) +++
Регистрация: 19.05.2020
В принципе reindex должен обновлять , но сделала на этих таблицах дополнительно update statistics <myTabless> with fullscan. Не помогло (
Спасибо за
X++:
ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE
Не знала. Да, прав хватает , чтобы запустить

Нормально ли, что когда я выбираю из в sys.dm_exex_sql_text (<mysql_handle>) колонку TEXT , то есть, сам запрос, то выдается запрос с placeholders @P6 @P5 (как привела его на 2 поста выше) и тд, а не подставленными уже значениями (как в traceparcer) ?
Старый 01.02.2024, 12:43   #16  
fed is offline
fed
Moderator
Аватар для fed
Ex AND Project
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
2,907 / 5717 (196) ++++++++++
Регистрация: 13.03.2002
Адрес: Hüfingen,DE
Цитата:
Сообщение от Lankey Посмотреть сообщение
Нормально ли, что когда я выбираю из в sys.dm_exex_sql_text (<mysql_handle>) колонку TEXT , то есть, сам запрос, то выдается запрос с placeholders @P6 @P5 (как привела его на 2 поста выше) и тд, а не подставленными уже значениями (как в traceparcer) ?
Нормально. Чтобы выдавалось со значениями, надо в запрос forceliterals подставить. (Но это только как отладочное действие, в productive это нельзя просто так деплоить).
Старый 01.02.2024, 13:13   #17  
fed is offline
fed
Moderator
Аватар для fed
Ex AND Project
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
2,907 / 5717 (196) ++++++++++
Регистрация: 13.03.2002
Адрес: Hüfingen,DE
Цитата:
Сообщение от Lankey Посмотреть сообщение
Нормально ли, что когда я выбираю из в sys.dm_exex_sql_text (<mysql_handle>) колонку TEXT , то есть, сам запрос, то выдается запрос с placeholders @P6 @P5 (как привела его на 2 поста выше) и тд, а не подставленными уже значениями (как в traceparcer) ?
Вообще взять исходный запрос с placeholders, заменить
Код:
(@P1 bigint,@P2 bigint,@P3 int,@P4 int,@P5 int,@P6 int,@P7 int,@P8 int)
на
Код:
DECLARE @P1 bigint,@P2 bigint,@P3 int,@P4 int,@P5 int,@P6 int,@P7 int,@P8 int
Потом ниже поставить серию присвоений типа
Код:
SET @P1=0
SET @P2=1
..
SET @P8=40
А потом текст запроса с placehodlers.
Таким образом можно будет попробовать заставить SQL исполнить запрос точно также как он его исполняет если он из ядра D365FO пришел.

Последний раз редактировалось fed; 01.02.2024 в 13:38.
Теги
d365

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
patrickmouwen: D365 F&O/Commerce interfacing via Azure API Management: My Best Practices Blog bot DAX Blogs 0 10.03.2022 02:47
Sumit Potbhare: Retail Warehousing | Wrap up | Approach to D365 for Commerce with Adv WH Mgmt Blog bot DAX Blogs 0 28.04.2021 13:12
patrickmouwen: How to Unlock Many Hidden D365 Retail Features! Blog bot DAX Blogs 0 13.05.2020 22:13
patrickmouwen: D365 Retail APIs Part III: How to use the Retail APIs from Power Automate (Flow) and Logic App Blog bot DAX Blogs 0 28.01.2020 02:15
patrickmouwen: D365 Retail APIs Part II: How to know exactly what happens inside D365 Retail Blog bot DAX Blogs 0 14.12.2019 01:17
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

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