#0
by Bagirius
Есть справочник, с числовыми кодами. При создании нового элемента код отрабатывает поиск первого свободного кода в справочнике (т.к. периодически удаляются элементы). Зачем так сделано, не буду описывать, но так надо :-) Когда код достигнет 100 000, совсем будет тормозить. Константа создана, для ускорения поиска, и заполняется при любом монопольном входе в базу. Возможно ли ускорить данную задачу. Может прямой запрос какой то хитрый впендюрьть? Есть идеи?
#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
Если элементы справочника переодически удаляются, тогда наверное можно использовать уже помеченные на удаление элементы и просто восстанавливать их.
#9
by План
может лучше обработкой вытаскивать (например каждый час) не занятые номера номенкалтуры, и заполнять их в строку - константу типа так: [НезанятыйНомер1][НезанятыйНомер2][НезанятыйНомер3][НезанятыйНомер4][НезанятыйНомер5] А при создании элемента справочника брать номера из этой строки.
#15
by Деметрио
ы. можно еще завести второй справочник освободившихся номеров. и когда в первом элемент удаляется, элемент с таким номером заводится во втором.
#25
by smaharbA
хоть бы синтаксис знать какой у запроса, она падла ведь в синглюзер буду копать, или адинес или прослойку какую между клиентом и адинес впендюрю
#26
by mrkorn
достаточно одного значения. При записи будет указываться последний занятый номер. по-видимому уже закончилась
#27
by Torquader
Нехорошо повторно использовать код элемента справочника, так как может возникать путаница старого и нового элемента. Но можно сделать следущее: При удалении элемента справочника (не пометки на удаление, а именно при удалении) мы просто заменяем название элемента на ### (или ъъъ, как тут кто-то советовал) и помещаем его в папку "УдалённыеИСвободные". Далее, при создании нового элемента выполняем поиск по наименованию, а если не нашли, то к максимальному коду добавляем 1 (это делает встроенная автонумерация). Ничего тормозить не должно, но ещё раз хочется заметить, что код элемента справочника - это его уникальный номер и отдавать его другому элементу следует только в том случае, если удаляемый элемент нигде и никогда не использовался. (Удаление, например, элемента из вашего прайс-листа не означает, что у ваших покупателей этот элемент сам ликивидуется).
#28
by Табуретко
Хотя с другой стороны удалил ты три элемента сподряд а записался послледний и 2 "дыры"...
#29
by kiruha
Если файловая. Элементы сразу не удаляются - помечаются как Deleted. Смотришь коды у элементов Deleted (по ним есть индекс), берешь код с мин значением RecNo(он будет затерт). Если нет таких - то максимальный.
#31
by mrkorn
обычно при незакрытых кодах справочника какой-нибудь мудень добивает лишнию цифирь и был у нас номер 5тизначный, а стал 6тизначный дыры между кодами большие и такой алгоритм (последовательной проверки с определенного кода) не сильно затормозит работу а вот если справочник физически заканчивается, то проще добавить пару разрядов в конфигураторе
#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
#36
by Злой Бобр
Я б пошел по пути как в . Вот только заполнять его обработкой (раз в сутки думаю достаточно будет). Ну а если скуль - таблица с заполнением через триггер.
#40
by kiruha
Ну так запрос при соединении даст 10 строк. Или в Т1 надо 100 000 элементов вставлять?
#41
by kiruha
Наверно надо декартово произведение из нескольких Т1. Но не уверен что это быстро. Еще и всю таблицу подсоединять.
#46
by Cthulhu
: внешняя обработка, на кнопку - код (справлчник можно не ТМЦ а любой с числовым кодом). А на вопрос "как тут прервать выполнение запроса" если ответишь (см.код) - так вообще спасибище будед )))))
#48
by Cthulhu
ЗЫ: кстати, в в принципе способ решения проблемы "безмолвного" выполнения запроса.. ))))
#54
by Sadovnikov
Ты прикалываешься просто? На запрос внимательно посмотри. И T1 - это таблица для экспериментов. В реальном запросе это будет справочник. И нифига туда инсертить не надо будет.
#55
by Sadovnikov
Запрос в кверюге выполни. А потом замени T1 на таблицу справочника, а K - на Code :) И строки с созданием, удалением таблицы и инсертами убери.
#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
Тэги:
Ответить:
Комментарии доступны только авторизированным пользователям
Похожие вопросы 1С
- Как быстро очистить 1с 7.7. (dbf)от данных документов и регистров?
- Как найти элемент справочника по нескольким реквизитам?
- Как быстро найти максимальное значение кода справочника?
- Как быстро найти элемент справочника по значению Пер. реквизита?
- Как быстро найти строку в ТЗ по нескольким колонкам?
- Как найти точку диаграммы ганта? (метода Найти() нет)
- КАК у элемента справочника быстро найти самого верхнего родителя?
В этой группе 1С
- Как удалить одну строчку движения по регистру, из документа....
- Настройка параметров epson LQ 630
- Как получить значение из поля со списком?
- ЗУП: в 2НДФЛ не = налог исчисленный и удержанный?
- Запись в Дебет и списание с Кредита счета в рамках одной операции.
- Как скопировать колонки ТЗ?
- Установка MS SQL Server 2000 64-bit на MS Windows Server 2003 Enterprise x64 Edition
- Можно ли получить результат БухИтогов на позицию документа?
- ККМ Атол FPrint-02K
- Запрос к табличной части обработки.
- Белый хасп
- Как обойти использование запроса в цикле?
- ЗУП - коэффициент индексации для премии при расчете среднего заработка
- Вытащить ВидРасчета в Зарплате
- Программа для проверки ЕСН ?
- Как изменить программно положение переплета?
- В сетевом ключе нет свободной лицензии
- ЗУП. Общий трудовой стаж работника
- Интерактивная система коллективного накопления знаний нового поколения.
- Поле объекта не обнаружено получить объект