Быстрая загрузка данных из базы SQL #721360


#0 by Lepochkin
Добрый день, всем. Есть такая задачка. Имеется база SQL. К ней я делаю запрос и получаю данные. Далее эти данные помещаю с таблица значений, таблицу значений передаю как параметр в запрос 1совский и дальше с ней работаю. Дак вот табличка с данными стала ну уж очень большой, и уходит порядка получаса для того, что бы прямым перебором ее запихать в таблицу значений. Есть ли как-нибудь другой способ? Внешний источник данных пробовал. Ничего хорошего.
#1 by КонецЦикла
Временные таблицы? Не, не слышол
#2 by Ерепень
а напрямую запросить? подозреваю, будет то же, что и с внешним источником
#3 by Жан Пердежон
большая это сколько?
#4 by shuhard
[Есть ли как-нибудь другой способ] засунуть напрямки в табличку 1С на сиквеле
#5 by ice777
примерно так: Вставка = "бла-бла первый запрос" Второй запрос = "......"+ Вставка + "....."
#6 by ice777
* "вставку" вставь там, куда ТЗ свою сувал. это по-простому
#7 by ДенисЧ
хм.... А дайте код создание временной таблицы в скуле, чтобы к ней потом запросом 1с можно было обратиться.... И да, код вытяжки покажи....
#8 by Lepochkin
Вот как бы из скуля по временную таблицу 1ски сделать. хочу знать 4 миллиона записей сейчас и прогнозируется рост Не понял Тут все наверное стандартно     Если НЕ RecordSet.EOF Тогда
#9 by ДенисЧ
измени вот эту строку RecordSet.Fields(RecordSet.Fields.Item(НомерКолонки).Name).Value; перед циклом получай все элементы Fields в переменные. Намного быстрее будет.
#10 by Lepochkin
Не понял как этот должно выглядеть
#11 by ДенисЧ
#12 by Lepochkin
Как-то так получилось. Вроде работает     Для НомерКолонки = 0 По RecordSet.Fields.Count-1 Цикл Вечером посмотрим прирост в скорости. Есть еще какие-нибудь варианты ускорения?
#13 by ДенисЧ
Посмотри на GameWithFire. Дальше некуда.
#14 by Зеленый пень
Эти 4 млн. строк в SQL часто обновляются? Если нет, то я бы тащил только новые и добавлял их в рег.сведений в базе 1С. Можно делать такое обновление РС в фоновом режиме. А запрос по РС строить.
#15 by КонецЦикла
В таблицу SQL с нужным индексом... или в какой-то служебный регистр сведений
#16 by МихаилМ
читайте про метод ado getrows   если 1с - клиент- серверная , то можно в таблицы бд 1с (РС)записать обработать, затем очистить можно ускорить чтение данных из скл если написать clr-метод который превратит выборку в тз спрятанную в хранилище Значений
#17 by Drac0
Что ты потом с этими данными делаешь в 1С-ом запросе?
#18 by Широкий
BULK INSERT?
#19 by Lepochkin
Собственно так и делаю. Получаю данные раз в день, пишу только изменения в регистр, а пользователи уже с регистром работают. Задание стало работать 40 минут. Из них 30 получение данных. Пока еще все терпимо, доводить нетерпимо не хочется.
#20 by Зеленый пень
Не совсем понятно. Если получение данных сделать заранее - то останется только отчет построить, т.е. 10 сек.
#21 by Cyberhawk
Храни в приемнике дату актуальности таблицы, а из источника получай только записи, которые актуальнее даты актуальности приемника. Ну, это прокатит, если во внешнем источнике есть timastamp
#22 by Cyberhawk
* timestamp
#23 by Lepochkin
с getrows вот такой косяк. Ошибка при вызове метода контекста (GetRows)     COMSafeArray = RecordSet.GetRows; по причине: Произошла исключительная ситуация (Provider): Недостаточно памяти для завершения операции на TOP 1000 очень шустро отработала, а вот на полной таблице не взлетело
#24 by Lepochkin
Отчеты все летают. Данные просто нужны к концу рабочего дня и становится критичное время их закачки в 1ску.
#25 by YFedor
Не понял зачем здесь вообще ТЗ и запрос в 1С
#26 by Lepochkin
Хотя бы для того что бы в регистр сведений записать ссылку на номенклатуру, а не ее код, который мне отдает сторонняя база SQL. Плюс дублирующие записи отсечь.
#27 by Зеленый пень
Можно в SQL повесить триггеры, которые в отдельную таблицу будут добавлять измененные строки, и там всё что угодно можно замутить.
#28 by rsv
Так что с внешним источником ? Получив оный джойните с чем хотите и не надо никуда перезаливать. Джойнить получится токма в СКД.
#29 by rsv
4 000 000  это не объем.
#30 by rsv
в принципе они и были придуманы (источники) для этих целей - для соединения (объеденения ) в единой среде выполнения
#31 by Lepochkin
При тесте внешнего источника памяти сожрал процесс 2 гига и помер.
#32 by rsv
Поля поиндексируйте в таблице внешней . может и взлетит.
#33 by rsv
Ставьте топ 100 при тестах.
#34 by Lepochkin
Пробовал. Та же история
#35 by Lepochkin
Первый запуск на TOP 1000 делаю. Если все взлетает, то беру целиком.
#36 by neckto
На этапе получения данных отсекай уже обработанные, будешь вытаскивать небольшой объем изменений.
#37 by Lepochkin
Сравнения в цикле делаются медленные чем в запросе. А скулявая база не держит срез последний 1совский.
#38 by neckto
есть у тебя таблица №1: <ID> <Данные> Создай в SQL-ной базе таблицу №2: <ID>. Когда получаешь данные, получай из таблицы №1, за исключением данных в таблице №2. Когда в 1С обработаешь записи, пиши в таблицу №2 <ID>. <ID> - одно или комбинация полей.
#39 by Lepochkin
Со структурой в скульной базе можно конечно попробовать оптимизец навести. Но данных все равно много будет. Так что начальная задачка остается.
#40 by neckto
Делай обмен чаще.
#41 by Lepochkin
Чаще плохо. Посчитать не по конечным данным юзеры могут.
#42 by КонецЦикла
Соединение в запросе, а не сравнение в цикле Все там моментально будет если применить моск
#43 by Жан Пердежон
может есть возможность сразу готовые данные получать из SQL? либо часть данных из 1С помещать в ВТ SQL, а потом уже тянуть запросом результат?
#44 by neckto
Можно поиграться признаком Активность записи РС.
#45 by Надо работать
А частями грузить, по миллиону записей допустим?
#46 by Drac0
Из 4 млн. считаных записей, сколько пишутся в регистр?
#47 by Йохохо
вангую "500 штук" и проблема добавить в запрос вхере Выражение
#48 by Lepochkin
70% примерно. Частями получать тоже можно. Даже реализовано.
#49 by Drac0
Да ,тогда особо не выиграешь. Тогда, ИМХО, делать запись в технический регистр прямым запросом ,а потом уже с ним работать через 1С.
#50 by Lepochkin
Вот наверное по такому пути я и пойду.
#51 by Serginio1
Если табличка регистр сведений, то проще использовать Merge и напрямую писать в регистр сведений
#52 by Kamas
так что там с клавиатурой то решилось??
#53 by Serginio1
Без понятия
#54 by Lepochkin
Переделка из ускорила примерно в 2 раз.
#55 by МихаилМ
избавьтесь от RecordSet.Fields.Count-1 и будет еще быстрей если будете в getrows  получать не все данные а порциями (например по 50000 записей ) будет еще быстрей.
#56 by Serginio1
55+
Тэги: 1С 8
Ответить:
Комментарии доступны только авторизированным пользователям

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