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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 02.10.2018, 13:13   #1  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,952 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Post Кеширование вьюх. (Свойство CacheLookup для View)
Добрый день всем.

Коллеги, возможно ли штатно в аксапте (речь о 2012-й) кешировать вьюхи ?

В целом в 2012-й версии кеширование очень продвинутое - вплоть до кеширования джоинов. Также поддерживается кеширование по любому уникальному ключу, что очень удобно.
https://docs.microsoft.com/en-us/dyn...record-caching

Про вьюхи в документации сказано как-то расплывчато.
https://docs.microsoft.com/en-us/pre...869223(v=ax.60)

Явно указано
Цитата:
The properties that can be set for a View are listed below.
...
CacheLookup Retrieves the record cache level for the table.
т.е. запрета вроде как нет.

Но явно не описано как можно было бы использовать кеширование. Кроме того в свойствах вьюхи поле CacheLookup задизейблено. Т.е. получается, что нельзя.

Как-то это нелогично.
Вьюхи используются практически везде. Строятся зачастую по Query, который является джоином табличек по уникальным ключам.
При таком условии если мы делаем запрос через Query - то кеш отрабатывает. А если используем View основанный на Query - то нет. Т.е. увеличивается нагрузка на базу.

Я попробовал хакнуть вьюху. Выгрузил в xpo задал в xpo свойства
X++:
      CacheLookup         #Found
      CreateRecIdIndex    #Yes
импортнул обратно.


Кеширование по RecId заработало !

Интересно, что при импорте утилита сравнения не показала никаких отличий. Т.е. она не учитывала эти свойства. Также если не выставить
Цитата:
CreateRecIdIndex #Yes
то тоже кеширование не работает.

Другие индексы прописать невозможно, что в общем неудивительно, так как во вьюхе могут быть свои поля, которые называются совсем не так, как поля в индексе таблички.

Странно, все же почему во вьюхах штатно кеширования нет. Реально то движок есть и для RecId даже можно заставить его работать. Т.е. можно было бы в интерфейс привинтить возможность указания ключа кеширования (например как в RecordSortedList можно задавать ключа хранения / поиска). Было бы удобно.


А как в D365 c этим обстоят дела ?
Старый 02.10.2018, 13:14   #2  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,952 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Прикладываю вьюхи и джоб, которым тестировал.
Вложения
Тип файла: zip TestViewCacheLookup_2018_10_02__13_10.zip (2.5 Кб, 98 просмотров)
Старый 02.10.2018, 13:45   #3  
TasmanianDevil is offline
TasmanianDevil
Мрачный тип
Аватар для TasmanianDevil
Злыдни
 
886 / 389 (14) ++++++
Регистрация: 24.01.2005
Адрес: Томск
А вот ежели View на Query с типом UnionAll, где весьма вероятны совпадения RecId ?
__________________
Мы летаем, кружимся, нагоняем ужасы ...
За это сообщение автора поблагодарили: Logger (3).
Старый 02.10.2018, 13:56   #4  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,952 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Не пробовал. Вероятно приведет к неправильной работе.
Но тут надо думать головой, когда применяем инструменты.
Старый 02.10.2018, 14:00   #5  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1849 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
Цитата:
Сообщение от Logger Посмотреть сообщение
Коллеги, возможно ли штатно в аксапте (речь о 2012-й) кешировать вьюхи
А если абстрагироваться от версии, как Вы считаете должно было бы работать кэширование? У view же нет первичного или уникального ключа
__________________
-ТСЯ или -ТЬСЯ ?
За это сообщение автора поблагодарили: Logger (3).
Старый 02.10.2018, 14:07   #6  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Возможно, причина, по которой в ядре не разрешено кэшировать записи View, в том, что для обычных таблиц у ядра есть механизмы отслеживания, когда кэши стали неактуальными, а View для ядра - это некая абстракция, можно сказать, черный ящик, и там такого механизма актуализации кэшей нет. К примеру, если отвлечься от идеи обновлять кэш View по изменению любой связанной таблицы, во View ведь может быть вычисляемое поле, которое лезет подзапросом в другие таблицы или смотрит на текущую фазу луны. Кэширование записей View с таким полем легко может привести к тому, что от кэша будет куда больше вреда, чем пользы. Думаю, из этих соображений на View и отключили кэширование средствами ядра.
За это сообщение автора поблагодарили: Logger (3).
Старый 02.10.2018, 15:00   #7  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,952 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от Vadik Посмотреть сообщение
А если абстрагироваться от версии, как Вы считаете должно было бы работать кэширование? У view же нет первичного или уникального ключа
Думаю, что если по правильному делать, то надо было бы у вьюхи сделать подветку в AOT -
Caching keys

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

Сейчас как-то странно запроектировано. Разработчики ядра 2012-й судя по всему, порезвились от души и привинтили кеширование везде где только можно. Поэтому я очень удивился не найдя его во вьюхах и подумал что я чего-то не знаю. Если уж джоины табличек научили кешироваться, то вьюхи тем более надо было. Явно ведь кеширование джоинов делали, имея в виду радикальную нормализацию базы, из-за которого теперь вместо одного запроса к одной табличке, почти наверняка надо делать джоин.

Получается дурацкая ситуация - берем кверик, на основе которого сделана вьюха, используем его в запросе - отрабатывает кеширование, SQL не нагружается. Используем вьюху на основе этого кверика, использующую те же поля, которые кверик возвращает или их часть - все запросы летят в SQL. Лучше бы сделали наоборот. Дать программисту возможность настроить кеширование для вьюх, и забить на джоины. Это особенно актуально, потому что из-за нормализации базы многие вьюхи - это простые джоины, и если делать запрос без вьюхи, то кеширование работает.

Касательно отсутствия у вьюхи ключа, я подумал что в простом случае джоина можно было бы попробовать использовать ключ от таблички. Похожий подход использован в union Query. Там поля первого датасорса определяют набор полей, названия и типы для юниона. Здесь аналогично можно было бы сделать. Хотя, конечно, это полумера.

Последний раз редактировалось Logger; 02.10.2018 в 15:19.
Старый 02.10.2018, 15:07   #8  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,952 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от gl00mie Посмотреть сообщение
Возможно, причина, по которой в ядре не разрешено кэшировать записи View, в том, что для обычных таблиц у ядра есть механизмы отслеживания, когда кэши стали неактуальными,...
Да, вероятно в этом и была причина почему они так сделали.

Хотя, я думаю что все же случай вычисляемых полей - не такой частый. Плюс всегда ведь можно написать в insert / update / delete табличек код
X++:
super();
flush TableName;
в параметрических табличках везде так пишут и никто не умер. А для обычных полей ядро легко может зависимость отследить, ведь когда Query меняешь, то ядро предупреждает что есть зависимые вьюхи и обновляет их. Так и тут.

Кстати, кеширование джоинов в связке с прямыми запросами к базе уже приводило к подобным проблемам - была где-то тема про кеширование запроса по джоину InventSum - InventDim. Т.е. джина уже выпустили из бутылки... Нет причин не делать кеширование вьюх, если сделали кеширование джоинов.
Старый 02.10.2018, 15:08   #9  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,952 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Всем спасибо за обсуждение. Самое главное, я понял что так и задумано, а не я чего-то недопонимаю.
Старый 30.11.2018, 09:26   #10  
TasmanianDevil is offline
TasmanianDevil
Мрачный тип
Аватар для TasmanianDevil
Злыдни
 
886 / 389 (14) ++++++
Регистрация: 24.01.2005
Адрес: Томск
Кстати, о птичках ...
Кроме кэширования, есть скользкий момент на View, построенном на группировочном запросе. RecId в таком View ненулевой и идентичный для всех записей. О последствиях неосторожного и невнимательного использования таких View можете сами догадаться (например очень интересно будет вести себя метод reread() )...
__________________
Мы летаем, кружимся, нагоняем ужасы ...
Теги
cache, cache lookup, query, view

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
dynamicsaxhints: Statistics on CacheLookup property in AX 2012 R3 Blog bot DAX Blogs 0 04.04.2016 16:11
dynamicsaxhints: How to restrict view datasource fields Blog bot DAX Blogs 0 22.03.2016 09:11
emeadaxsupport: AX Content: Using Power View with Dynamics AX Blog bot DAX Blogs 0 17.09.2013 01:12
dynamicsaxbi: Better together: Microsoft Dynamics AX 2012 R2 and SQL Server Power View Blog bot DAX Blogs 0 12.12.2012 13:11

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

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

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