|
![]() |
#1 |
Мрачный тип
|
Пара слов о стандартном SysRecIdRepair, точнее о надежности его использования ...
Автоинкремент в чистом неконтролируемом виде, используемый в данном классе для генерации новых значений RecId - есть зло, ибо рискуем с ним получить нарушение ссылочной целостности ввиду теоретической возможности совпадения в рамках одной таблицы старого и нового RecId, не являющегося заменой старому. Чем это чревато - можете представить сами . Новый RecId должен быть построен на автоинкременте с проверкой каждого нового значения на пересечение с подмножеством старых значенй по этой таблице. Это, конечно же, замедлит общий процесс дефрагментации и породит некоторые небольшие дырки в множестве новых RecId, но зато с подобной проверкой на душе спокойнее. |
|
![]() |
#2 |
Модератор
|
Цитата:
Сообщение от TasmanianDevil
![]() Автоинкремент в чистом неконтролируемом виде, используемый в данном классе для генерации новых значений RecId - есть зло, ибо рискуем с ним получить нарушение ссылочной целостности ввиду теоретической возможности совпадения в рамках одной таблицы старого и нового RecId, не являющегося заменой старому
__________________
-ТСЯ или -ТЬСЯ ? |
|
![]() |
#3 |
Участник
|
Насколько я понял, имеется ввиду, что в таблице соответствия старым RecId новых может случиться ситуация вида:
RecId (OLD) RecId (new) 124 1 45676 2 2 3 То есть произойдет замена уже замененного RecId. Если неправильно понял, ТазманианДевил поправит. Но такой ситуации не может быть, потому как RecId в таблице отсортированны по возрастанию. То есть таблица будет выглядеть так, на самом деле: RecId (OLD) RecId (new) 2 1 124 2 45676 3 |
|
|
За это сообщение автора поблагодарили: TasmanianDevil (2). |
![]() |
#4 |
Модератор
|
Коллеги, одна таблица обновляется одним оператором UPDATE
Эта операция атомарная, в ней нет промежуточного состояния "первую строку обновили, вторую еще нет" Точно так же оператор X++: update ledgerTrans set RecId = RecId + 1 ACID это называется ![]()
__________________
-ТСЯ или -ТЬСЯ ? |
|
|
За это сообщение автора поблагодарили: kashperuk (3). |
![]() |
#5 |
Участник
|
Ой, да. Это я Сусанин, не посмотрев код, не в ту степь повел.
![]() Почему-то подумал, что вместо обновления потабличного (что намного производительнее, причем) делается позаписное (по RecId, и для каждого пробежка по всем таблицам). ![]() Посмотрел код, действительно, все записи обновляются одним запросом, поэтому проблема эта - вообще не проблема. ![]() |
|
![]() |
#6 |
Участник
|
А можно дефрагментировать RecID только для 1 таблицы
Доброго утра!
Ввиду большого кол-ва операций достигли ситуации когда RecId пошел на второй круг и в таблице CustInvoiceTrans начала появляться ошибка "Запись уже существует". Собственно, одна две записи допавляются без проблем, а вот заказ на 100 строк уже не разносится. Т.к на других операциях ошибок не замечено, решено провести дифрагментацию RecId но только для ОДНОЙ таблицы. Т.е. дефрагметировать RecId в таблице CustInvoiceTrans и при этом счетчик глобальный счетчик RecId не трагать, так как nextValue порядка 1 млрд, а записей в CustInvoiceTrans около 100 млн. Соответственно, если дефрагментировать RecId только в этой таблице то все последующие вставки в таблицу будут проходить безошибок. Вопрос: проделывал ли кто подобное? Аксапта 3.0 SP5, MS SQL 2005 Спасибо. |
|
![]() |
#7 |
Участник
|
Добрый день.
Дефрагментацию recId выполняли уже несколько раз. На форуме уже писали, что и где надо подправить для ускорения. Вся операция на 80 gb базе занимает около 3.5 часов. Поддерживаю glibs и TasmanianDevil. |
|
Теги |
ax3.0, faq, recid, дефрагментирование recid |
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|