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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 09.02.2017, 15:29   #1  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,983 / 3273 (117) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от Ivanhoe Посмотреть сообщение
А разве время синхронизации базы разное если добавить поле / изменить текущее?
Да, и отличается очень сильно в случае когда меняется длина строкового поля.

Проблема с изменением поля в том что если табличка непустая, то аксапта создает новую табличку, такую же по структуре и новой длиной поля. Переливает данные из одной таблички в другую, старую грохает, а новую переименовывает. А затем с нуля индексирует ее.
На перелив данных и индексацию уходит много времени (если табличка миллионник)

Мы придумали обходной финт.
Если строковый EDT меняет длину, то собираем перечень табличек и полей на которые это повлияет, генерим для них SQL запросы вида ALTER TABLE ... MODIFY FIELD изменяя длину поля и обновляем также инфу в системной табличке SQL Dictionary
После этого аксапта при синхронизации ничего не трогает (мы ведь все сделали за нее).
Отрабатывает такая полуручная "синхронизация" мгновенно.

Но если поле для которого хотим поменять длину индексировано, то БД посылает на попытке изменения длины, приходится грохать индекс, менять длину и заново строить индекс. Т.е. выигрываем на переливке данных все равно, но можем потратить много времени на переиндексацию (о чем я и упомянул).

А поскольку номер документа это ключевое поле которой входит в первичный ключ и почти во все foreignKey то ...
Приходится кучу индексов пересоздавать и тратить на это много времени. 2 часов на всю базу не хватает.
Ну и плюс опять же размер индексов вырастать будет если реально будут 50 символов заполнять.

Последний раз редактировалось Logger; 09.02.2017 в 15:37.
Старый 09.02.2017, 15:48   #2  
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
Цитата:
Сообщение от Logger Посмотреть сообщение
Но если поле для которого хотим поменять длину индексировано, то БД посылает на попытке изменения длины, приходится грохать индекс, менять длину и заново строить индекс.
А как именно посылает ? Просто любопытно (поскольку в индексах при таком изменении тоже вроде бы не надо ничего менять).
И какая у вас версия SQL ?
Старый 09.02.2017, 17:05   #3  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,983 / 3273 (117) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от fed Посмотреть сообщение
А как именно посылает ? Просто любопытно (поскольку в индексах при таком изменении тоже вроде бы не надо ничего менять).
И какая у вас версия SQL ?
Вот так
Цитата:
ORA-30556: functional index is defined on the column to be modified
https://community.oracle.com/thread/2343555

Поговорил с DBA. Проблема в функциональных индексах. Без них все ок. Попробовал сам, действительно без функциональных индексов все ок.
Запрос такой
X++:
ALTER TABLE TESTTABLE MODIFY TEXTFIELD NVARCHAR2(50)
Версия 12.1.0.2.0
За это сообщение автора поблагодарили: fed (1).
Старый 10.02.2017, 09:29   #4  
SRF is offline
SRF
Участник
MCBMSS
Axapta Retail User
 
376 / 562 (19) +++++++
Регистрация: 08.08.2007
Записей в блоге: 1
А сколько сейчас времени у вас тратится при варианте пересоздания индексов, хотя бы порядок, если конечно пробовали? Просто при временных затратах в десятки часов, вариантов вроде не так много остается. В стандарте вроде как FactureExternaId_RU имеет длину 30 символов, у вас также ?

Можно же попробовать в два этапа провести увеличение длины номеров отдельно номера фактуры, отдельно накладные(скажем если бы два этапа шли последовательно условно в неделю разницы, то вполне можно написать джоб, который бы обновил номера накладных из фактур(правда, может с внешними обменами будут проблемки небольшие), в случае если у вас текущие размеры их совпадают, если же фактура больше и сейчас, то проблем по идее и так быть не должно).

Цитата:
Б. Много неоднозначностей в каком случае какое поле использовать и как заполнить обычный InvoiceId (как усечь номер от поставщика, чтобы не получить кучу дублей)
А в случае если усекать номер, номерную серию внутри AX не вариант использовать, или номер должен быть максимально похож на реальный ?
__________________
Sergey Nefedov
За это сообщение автора поблагодарили: Logger (3).
Старый 10.02.2017, 10:11   #5  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,983 / 3273 (117) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от SRF Посмотреть сообщение
А сколько сейчас времени у вас тратится при варианте пересоздания индексов, хотя бы порядок, если конечно пробовали?
Если в табличке порядка полмиллиарда записей то порядка 10-20 минут на один индекс. А индексов может быть несколько и табличек тоже. В общем по ощущениям - это не на 2 часа остановки, а часов на 6. Но это грубая прикидка.

Цитата:
Сообщение от SRF Посмотреть сообщение
В стандарте вроде как FactureExternaId_RU имеет длину 30 символов, у вас также ?
Да также. У нас длины сейчас все по стандарту.

Цитата:
Сообщение от SRF Посмотреть сообщение
А в случае если усекать номер, номерную серию внутри AX не вариант использовать, или номер должен быть максимально похож на реальный ?
Я думаю, что желательно чтобы он был похож на реальный.

Поговорили еще с DBA. Мне все больше нравится вариант 1.
Возможно что нить придумаем как сделать.
Как вариант - пропатчить ядро чтобы аксапта научилась работать с БД в регистронезависимом режиме без всяких функциональных индексов. Тогда и проблемы не будет никакой. Длины полей увеличатся легко.
Старый 10.02.2017, 16:51   #6  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,715 / 1204 (44) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от Logger Посмотреть сообщение
Если в табличке порядка полмиллиарда записей то порядка 10-20 минут на один индекс. А индексов может быть несколько и табличек тоже. В общем по ощущениям - это не на 2 часа остановки, а часов на 6. Но это грубая прикидка.
Не знаю, как в Oracle, а в MS SQL можно параллельно индексировать разные таблицы. Нельзя разные индексы в одной таблице, но в разных таблицах - вполне. В разных соединениях, разумеется...

Т.е. условно вместо 20 минут на одну таблицу + 20 минут на другую итого 40. Получите 20 минут на обе.
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
За это сообщение автора поблагодарили: Logger (1).
Теги
factureexternalid, invoice, invoiceid, num, электронная отчетность, электронный сф

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
System.Net.Mail.MailMessage и Subject длиной больше 100 символов Damn DAX: Программирование 0 09.02.2011 19:59
Длина строки range - 250, 1000 или больше Logger DAX: Программирование 13 19.09.2010 14:36
"Испортились" номера в таблице договоров Shirmin Oleg DAX: Администрирование 3 21.11.2005 12:27
Печать накладной и счёта-фактуры через AxaptaCOMConnector mpogorelov DAX: Программирование 0 25.02.2005 18:28
при построении перекрёстных ссылок выдаётся сообщение об ошибках mmmax DAX: Программирование 10 21.01.2005 12:42

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

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

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