15.05.2008, 08:32 | #1 |
MCITP
|
Включение потабличного RecID в 3-ке
Всем привет!
Многим, наверное, известно, что в 3.0 есть "полунедокументированная" возможность включить генерацию потабличного RecId вместо "покомпанийного". До вчерашнего дня я тоже знал, но сам не пробовал. Но т.к. проблема recId для клиента потенциально скоро встанет серьёзно, то решил попробовать прикрутить эту фичу. (Не как альтернативу 4-ке, а просто ) Делаю всё как описано в имеющемся описании - меняю 6-ой бит на 7-ой в системной переменной INDEX. Всё перезапускаю, и о чудо! Действительно Аксапта резко начинает клепать в таблицу SystemSequences потабличные записи для последовательностей RecId. Круто, думаю, это ж можно сразу решить все проблемы с рекИД. Одна проблема, что придётся вручную генерить записи для всех таблиц, чтоб проставить NEXTVAL в значение текущего для компании, чтоб избежать пересечений. А то аксапта создаёт новые с 1-цы. Естественно, всё это время в голове жужжало одно - почему я нигде и никогда не слышал о том, что кто-то это реально использовал? Все только знают, что "типа можно". А реально единственная альтернатива - переход на 4-ку. И скоро стало понятно почему! Потому что ядро нормально генерит только инсерты для этой таблицы! А update остаётся старый! Код: UPDATE SYSTEMSEQUENCES SET NEXTVAL=:in1 WHERE ((SUBSTR(NLS_LOWER(DATAAREAID),1,3)=NLS_LOWER(:in2)) AND (ID=:in3)) Соответсвенно, мы ничего не выигрываем, только записей больше. Вообщем интересует вопрос, это специально так сделано? Или может кому-то удалось всё-таки завести эту систему? У меня тут были мысли, что может на первых версиях 3-ки это и работало, но потом в ролапе, например, очередном эту возможность закрыли, чтоб все на 4-ку перебегали, а не этим способом пользовались. Реально то ведь всё работает кроме одного апдэйта - очень похоже на сознательное действие. Надо будет как-нибудь в свободное время попробовать поставить аксапту без СП и КР и проверить.... Я проводил описаный тест на Ах3.0 сп3 кр3 + Оракл.
__________________
Zhirenkov Vitaly |
|
15.05.2008, 10:03 | #2 |
Участник
|
Осталось проверить все приложение, на то, что не используется факт уникальности recID в рамках системы. То есть что нет запросов типа
X++: select from xxx where refRecID == zzz |
|
15.05.2008, 10:09 | #3 |
MCITP
|
Да, конечно, это понятно...
Пока анализа такого не проводил, но просто и смысла пока нет его проводить, т.к. не работает как надо.
__________________
Zhirenkov Vitaly |
|
15.05.2008, 10:55 | #4 |
Роман Долгополов (RDOL)
|
в трешке не работало никогда. регистрировали запрос в мс года 2-3 назад - что это баг признали, чинить отказались - типа ждите 4.0 там все работает
|
|
15.05.2008, 11:06 | #5 |
MCITP
|
Ясно. Ну то что чинить не станут - даже не сомневался если честно.
Спасибо!
__________________
Zhirenkov Vitaly |
|
15.05.2008, 12:31 | #6 |
Участник
|
Цитата:
Если у вас используется единственная компания. Если при этом вы работаете не в компании по умолчанию (DAT). Можно выделить таблицы, удовлетворяющие двум условиям
Если у этих таблиц свойство SaveDataPerCompany установить в No, то RecId у них будет браться из SystemSequences для компании DAT. А переполнение RecID в компании DAT вас беспокоить не будет. |
|
|
За это сообщение автора поблагодарили: ZVV (1). |
15.05.2008, 13:00 | #7 |
MCITP
|
2 vc
ну да, где-то решение хорошее... жалко вот только в случае этого конкретного клиента не выполняется второе условие но зато уже знаю другого, кому это может пригодиться. спасибо!
__________________
Zhirenkov Vitaly |
|
15.05.2008, 17:12 | #8 |
Участник
|
Если грозит исчерпанием в будующем RecID можно воспользоваться следующим:
1) выделить наиболее прожорливые таблицы (обычно это какой-нибудь прожорливый протокол) в табличную коллекцию 2) колекцию в вируальную компанию 3) в виртуальную компанию включить вашу компанию (если компаний несколько, то создать для каждой по одной компании, или создавать для каждой таблицы... или выбирайте любую из допустимых комбинаций). Для виртуальной компании генерится свой собственный RecId Кстати, перекопав за долгие годы Аксапту вдоль и поперек, ни разу не встретил, чтобы RecId считалось где-то уникальным для всей системы (и сам такого никогда не писал, разумеется, и не давал так делать другим). Так что с этим проблем нет. Механизм с виртуальными компаниями и коллекциями прекрасно работал в 3-ке. В 4-ке это оказалось уже не нужным - переимеовал значения в dataareaId обратно и удалил настройки компаний и коллекций (чтоб не вспомниать года через два зачем это нужно). |
|
|
За это сообщение автора поблагодарили: mazzy (2), ZVV (1), Ace of Database (4), Kabardian (3). |
15.05.2008, 17:19 | #9 |
MCITP
|
Да, хорошее предложение - сам как-то не подумал про такой вариант...
__________________
Zhirenkov Vitaly |
|
15.05.2008, 17:26 | #10 |
MCITP
|
Владислав, а Вы не можете сказать, раз у Вас есть такой опят, как такое решение сказывается на производительности системы?
Если оно как-то сказывается? PS Например если "выкинуть" таким образом InventTrans.
__________________
Zhirenkov Vitaly Последний раз редактировалось ZVV; 15.05.2008 в 17:28. |
|
15.05.2008, 19:15 | #11 |
Участник
|
Опыт есть, но не InventTrans
Как я уже упоминал: был заказ протоколировать всякую хрень, и объем этого протоколирования угрожал за впрочем довольно долгое время, но все же "съесть" весь ресурс идентификаторов записей. Может если "выкинуть" подобное, то и для InventTrans хватит оставшихся двух миллиардов (это не считая отрицательных значений)? Падения производительности не заметил (да и к чему бы). Будет ли падение при обращении к InventTrans? Вряд ли. Аксапта ведь в SQL запрос с объединением передает не как a.dataareaId = 'my1' and a.dataareaId = b.dataareaId, а как a.dataareaId = 'my1' and b.dataareaId = 'my1' Нет, ну разумеется она там где-то внутри себя потратит время на "подстановку", но столь малой (надеюсь на это) величиной можно пренебречь |
|
16.05.2008, 07:57 | #12 |
MCITP
|
Кстати, если поискать, то можно найти что подобная тема обсуждалась уже пару лет назад:
Проблема производительности при использовании виртуальных компаний. Резюме: Пользуйтесь поиском, не изобретайте велики!
__________________
Zhirenkov Vitaly |
|
|
За это сообщение автора поблагодарили: mazzy (2). |
16.05.2008, 18:53 | #13 |
Участник
|
Ну вот "наобещал" и сегодня же (впервые) нарвался на место, где 3-ка предполагает уникальность RecId в пределах всей базы: таблица SpecTrans
Поле RefId было заменено в четверке на RefTableId и RefRecId Просто если пометить открытые проводки для сопоставления клиентские (CustTransOpen), то можно при наличии "своих" RecId в открытых проводках поставщика (VendTransOpen) доооолго размышлять, чего это она считает, что проводка еще где-то помечена. |
|
17.05.2008, 10:32 | #14 |
Member
|
По-моему, это бесперспективный путь.
Я считаю, что нужно работать над оптимизацией производительности дефрагментации RecId (если вариант с переходом на 4.0 не рассматривается по объективным причинам). А насчет общего количества записей в 4 миллиарда... не стоит разводить в БД свинюшник. Нужно чистить журналы. Можно сливать в какое-нибудь хранилище, если вам очень жалко выбрасывать устаревшие данные.
__________________
С уважением, glibs® |
|
|
За это сообщение автора поблагодарили: Kabardian (1). |
Теги |
ax3.0, faq, recid |
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|