Как ускорить поиск по реквизиту #459945


#0 by vde69
есть сторонняя система, в 1с из нее получаем таблицу ТЗ примерно в 50 тыс строк, далее надо связать контрагентов и договора (по доп полю), сейчас в базе примерно 200тыс договоров, текущий алгоритм стал долго работать (1-2 часа). Сейчас алгоритм такой: из ТЗ выгружаем колоку с кодами контрагентов и сворачиваем, далее ее дополняем колонкой и заполняем эту колонку (получаем кеш таблицу), проходим основную ТЗ и заполняем поле Контрагент (на основании кеш таблицы), алгоритм заполнения однопроходный цикл. далее так-же заполняем договора, банки, счета и т.д. на сколько я понимаю сейчас у нас проблеммы в размере ТЗ нужна идея какой-то хитрой связи, я пока склоняюсь к варианту создания временной таблицы в скуле и прямом джойне,
#1 by Sadovnikov
"я пока склоняюсь к варианту создания временной таблицы в скуле и прямом джойне" - сдается мне, что это самое правильное решение...
#2 by vde69
от тебя другого и не ожидал :) есть еще такой вариант - хранить внутренний_ID обьекта в сторонней системе, и после получения ТЗ востанавливать ссылку по ID
#3 by DrZombi
А поподробнее, про запрос? Что именно ты хочешь получить в итоге? И зачем все в одной? Разве не проще все поручить самому скулю, а там ужо только результат получить?
#4 by kiruha
скидывай во временную таблицу дбф или sql . Индексируем. Потом прямыми - максимум 2 минуты.
#5 by vde69
стороння база на другом серваке, а прямые джойны для разных серверов не гуд.
#6 by Жан Пердежон
>> получаем таблицу ТЗ примерно в 50 тыс строк, далее надо связать контрагентов и договора; чего с чем связать, что в таблице то?
#7 by Mikeware
Веревкой связать контрагентов. И бирку (договор о погребении) к пятке...
#8 by DrZombi
Да... согласен, но зато быстро :) А чем не через ОЛЕ + в олешной базе запрос?
#9 by vde69
#10 by vde69
другая база дельфовая :)
#11 by Mikeware
Букв много. Что сделать-то надо?
#12 by Жан Пердежон
а чего с чем связывать и что в таблице - так и не ясно) пока только запрос в цикле виден
#13 by vde69
запрос в цикле - это только для вновь создаваемых элементов получение данных из сторонней системы
#14 by genosse
Перефразируй (точнее сформулируй) сам вопрос. Понять тут вообще ничего не реально. получаем таблицу 50000 -> нужно связать контрагентов с договорами их 200000 -> текущий механизм долгий :)
#15 by vde69
вот что я получаю из сторонней системы: Тип: Процедура Описание: Формирует данные для создания в 1С проводок  "Начисление комиссии", "Удержание комиссии" Идентификатор: 10021 Использование: Параметры:   Входные:     @dt_Beg char дата начала,     @dt_End char дата завершения  формат 'dd.mm.yyyy'   Выходные:  Rekvizit - номер договора с клиентом  DateBeg - дата начала договора  DateEnd - дата завершения договора (если нет - то NULL)  Schet - банковский счёт факторинга  dt_inp - дата создания с.ф. в нашей системе --------------------------------------------------- нужно создать документы, для этого нужно по ИНН найти контрагентов, по дате иномеру договора найти договора
#16 by genosse
Замер производительности в каком месте дает наибольший процент? Что оптимизируем? Надо сузить круг подозреваемых .)
#17 by orefkov
тз во врем.табличку и запросом ее, запросом.
#18 by vde69
явных лидеров нету, код и так оптимизировали несколько раз
#19 by genosse
Обе базы скуль? Документы все новые или нужно проверить на наличие изменений в старых + залить новые?
#20 by vde69
обе SQL, но разные 2000 и 2005, при ждойне между серверами индексы не используются, по этому все сделать на одном сервере нельзя. алгоритм пересоздания документов вполне нормально работает, медлено поиск и создание справочников
#21 by genosse
Можно сделать тригер на источнике и переносить только созданные и измененые. Опять же и структуру базы не затронет.
#22 by Asirius
Зачем нужна таблица ТабДоговоров? Почему не сделать индекс по Договор.УИД?
#23 by vde69
для того, что-бы по несколько раз не искать
#24 by Asirius
Так ты и каждый раз договор выбираещь >>Договор.НайтиЭлемент(ТабДоговоров.Ссылка); Договор.НайтиПоРеквизиту("УИД",Уид) будет практически с такой же скоростью работать
#25 by vde69
проверь :) кроме того у меня таблица сильно меньше всего справочника
#26 by МихаилМ
тормоза от подхода решения задачи. обрабатвайте данные множествами а не записями. сответственно желательно иметь метод получения из другой ИБ не обной записи, а множества. и опять же сопоставления (формировани выборки) удобней сделать на сервере а запись на клиенте из сображений понятности кода .
#27 by vde69
получаем выборку одним запросом, далее обращения к базе идут только для НОВЫХ элементов сопостовление на сервере для 7.7 это КАК?
#28 by leshikkam
linked server может быть?
#29 by Garkin
Спрошу на всякий случай.      ........ Это точно работает быстрее  чем ТабДоговоров.НайтиЗначение(    ?
#30 by Garkin
+ Еще непонятно зачем надо Разве Договор=ТабДоговоров.Ссылка недостаточно?
#31 by Garkin
Отсортируй ТЗ по "доп - полю" - избавься от кэш таблицы. Да еще непонятно, сначала ищем клиентов, потом ищем договора. Договор разве не определяет однозначно клиента?
#32 by vde69
в 1с - да, но в сторонней системе нет, и тут идет контроль сторонней системы если договор надо записать, то все равно нужна такая конструкция принимается, посмотрю подробнее
#33 by Garkin
"в 1с - да, но в сторонней системе нет, и тут идет контроль сторонней системы " Ну и фик с ним, найди договор, а потом контролируй совпадает ли владелец договора в 1С с клиентом в сторонней система. "если договор надо записать, то все равно нужна такая конструкция "  - что-то я не наблюдаю где ты в записываешь найденный договор, ты от нас что-то скрываешь? "принимается, посмотрю подробнее" - в топку, см . Избавься от кэш таблицы.
Тэги:
Ответить:
Комментарии доступны только авторизированным пользователям