|
![]() |
#1 |
Модератор
|
Цитата:
Сообщение от Gustav
![]() Код: CREATE TABLE RECIDHOLES ( FROMRECID NUMBER(10), TORECID NUMBER(10) ) Код: CREATE OR REPLACE TRIGGER SystemSequences_TBU BEFORE UPDATE ON SYSTEMSEQUENCES REFERENCING NEW AS New OLD AS Old FOR EACH ROW WHEN ( SUBSTR(NLS_LOWER(Old.DataAreaId),1,3) = 'ppp' AND Old.Id = -1 AND Old.TabId = 0 ) Код: while select common where common.RecId >= 800000001 && common.RecId <= 900000000 { row++; rst.AddNew(); fld = flds.Item('TblId' ); fld.Value(tableId); fld = flds.Item('DataAreaId'); fld.Value(common.dataAreaId); fld = flds.Item('RecId' ); fld.Value(common.RecId); rst.Update(); } P.S. Особенно если в простых случаях (нет виртуальных компаний и правильное наследование типов для ссылок по RecId) все и так само собой работает
__________________
-ТСЯ или -ТЬСЯ ? |
|
|
За это сообщение автора поблагодарили: Gustav (3). |
![]() |
#2 |
Moderator
|
Ну, несколько компаний можно прописать либо через условие триггера:
Код: WHEN ( (SUBSTR(NLS_LOWER(Old.DataAreaId),1,3) = 'ppp' AND Old.Id = -1 AND Old.TabId = 0) OR (SUBSTR(NLS_LOWER(Old.DataAreaId),1,3) = 'rrr' AND ...) OR (SUBSTR(NLS_LOWER(Old.DataAreaId),1,3) = 'sss' AND ...) ) Цитата:
И совсем же необязательно сразу искать дыры во всем диапазоне от 0 до текущего значения NextVal. Допустим, текущий NextVal в районе 1.5 миллиардов, тогда можно, не торопясь, составить таблицу дыр для RecId = 0..500 млн, настроить триггер, запустить его в эксплуатацию. А через годик обработать уже диапазон 500 млн..1 млрд и т.д. Это ж всё разовые задачки - обработал, запустил, забыл ("украл, выпил, в тюрьму" (с)) Цитата:
Цитата:
![]() |
|
![]() |
#3 |
Участник
|
Цитата:
Для начала, код очевидно "сырой". В том смысле, что писался под конкретную задачу и как решение "в общем случае" не годится. В этом решении важен не конкретный код, а сама идея хранения "дыр" и своевременное переключение нумератора на очередную "дыру". Ну, а "допилить" код под свои нужды - уже дело техники. Важна сама идея. Теперь по вопросам: 1. Насчет компаний, сам же и ответил. Не вижу особых проблем добавить фильтр по компаниям 2. Время выполнения определения "дыр" Очевидно, по крайней мере, будет не больше, чем время дефрагментации. Кроме того, очевидно, есть предмет для оптимизации алгоритма. Чего не скажешь про алгоритм дефрагментации. Ведь поиск дыр - это чистые запросы, а дефрагментация - это запросы+модификация. Если запросы еще можно оптимизировать (да и сам алгоритм изменить), то с модификацией особых вариантов нет. Надо модифицировать ВСЕ записи. Быстро это выполнено быть не может Кроме того, как справедливо заметил Gustav, можно разбить процесс поиска дыр на этапы, чего в принципе невозможно сделать для дефрагментации. 3. Преимущества, по сравнению с дефрагментацией (явно не прозвучало, но вопрос очевиден) Дефрагментация, как бы ей мозги ни вправляли, всегда оставляет вероятность того, что где-то чего-то не учли и ссылки будут нарушены. При использовании "дыр" такого быть не может, поскольку ссылки не меняются. Как мне кажется, это из области фантастики. Большинство российских внедрений кастомизировано по самое "не балуйся". Причем не один раз и самыми разным людьми с очень разным опытом. Поэтому простых случаев не может быть "по определению" |
|
|
За это сообщение автора поблагодарили: Gustav (12). |
![]() |
#4 |
Модератор
|
И правда, если
X++: EDT , RecId ![]() Цитата:
Судя по не утихающим до сих пор дискуссиям, в решении данной проблемы простота и надежность не являются приоритетными критериями
![]()
__________________
-ТСЯ или -ТЬСЯ ? |
|
![]() |
#5 |
Member
|
Цитата:
Сообщение от Vadik
...
Не проще вправить мозг стандартному "дефрагментатору" и успокоиться еще на пару лет? ...
__________________
С уважением, glibs® |
|
Теги |
ax3.0, recid, дефрагментирование recid, законченный пример, полезное |
|
![]() |
||||
Тема | Ответов | |||
if (record) vs if (record.RecId) | 18 | |||
поля, содержащие RecId | 15 | |||
Что лучше select RecId или select TableId | 9 | |||
aEremenko: Дефрагментация RecID | 2 | |||
Два RecId у одной записи таблицы | 33 |
Опции темы | Поиск в этой теме |
Опции просмотра | |
|