Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Выгрузка данных в MS SQL

Выгрузка данных в MS SQL
Я
   Amfiaray
 
09.06.20 - 09:26
Добрый день!

Есть необходимость выгружать данные из 1С в стороннюю базу MS SQL.
Объем данных большой и постоянно растет, на данный момент около 4кк строк. Пробовал несколько вариантов:

1. Построчно INSERT - работает очень медленно.
2. Сформировать файл csv с последующей загрузкой с помощью BULK INSERT - Ещё медленнее на больших объемах, такое ощущение что при формировании текстового документа чем больше строк, тем дольше добавление новой строки.
3. Загрузка с помощью csv и BULK INSERT порциями по 200к записей - Пока это самый быстрый вариант(2.5-3 часа).

Может есть какой то более быстрый способ загрузки данных в MS SQL?
   ДенисЧ
 
1 - 09.06.20 - 09:37
"при формировании текстового документа чем больше строк, тем дольше добавление"
Как создаёшь документ?
   ДенисЧ
 
2 - 09.06.20 - 09:40
А вообще - напрямую из скуль-базы 1с в скуль-базу стороннюю через линкед-сервер
   МихаилМ
 
3 - 09.06.20 - 09:44
причем тут 1с
при булк инсерт должно быть минимум 100к записей в секунду (зависит от индексов) те загрузка должна длиться в районе минуты
можно использовать многопоточную запись с помощью ssis.
почитайте про загрузку данный  номеров недействительный паспортов из файла list_of_expired_passports.csv.bz2
   Кирпич
 
4 - 09.06.20 - 09:45
загружать вот самый быстрый способ
https://docs.microsoft.com/ru-ru/sql/tools/bcp-utility?view=sql-server-ver15

а быстро выгружать из 1с это отдельная песня
   Кирпич
 
5 - 09.06.20 - 09:52
Быстро выгружать из 1с. Я бы запрос сбрасывал на диск функцией ЗначениеВФайл(), а потом этот текст парсил на быстром языке и выдавал файл для загрузки для bcb или BULK INSERT.
   Amfiaray
 
6 - 09.06.20 - 10:00
(1) Документ создаю вот так:
        ФайлCSV = Новый ТекстовыйДокумент;
    ФайлCSV.ДобавитьСтроку(ТекстШапки);
    
    Для Каждого СтрокаТ Из ТаблицаДанных Цикл
        
        ТекстСтроки = "";
        Для Каждого Колонка Из ТаблицаДанных.Колонки Цикл
            Если ТекстСтроки = "" Тогда
                ТекстСтроки = СокрЛП(СтрокаТ[Колонка.Имя]);
            Иначе
                ТекстСтроки = ТекстСтроки+Разделитель+СокрЛП(СтрокаТ[Колонка.Имя]);
            КонецЕсли;
        КонецЦикла;
        ФайлCSV.ДобавитьСтроку(ТекстСтроки);    
        
    КонецЦикла;    
    
    ФайлCSV.Записать(ИмяФайла, КодировкаТекста.UTF16);
   Amfiaray
 
7 - 09.06.20 - 10:01
(2) Там ТЗ получается в мудреном и большом запросе а не просто из таблицы в таблицу
   Amfiaray
 
8 - 09.06.20 - 10:02
(3) Долго файл csv формируется
   ДенисЧ
 
9 - 09.06.20 - 10:02
(6) Используй ЗаписьТекста, она быстрее
   Amfiaray
 
10 - 09.06.20 - 10:03
(9) Ок, сейчас попробую, по результату отпишусь
   arsik
 
11 - 09.06.20 - 10:06
(10) Еще и перебор колонок лучше из цикла убрать. Например перед циклом в массив загоните названия колонок. Внутри цикла уже этот массив используйте.
   arsik
 
12 - 09.06.20 - 10:07
+ (11) И зачем вам там имя, можно по индексу обращаться.
   Amfiaray
 
13 - 09.06.20 - 10:11
(10) Всё это быстро отрабатывает. С каждой новой строкой вот этот код работает всё дольше: ФайлCSV.ДобавитьСтроку(ТекстСтроки);
   ДенисЧ
 
14 - 09.06.20 - 10:13
(13) Это в записи текста?
   Кирпич
 
15 - 09.06.20 - 10:13
(13) ну дак ты все в память пихаешь, да еще и каждый раз память перевыделяется при добавлении. пиши сразу в файл и не парься
используй ЗаписьДанных.ЗаписатьСимволы, например.
   Amfiaray
 
16 - 09.06.20 - 10:14
(14) нет, в текстовом документе
   ДенисЧ
 
17 - 09.06.20 - 10:14
(16) не удивительно
   arsik
 
18 - 09.06.20 - 10:14
(14) Не. В записи всегда линейно. Это в текстовомДокументе так работает.
   ДенисЧ
 
19 - 09.06.20 - 10:26
(18) На это я и намекаю. Ещё с (9)
   Кирпич
 
20 - 09.06.20 - 10:39
Так вот попробуй
ФайлCSV = Новый ЗаписьДанных(ИмяФайла, КодировкаТекста.UTF16);
ФайлCSV.ЗаписатьСтроку(ТекстШапки);
Для Каждого СтрокаТ Из ТаблицаДанных Цикл
    ТекстСтроки = "";
    Для Каждого Колонка Из ТаблицаДанных.Колонки Цикл
        Если ТекстСтроки = "" Тогда
            ТекстСтроки = СокрЛП(СтрокаТ[Колонка.Имя]);
            ФайлCSV.ЗаписатьСимволы(ТекстСтроки);
        Иначе
            ФайлCSV.ЗаписатьСимволы(Разделитель);
            ФайлCSV.ЗаписатьСимволы(СокрЛП(СтрокаТ[Колонка.Имя]));
        КонецЕсли;
    КонецЦикла;
    ФайлCSV.ЗаписатьСтроку("");    
КонецЦикла;

   rsv
 
21 - 09.06.20 - 11:23
(0) есть мастер импорта и експорта в скуле родной (правой кнопокой на табличке скуля контекстное меню)
. Если одинэска на скуле - выгрузите через него данные в  текст или еще куда там в мастере
Много форматов . На стронней базе сделайте импорт
   МихаилМ
 
22 - 09.06.20 - 11:24
я бы посмотрел в сторону https://its.1c.ru/db/metod8dev#content:2584:hdoc
   rsv
 
23 - 09.06.20 - 11:28
Когда через промежуточные файлы надоест гонять - создайте на строннем скуле
линк на 1с скуль и .... select * into табличка from линк. База.dbo. Табличка
   Кирпич
 
24 - 09.06.20 - 11:30
(23) он какой то хитроумный запрос выгружает, а не просто справочник
   rsv
 
25 - 09.06.20 - 11:31
(24) придется переписать под скуль... или  как и ранее промежуточный файл
   Кирпич
 
26 - 09.06.20 - 11:34
(25) да кто там будет писать то
   МихаилМ
 
27 - 09.06.20 - 11:41
(23)
человек за 10 лет не узнал про https://speshuric.livejournal.com/163665.html
   rsv
 
28 - 09.06.20 - 11:42
Как вариант минимизации это сделать табличку простенького
Регистра сведений в 1ске с выходными полями запроса  строка число дата

Регистр.загрузить(запрос. Выполнить.выгрузить) - по скорости это к движку 1с
Будет таблица - ее уже можно выгружать и гнать напрямки селектом простым
   rsv
 
29 - 09.06.20 - 11:50
(27) по ссылке наверное автор любит все выгружать либо в текст или xml и
Обратно загружать ...
   Ёпрст
 
30 - 09.06.20 - 11:52
(27) да..через ЗаписьXML реально быстро
 
 Рекламное место пустует
   МихаилМ
 
31 - 09.06.20 - 11:55
(30)
в 16 релизе переписали работу с памятью. так что возможно что-то изменилось.
   Ёпрст
 
32 - 09.06.20 - 11:57
(31) на 15 пока..лень смотреть новые релизы
   Ёпрст
 
33 - 09.06.20 - 11:59
(0) а че за данные то хоть ?
Мот того, не выгружать ничего в текст, а все сразу в сторонний скуль, напрямую, как ужо неоднократно советовали
   Конструктор1С
 
34 - 09.06.20 - 12:25
4kk строк это ниочем. Что-то вы делаете не так
   Кирпич
 
35 - 09.06.20 - 12:46
(34) И правда. Попробовал (6)
200000 строк типа "Колонка1;Колонка2;Колонка3;Колонка4;Колонка5;Колонка6;Колонка7;Колонка8;Колонка9;Колонка10" за 40 сек выгружает
чота автор понапрограммировал неправильно
   Amfiaray
 
36 - 09.06.20 - 20:23
(33) Данные для bi системы, там движения по регистру бухгалтерии по доходам, расходам и производству за 1.5 года по 300+ организациям в разрезе аналитики(+ анализ аналитики и замена при необходимости).
   ПрестарелыйЗаяц
 
37 - 09.06.20 - 20:50
(23) И что быстро работает?
   Amfiaray
 
38 - 09.06.20 - 21:22
(37) В итоге переделал на ЗаписьТекста и стало работать быстрее, 1,5 года выгружаются меньше чем за час.
   Ёпрст
 
39 - 09.06.20 - 22:40
(38) записьXML еще быстрее будет
   Ёпрст
 
40 - 09.06.20 - 22:40
+39 см (27)


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.