Как быстро найти свободный код справочника #386227


#0 by Bagirius
Есть справочник, с числовыми кодами. При создании нового элемента код отрабатывает поиск первого свободного кода в справочнике (т.к. периодически удаляются элементы). Зачем так сделано, не буду описывать, но так надо :-) Когда код достигнет 100 000, совсем будет тормозить. Константа создана, для ускорения поиска, и заполняется при любом монопольном входе в базу. Возможно ли ускорить данную задачу. Может прямой запрос какой то хитрый впендюрьть? Есть идеи?
#1 by Баклага
а переномеровать все коды нельзя?
#2 by Bagirius
Так смысла нет, "дырки" в нумерации, постепенно, все равно будут появляться
#3 by Sadovnikov
Create Table #Z(K Int) Insert Into #Z Values Insert Into #Z Values Insert Into #Z Values Insert Into #Z Values Insert Into #Z Values Insert Into #Z Values Insert Into #Z Values From #Z T1 (NoLock) Left Join #Z T2 (NoLock) On (T1.K + 1) = T2.K Where T2.K Is NULL Drop Table #Z
#4 by Паланик
Сделай перенумерацию. Потом пропиши, при удалении элемента - сохранить где-нить его код. Затем присваивать его вновь создавшемуся, если есть дырка.
#5 by Sadovnikov
+ Еще более правильно во так: Create Table #Z(K Int) Insert Into #Z Values Insert Into #Z Values Insert Into #Z Values Insert Into #Z Values Insert Into #Z Values Insert Into #Z Values Insert Into #Z Values From #Z T1 (NoLock) Left Join #Z T2 (NoLock) On (T1.K + 1) = T2.K Where T2.K Is NULL Drop Table #Z
#6 by Valery
Если элементы справочника переодически удаляются, тогда наверное можно использовать уже помеченные на удаление элементы и просто восстанавливать их.
#7 by План
а ссылки ?
#8 by Valery
Ну как-то их удаляют?
#9 by План
может лучше обработкой вытаскивать (например каждый час) не занятые номера номенкалтуры, и заполнять их в строку - константу типа так: [НезанятыйНомер1][НезанятыйНомер2][НезанятыйНомер3][НезанятыйНомер4][НезанятыйНомер5] А при создании элемента справочника брать номера из этой строки.
#10 by Sadovnikov
Пипец решение...
#11 by План
+ и перезаполнять эту строку - константу.
#12 by smaharbA
в запрос внешнюю функцию в условие
#13 by Табуретко
Ща пойдет конкурс на самое остроумное решение... :)
#14 by smaharbA
с доками давно уже работает
#15 by Деметрио
ы. можно еще завести второй справочник освободившихся номеров. и когда в первом элемент удаляется, элемент с таким номером заводится во втором.
#16 by Табуретко
а в справочнике что, длинна кода уже заканчивается?
#17 by Sadovnikov
Зачем? И безо всякой внешней функции все прекрасно отработает :)
#18 by Табуретко
зачем список? и одной пойдет, и заполнять автоматом при удалении :))
#19 by Дядя Васька
+1
#20 by smaharbA
совершенно согласен ))) ты лучче глянь во вчерашнюю ветку про скуль есть вопрос
#21 by Табуретко
а нумерацию перевести в 64значную систему...
#22 by Sadovnikov
Видел я твою проблему... Я пас :(
#23 by Табуретко
пардон, 36 :))
#24 by Дядя Васька
и не -значную, а -ричную
#25 by smaharbA
хоть бы синтаксис знать какой у запроса, она падла ведь в синглюзер буду копать, или адинес или прослойку какую между клиентом и адинес впендюрю
#26 by mrkorn
достаточно одного значения. При записи будет указываться последний занятый номер. по-видимому уже закончилась
#27 by Torquader
Нехорошо повторно использовать код элемента справочника, так как может возникать путаница старого и нового элемента. Но можно сделать следущее: При удалении элемента справочника (не пометки на удаление, а именно при удалении) мы просто заменяем название элемента на ### (или ъъъ, как тут кто-то советовал) и помещаем его в папку "УдалённыеИСвободные". Далее, при создании нового элемента выполняем поиск по наименованию, а если не нашли, то к максимальному коду добавляем 1 (это делает встроенная автонумерация). Ничего тормозить не должно, но ещё раз хочется заметить, что код элемента справочника - это его уникальный номер и отдавать его другому элементу следует только в том случае, если удаляемый элемент нигде и никогда не использовался. (Удаление, например, элемента из вашего прайс-листа не означает, что у ваших покупателей этот элемент сам ликивидуется).
#28 by Табуретко
Хотя с другой стороны удалил ты три элемента сподряд а записался послледний и 2 "дыры"...
#29 by kiruha
Если файловая. Элементы сразу не удаляются - помечаются как Deleted. Смотришь коды у элементов Deleted (по ним есть индекс), берешь код с мин значением RecNo(он будет затерт). Если нет таких - то максимальный.
#30 by Табуретко
+ ...и тада для 4значного номера предел будет в 1679615 элементов :)
#31 by mrkorn
обычно при незакрытых кодах справочника какой-нибудь мудень добивает лишнию цифирь и был у нас номер 5тизначный, а стал 6тизначный дыры между кодами большие и такой алгоритм (последовательной проверки с определенного кода) не сильно затормозит работу а вот если справочник физически заканчивается, то проще добавить пару разрядов в конфигураторе
#32 by Sadovnikov
Блин, я просто начинаю тихо фигеть...
#33 by Оболтус
Наверно, я выскажу общее мнение, что никто ничего нифига не понял. Но все стесняются признаться...
#34 by Sadovnikov
Приведен текст запроса, который во временной таблице #Z находит первый разрыв и прибавляет к циферке единичку. Тоесть, как раз то, что и нужно автору ветки. Сам запрос, который ему нужен для примера вот: Select IsNull(Min(T1.K), 0) + 1 Left Join #Z T2 (NoLock) On (T1.K + 1) = T2.K Where T2.K Is NULL
#35 by Torquader
а если база файловая ?
#36 by Злой Бобр
Я б пошел по пути как в . Вот только заполнять его обработкой (раз в сутки думаю достаточно будет). Ну а если скуль - таблица с заполнением через триггер.
#37 by Sadovnikov
А какая разница?
#38 by Дуб
структура кода какая? Строка? Длина всегда одинаковая? Префикс всегда одинаковой длины?
#39 by ildus
забей на дырки нумерации, зачем тебе это?
#40 by kiruha
Ну так запрос при соединении даст 10 строк. Или в Т1 надо 100 000 элементов вставлять?
#41 by kiruha
Наверно надо декартово произведение из нескольких Т1. Но не уверен что это быстро. Еще и всю таблицу подсоединять.
#42 by Cthulhu
гы...
#43 by у лю 427
. и где люди такую траву берут?????? .
#44 by Cthulhu
: а по существу?.. попробовал то хоть?.. ))))
#45 by у лю 427
так никто не шлет - как попробую?
#46 by Cthulhu
: внешняя обработка, на кнопку - код (справлчник можно не ТМЦ а любой с числовым кодом). А на вопрос "как тут прервать выполнение запроса" если ответишь (см.код) - так вообще спасибище будед )))))
#47 by у лю 427
лень думать... у меня другие проблемы сейчас....
#48 by Cthulhu
ЗЫ: кстати, в в принципе способ решения проблемы "безмолвного" выполнения запроса.. ))))
#49 by vde69
вот однопроходный перенумератор, умеет оптимизировать и заполнять дырки
#50 by Тьма
#51 by КонецЦикла
Олег, что ты пытался сделать? Мот тупенько апдейтом с приращением?
#52 by КонецЦикла
+ А, сорри, вроде не о том подумал Пойду домой, замудохамшись
#53 by Cthulhu
#54 by Sadovnikov
Ты прикалываешься просто? На запрос внимательно посмотри. И T1 - это таблица для экспериментов. В реальном запросе это будет справочник. И нифига туда инсертить не надо будет.
#55 by Sadovnikov
Запрос в кверюге выполни. А потом замени T1 на таблицу справочника, а K - на Code :) И строки с созданием, удалением таблицы и инсертами убери.
#56 by Тьма
Mea culpa
#57 by kiruha
А , понял, это справочник к справочнику. Хорошая идея ) Единственно, что индексы никак тут задействованы не будут(т.е. будет просмотр всей таблицы) - но намного лучше чем перебор.
#58 by kiruha
+ Пояснения нужны - а то мозг ломается ) + если нет кодов 1,2,3 - запрос их не отловит. Нужно на наличие кода 1 отдельно проверять.
#59 by Sadovnikov
Почему же не будет задействованы индексы? Единственно, конечно, что не Seek, а Scan... Глянь план такого запроса: From SC14 T1 (NoLock) Left Join SC14 T2 (NoLock) On (T1.CODE + 1) = T2.CODE Where T2.CODE Is NULL
#60 by Sadovnikov
"Еесли нет кодов 1,2,3 - запрос их не отловит" - еща как отловит
Тэги:
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С