![]() |
#1 |
Участник
|
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, напишите личное сообщение администратору. |
|
![]() |
#2 |
Administrator
|
О! А можно не забыть еще InventDim (ее правда упомянули) и InterCompanyInventDim ? И тогда можно будет с чистой совестью забыть про ограничение по количеству складских аналитик. Оно ж по сути искусственное.
__________________
Возможно сделать все. Вопрос времени |
|
![]() |
#3 |
Участник
|
Круто... интересно, насколько расчет криптографической хеш-функции тормозит обращение к InventDim? Ее потом, как классы работы с XML, в ядро куда-нить включат для ускорения? Вообще, конечно, занятная идея сделать индекс по хешу
![]() |
|
![]() |
#4 |
Administrator
|
Интересно, а нельзя было иным путем решить вопрос уникальности? Ну, т.е. индекс из 16 полей нужен в данном случае не столько для целей производительности, сколько для целей проверки уникальности. Но ведь проверку на уникальность можно выполнить (как вариант; вполне вероятно не единственный) - на уровне триггера при вставке записи. Сейчас - триггера удаляются при синхронизации. Но... в рамках решения такой глобальной задачи - можно же и пойти на изменение ядра. Опять-таки - всегда возможно не менять АОТ, изменив только ядро, обрабатывающее элементы АОТа
__________________
Возможно сделать все. Вопрос времени |
|
![]() |
#5 |
Moderator
|
Надо помнить, что уникальность индекса нужна не только для проверки при вставке, но и для кэширования. То есть - если индекс по полям a,b,c уникален и включено кэширование, то запрос с условием по полям a,b,c будет отработан из кэша. А если индекс неуникален - то кэширование не работает. (За исключением full table cache, видимо).
До 2009ой для кэширования использовался только PrimaryIndex. Начиная с 2009ой - любой уникальный индекс. Причем в первую очередь, это было сделано для повышения производительности InventDim::findDim()... Последний раз редактировалось fed; 11.09.2012 в 21:20. |
|
|
За это сообщение автора поблагодарили: sukhanchik (4). |
![]() |
#6 |
Administrator
|
Ну да, тогда в таком ключе - хеш-функция получается наиболее оптимальным вариантом. Спасибо за разъяснения
__________________
Возможно сделать все. Вопрос времени |
|
![]() |
#7 |
Модератор
|
Цитата:
Цитата:
Вообще, конечно, занятная идея сделать индекс по хешу
![]()
__________________
-ТСЯ или -ТЬСЯ ? |
|
![]() |
#8 |
Участник
|
Цитата:
Последний раз редактировалось gl00mie; 12.09.2012 в 08:00. Причина: typo |
|
![]() |
#9 |
Moderator
|
В общем замена индекса по комбинации полей на индекс по хэшу, скорее всего приведет к падению производительности. Если индекс не сделать уникальным - то кэширование перестанет работать. А если сделать - время от времени будет hash collision случаться и запись невозможно будет вставить.
|
|
![]() |
#10 |
Administrator
|
А можно для чайников просветить - почему должны случаться hash collision на разных комбинациях? Или это связано именно с алгоритмом SHA1, допускающего такое поведение?
__________________
Возможно сделать все. Вопрос времени |
|
![]() |
#11 |
Moderator
|
Цитата:
Кстати посмотрел - в 2012ой, расширенный тип S1HASCODE основан на контейнере. То есть - хранится он будет в поле типа VARBINARY(MAX) (как я понимаю), и я пока не очень понял может ли сиквел по таким полям индексы строить вообще... Последний раз редактировалось fed; 12.09.2012 в 10:52. |
|
|
За это сообщение автора поблагодарили: sukhanchik (4). |
![]() |
#12 |
Axapta
|
Цитата:
|
|
|
За это сообщение автора поблагодарили: sukhanchik (4). |
|
|