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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 11.09.2012, 18:11   #1  
Blog bot is offline
Blog bot
Участник
 
25,643 / 848 (80) +++++++
Регистрация: 28.10.2006
DynamicsAxSCM: Avoid index length issues with InventDim
Источник: http://blogs.msdn.com/b/dynamicsaxsc...inventdim.aspx
==============

In Microsoft Dynamics AX we use indexes to ensure uniqueness.
An example of this is the DimIdx index in InventDim, where all dimension fields are included to ensure that only a single record exists for a given set of dimensions.

However, the SQL Server has a limitation of 16 fields in an index.
With the first versions of InventDim (which was introduced in Axapta 2.0) this was rarely a problem since only a few dimensions where shipped out-of-the-box.
So partners and customers could still add more dimensions. Over time, numerous dimensions have been added in the standard version and in country specific solutions.
As a result, we are now very close to the 16 field limit. With the Dynamics AX2012 Feature Pack and Russian functionality installed we have 14 fields in the index and more to come in future releases.

We have received an increasing amount of questions about how to get around this issue so we have implemented a solution which allows you to add custom inventory dimensions and still have the uniqueness validated and enforced.

In our investigation of possible solutions we have tried to find a balance between simplicity, maintainability, and performance.
What we found to be the best solution can be described as follows:

- Introduce a new field based on the Sha1HashCode data type.
- Remove some of the least used dimensions from the DimIdx index and add the new field instead. The removed fields must be hashed in the new field during the insertion.
- Calculate the hash and use it in the findDim method when looking for an existing dimension.
- Create a new InventDimIdAllDimensions field in the InventSumDeltaDim table (I guess the name says what it contains) and replace all the dimension fields in the TTSItemCheckDimIdx index with this new field.

This solution will be available in an upcoming release of Microsoft Dynamics AX so if you cannot wait for this release, feel free to be inspired by our findings – hopefully it will also make it easier for you to upgrade your data.




Источник: http://blogs.msdn.com/b/dynamicsaxsc...inventdim.aspx
__________________
Расскажите о новых и интересных блогах по Microsoft Dynamics, напишите личное сообщение администратору.
Старый 11.09.2012, 20:08   #2  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,342 / 3563 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
О! А можно не забыть еще InventDim (ее правда упомянули) и InterCompanyInventDim ? И тогда можно будет с чистой совестью забыть про ограничение по количеству складских аналитик. Оно ж по сути искусственное.
__________________
Возможно сделать все. Вопрос времени
Старый 11.09.2012, 20:41   #3  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5803 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Круто... интересно, насколько расчет криптографической хеш-функции тормозит обращение к InventDim? Ее потом, как классы работы с XML, в ядро куда-нить включат для ускорения? Вообще, конечно, занятная идея сделать индекс по хешу
Старый 11.09.2012, 20:50   #4  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,342 / 3563 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Интересно, а нельзя было иным путем решить вопрос уникальности? Ну, т.е. индекс из 16 полей нужен в данном случае не столько для целей производительности, сколько для целей проверки уникальности. Но ведь проверку на уникальность можно выполнить (как вариант; вполне вероятно не единственный) - на уровне триггера при вставке записи. Сейчас - триггера удаляются при синхронизации. Но... в рамках решения такой глобальной задачи - можно же и пойти на изменение ядра. Опять-таки - всегда возможно не менять АОТ, изменив только ядро, обрабатывающее элементы АОТа
__________________
Возможно сделать все. Вопрос времени
Старый 11.09.2012, 21:13   #5  
fed is offline
fed
Moderator
Аватар для fed
Ex AND Project
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
2,913 / 5736 (197) ++++++++++
Регистрация: 13.03.2002
Адрес: Hüfingen,DE
Надо помнить, что уникальность индекса нужна не только для проверки при вставке, но и для кэширования. То есть - если индекс по полям a,b,c уникален и включено кэширование, то запрос с условием по полям a,b,c будет отработан из кэша. А если индекс неуникален - то кэширование не работает. (За исключением full table cache, видимо).
До 2009ой для кэширования использовался только PrimaryIndex. Начиная с 2009ой - любой уникальный индекс. Причем в первую очередь, это было сделано для повышения производительности InventDim::findDim()...

Последний раз редактировалось fed; 11.09.2012 в 21:20.
За это сообщение автора поблагодарили: sukhanchik (4).
Старый 11.09.2012, 21:18   #6  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,342 / 3563 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Цитата:
Сообщение от fed Посмотреть сообщение
Надо помнить, что уникальность индекса нужна не только для проверки при вставке, но и для кэширования.
Ну да, тогда в таком ключе - хеш-функция получается наиболее оптимальным вариантом. Спасибо за разъяснения
__________________
Возможно сделать все. Вопрос времени
Старый 12.09.2012, 01:51   #7  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1853 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
Цитата:
Сообщение от gl00mie Посмотреть сообщение
Круто... интересно, насколько расчет криптографической хеш-функции тормозит обращение к InventDim? Ее потом, как классы работы с XML, в ядро куда-нить включат для ускорения?
Ну это как реализуют, я так понимаю этот хэш кроме уникальности никакой криптографической стойкости обеспечивать не должен, так что вполне можно чем-то незатейливым обойтись
Цитата:
Вообще, конечно, занятная идея сделать индекс по хешу
Да техника-то в принципе не новая - главное чтобы продумали как быть в случае если для разных комбинаций аналитик значения хэша все-таки будут периодически генерироваться одинаковые на инсталляциях с миллионами используемых записей в InventDim в пределах одной компании
__________________
-ТСЯ или -ТЬСЯ ?
Старый 12.09.2012, 07:37   #8  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5803 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от Vadik Посмотреть сообщение
я так понимаю этот хэш кроме уникальности никакой криптографической стойкости обеспечивать не должен, так что вполне можно чем-то незатейливым обойтись
Так пишут же - SHA1.
Цитата:
Сообщение от Vadik Посмотреть сообщение
главное чтобы продумали как быть в случае если для разных комбинаций аналитик значения хэша все-таки будут периодически генерироваться одинаковые
ну а как SQL-сервера при hash-join'ах коллизии разруливают? Видимо, никак.

Последний раз редактировалось gl00mie; 12.09.2012 в 08:00. Причина: typo
Старый 12.09.2012, 10:18   #9  
fed is offline
fed
Moderator
Аватар для fed
Ex AND Project
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
2,913 / 5736 (197) ++++++++++
Регистрация: 13.03.2002
Адрес: Hüfingen,DE
В общем замена индекса по комбинации полей на индекс по хэшу, скорее всего приведет к падению производительности. Если индекс не сделать уникальным - то кэширование перестанет работать. А если сделать - время от времени будет hash collision случаться и запись невозможно будет вставить.
Старый 12.09.2012, 10:22   #10  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,342 / 3563 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Цитата:
Сообщение от fed Посмотреть сообщение
время от времени будет hash collision случаться и запись невозможно будет вставить.
А можно для чайников просветить - почему должны случаться hash collision на разных комбинациях? Или это связано именно с алгоритмом SHA1, допускающего такое поведение?
__________________
Возможно сделать все. Вопрос времени
Старый 12.09.2012, 10:44   #11  
fed is offline
fed
Moderator
Аватар для fed
Ex AND Project
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
2,913 / 5736 (197) ++++++++++
Регистрация: 13.03.2002
Адрес: Hüfingen,DE
Цитата:
Сообщение от sukhanchik Посмотреть сообщение
А можно для чайников просветить - почему должны случаться hash collision на разных комбинациях? Или это связано именно с алгоритмом SHA1, допускающего такое поведение?
Во первых - вероятность hash collision всегда не нулевая. Во вторых - если я правильно помню, SHA1 сжимает 512 бит в 160. То есть коэфициент сжатия порядка 70%. Не бывает таких алгоритмов, которые бы любой поток гарантированно сжимали на 70% с сохранением однозначности.

Кстати посмотрел - в 2012ой, расширенный тип S1HASCODE основан на контейнере. То есть - хранится он будет в поле типа VARBINARY(MAX) (как я понимаю), и я пока не очень понял может ли сиквел по таким полям индексы строить вообще...

Последний раз редактировалось fed; 12.09.2012 в 10:52.
За это сообщение автора поблагодарили: sukhanchik (4).
Старый 12.09.2012, 10:58   #12  
oip is offline
oip
Axapta
Лучший по профессии 2014
 
2,564 / 1416 (53) ++++++++
Регистрация: 28.11.2005
Записей в блоге: 1
Цитата:
Сообщение от fed Посмотреть сообщение
Во первых - вероятность hash collision всегда не нулевая. Во вторых - если я правильно помню, SHA1 сжимает 512 бит в 160. То есть коэфициент сжатия порядка 70%. Не бывает таких алгоритмов, которые бы любой поток гарантированно сжимали на 70% с сохранением однозначности.
Так ведь у SHA1 такое огромное кол-во различных хэшей, что даже на миллиардах записей вероятность коллизий де-факто равна нулю. Упрощенно вероятность вычислается как в парадоксе дней рождения. Если я правильно посчитал, то для 10^18 записей вероятность коллизии примерно 10^(-13) (по ссылке прямо приведено, что для 10 миллиардов записей в случае 128, а не 160 бит как у SHA1, вероятность хоть одной коллизии равна 10^(-18)). Это если SHA1 совсем рандом. И хотя это не так, Вики говорит, что это не сильно мешает.
За это сообщение автора поблагодарили: sukhanchik (4).
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
crminthefield: Avoid Performance Issues by Rescheduling CRM 2011 Maintenance Jobs Blog bot Dynamics CRM: Blogs 0 27.04.2012 02:17
dynamicsaxtraining: Some issues during changing index uniqueness Blog bot DAX Blogs 0 06.12.2010 23:11
Rajdip's space: The mystery of "index" vs. "index hint" Blog bot DAX Blogs 0 20.04.2010 20:05
DynamicsAxSCM: Sales and purchase prices in relation to the item price setup in Microsoft Dynamics AX 2009 Blog bot DAX Blogs 0 11.02.2010 09:05
DynamicsAxSCM: WMS in Microsoft Dynamics AX 2009. Outbound Process Setup Blog bot DAX Blogs 0 27.04.2009 03:23

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

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

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