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

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

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

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

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

Последний раз редактировалось Logger; 09.02.2017 в 15:37.