Имя: Пароль:
1C
 
Как-то можно ускорить запись в регистр сведений?
0 Галахад
 
гуру
25.01.21
13:30
Код:

    ЗаписьXML = Новый ЗаписьXML;
    ЗаписьXML.УстановитьСтроку();
    Для каждого Стр Из ТаблицаЗаписей Цикл
        
        ЗаписьXML.ЗаписатьБезОбработки("INSERT INTO " + ТаблицаSQL);
        ЗаписьXML.ЗаписатьБезОбработки("([" + А + "], [" + В + "], [" + С + "], [" + Д + "], [" + Количество + "])");
        ЗаписьXML.ЗаписатьБезОбработки("VALUES ('"+Стр.А+"', '"+Стр.В+"', '"+Стр.С+"', '"+Стр.Д+"', '"+Стр.Количество+"')");
            
    КонецЦикла;
    ТекстТекущейИнструкции = ЗаписьXML.Закрыть();    
    
    
    Попытка
        
        Соединение.BeginTrans();
        Соединение.Execute(ТекстТекущейИнструкции,,128);
        Сообщить("Ок!");
        Соединение.CommitTrans();
        
    Исключение
        
        Сообщить(ОписаниеОшибки());
        Соединение.RollbackTrans();
        
    КонецПопытки;
1 Галахад
 
гуру
25.01.21
13:30
Статистика:
Записей = 4 460, время = 427
2 Галахад
 
гуру
25.01.21
13:33
Измерения А, В, С, Д - Строка
Ресурс - Число
Ведущее - Ложь
Основной отбор - Истина
3 polosov
 
25.01.21
13:33
(0) Мы сами не местные. Это что за запись и в какой РС? Прямо в БД пытаешься писать?
Кто такое Соединение?
4 ДенисЧ
 
25.01.21
13:33
булкой вставляй.
Или индексы убери все...
5 Галахад
 
гуру
25.01.21
13:35
(3) Тип того.
Регистр в (2) описал.
Да.
Соединение  = Новый COMОбъект("ADODB.Connection");
6 Галахад
 
гуру
25.01.21
13:35
(4) Пример есть?
Щас попробую.
7 lEvGl
 
гуру
25.01.21
13:39
(6) булккопи в гугле примеры
8 Галахад
 
гуру
25.01.21
13:40
(4) Отключил и "основной отбор"
Ведущее и Индексировать уже были отключены.
Результат:
Записей = 4 460, время= 488
9 ДенисЧ
 
25.01.21
13:40
(6) В BOL точно есть
10 lEvGl
 
гуру
25.01.21
13:41
+ на шарпе точно работает )
11 Широкий
 
25.01.21
13:42
Пакетный инсерт?
12 fisher
 
25.01.21
13:43
Измерения - длинные строки, что ли?
13 Галахад
 
гуру
25.01.21
13:49
(9) (10) Окай.

(11) Угу. Посмотрю.

(12) Длинна - 5, 9, 9, 9
14 polosov
 
25.01.21
13:51
15 fisher
 
25.01.21
13:55
(13) Хм. Тогда странно. 10 записей в секунду как-то маловато. Да еще и в транзакции. А попробуй ради интереса транзакцию не через соединение делать, а через T-SQL.
ЗЫ. А зачем, если не секрет, ты текст запроса через ЗаписьXML готовишь?
16 fisher
 
25.01.21
13:57
Хотя погоди. Для одной транзакции ты многовато данных пишешь. Попробуй для начала писать пачками по 100.
17 Ёпрст
 
гуру
25.01.21
13:58
и транзакцию выкинь
18 Галахад
 
гуру
25.01.21
14:01
(14) Спасибо.

(15) Хм. Там миллисекунды.
Ок. Но это уже не сегодня.
А как? Конкатенация - тормозная же операция.
19 Fragster
 
гуру
25.01.21
14:02
вынеси         ЗаписьXML.ЗаписатьБезОбработки("INSERT INTO " + ТаблицаSQL);
        ЗаписьXML.ЗаписатьБезОбработки("([" + А + "], [" + В + "], [" + С + "], [" + Д + "], [" + Количество + "]) VALUES ");
за цикл, скобки через запятую повтори
20 Fragster
 
гуру
25.01.21
14:03
можно порциями по 1000 строк
21 Fragster
 
гуру
25.01.21
14:04
вроде mssql стал такое поддерживать с 2008
22 Timon1405
 
25.01.21
14:05
(18) СтрСоединить быстрее чем сложение строк через +
23 fisher
 
25.01.21
14:05
(18) Да до меня только дошло, что у тебя там строка эпических размеров.
А, так у тебя больше 10000 в секунду залетает? А хочешь сколько? :)
Но в любом случае, если уменьшишь размер пакета на транзакцию, то некоторый прирост быть должен.
24 Fragster
 
гуру
25.01.21
14:06
(22) записьXML самый быстрый по тестам
25 Галахад
 
гуру
25.01.21
14:06
(16) (17)
Чот не особо изменилось...

Записей = 4 460, время= 437
26 Галахад
 
гуру
25.01.21
14:07
Ладно, мне бежать пора. А вы пишите, не стесняйтесь. :-)
Завтра потестю.
27 Широкий
 
25.01.21
14:07
(25) в 21 пакетный инсерт
28 fisher
 
25.01.21
14:12
Ну, тогда в сторону "булок" был правильный пинок.
http://catalog.mista.ru/1c/articles/1009357/
29 Конструктор1С
 
25.01.21
14:52
(4) булк это для больших объемов. А тут 4 тыщи
30 lEvGl
 
гуру
25.01.21
14:57
(29) по коду из (0) текст запроса выглядит как
Insert A, B, C values 1, 2, 3
Insert A, B, C values 3, 2, 1
Insert A, B, C values 11, 22, 33

и так 4000 раз, я может и перфекционист, но когда столкнулся с таким вариантом вставки подумал что, что то не ладное, как минимум текст запроса потенциально может много весить, и это ерунда по сравнению с процессом интерпритации таких текстов двигателем sql
31 Fragster
 
гуру
25.01.21
14:59
(30) см (19). да, и работает вставка оним запросом прям сильно быстрее
32 sapphire
 
25.01.21
15:05
(0) Для очень большого объема записей вполне годно передать XML серверу и на стороне СУБД сделать вставку в таблицу из запроса к XML
33 Конструктор1С
 
25.01.21
15:06
(31) ну да, надо объединить в один инсерт
34 sapphire
 
25.01.21
15:08
+(32) если версия сервера поддерживает JSON, то в формате JSON
35 sapphire
 
25.01.21
15:10
Хотя, 5К записей, действительно можно обычным текстом бабахнуть
36 mistеr
 
25.01.21
15:43
(0) Главный вопрос — откуда данные приходят и в каком виде?
37 Serg_1960
 
25.01.21
16:07
Я за вариант (19) и (20). Во-первых, не вижу смысла для каждого INSERT список полей повторять; во-вторых, можно и без списка полей обойтись, если автор указывает значения всех полей записи

INSERT INTO
таблица(список полей)
VALUES
(список значений 1),
(список значений 2),
...
(список значений 1000)
38 fisher
 
25.01.21
16:08
(34) О. Прикольная мысль. Вроде с 2016 можно. Будем знать.
Через xml делал когда-то похожее. Шустро работало.
39 fisher
 
25.01.21
16:09
Всяко лучше, чем через файлики.
40 Галахад
 
гуру
26.01.21
07:26
Хм. Немного не тот результат я ожидал...

Пакетом. Время = 325
Построчно. Время = 243
41 Галахад
 
гуру
26.01.21
07:27
Функция ДобавитьЗаписиСКЛПакетом(Соединение, ТаблицаSQL, Поля, МассивТаблиц)
    
    ВремяИтого = 0;
    
    Для каждого ТекТаблица Из МассивТаблиц Цикл
        
        КолСтрок = ТекТаблица.Количество();
        Сч = 0;
        
        ЗаписьXML = Новый ЗаписьXML;
        ЗаписьXML.УстановитьСтроку();
        ЗаписьXML.ЗаписатьБезОбработки("INSERT INTO " + ТаблицаSQL);
        ЗаписьXML.ЗаписатьБезОбработки("([" + Поля[0].Значение + "], [" + Поля[1].Значение + "], [" + Поля[2].Значение + "], [" + Поля[3].Значение + "], [" + Поля[4].Значение + "])");
        ЗаписьXML.ЗаписатьБезОбработки("VALUES");
        Для каждого Стр Из ТекТаблица Цикл
            
            Сч = Сч + 1;
            Если Сч = КолСтрок Тогда
                ЗаписьXML.ЗаписатьБезОбработки("('" + Стр[0] + "', '" + Стр[1] + "', '" + Стр[2] + "', '" + Стр[3] + "', '" + Стр[4] + "')");
            Иначе
                ЗаписьXML.ЗаписатьБезОбработки("('" + Стр[0] + "', '" + Стр[1] + "', '" + Стр[2] + "', '" + Стр[3] + "', '" + Стр[4] + "'),");
            КонецЕсли;
            
        КонецЦикла;
        ТекстТекущейИнструкции = ЗаписьXML.Закрыть();
        
        
        Начало = ТекущаяУниверсальнаяДатаВМиллисекундах();
        ВыполнитьИнструкциюСКЛ(Соединение, ТекстТекущейИнструкции);
        Окончание = ТекущаяУниверсальнаяДатаВМиллисекундах();
        ВремяИтого = ВремяИтого + (Окончание - Начало);
        

    КонецЦикла;
    
    Сообщить("Пакетом. Время = " + ВремяИтого);
        
КонецФункции
42 Галахад
 
гуру
26.01.21
07:27
Функция ДобавитьЗаписиСКЛ(Соединение, ТаблицаSQL, Поля, ТаблицаЗаписей)
    
    ЗаписьXML = Новый ЗаписьXML;
    ЗаписьXML.УстановитьСтроку();
    Для каждого Стр Из ТаблицаЗаписей Цикл
        
        ЗаписьXML.ЗаписатьБезОбработки("INSERT INTO " + ТаблицаSQL);
        ЗаписьXML.ЗаписатьБезОбработки("([" + Поля[0].Значение + "], [" + Поля[1].Значение + "], [" + Поля[2].Значение + "], [" + Поля[3].Значение + "], [" + Поля[4].Значение + "])");
        ЗаписьXML.ЗаписатьБезОбработки("VALUES ('" + Стр[0] + "', '" + Стр[1] + "', '" + Стр[2] + "', '" + Стр[3] + "', '" + Стр[4] + "')");
            
    КонецЦикла;
    ТекстТекущейИнструкции = ЗаписьXML.Закрыть();    
    
    
    Начало = ТекущаяУниверсальнаяДатаВМиллисекундах();
    ВыполнитьИнструкциюСКЛ(Соединение, ТекстТекущейИнструкции);
    Окончание = ТекущаяУниверсальнаяДатаВМиллисекундах();
    ВремяВсего = Окончание - Начало;
    Сообщить("Построчно. Время = " + ВремяВсего);
        
КонецФункции
43 Галахад
 
гуру
26.01.21
07:31
Процедура ВыполнитьИнструкциюСКЛ(Соединение, ТекстТекущейИнструкции)
    
    Попытка
        
        Соединение.Execute(ТекстТекущейИнструкции,,128);
        
    Исключение
        
        Сообщить(ОписаниеОшибки());
        
    КонецПопытки;    
    
        
КонецПроцедуры
44 Fragster
 
гуру
26.01.21
10:34
а ты замерь какое место больше занимает, формирование инструкции пили выполнение запроса? может ты не там оптимизируешь вообще.
45 Галахад
 
гуру
26.01.21
11:02
(44) Замеры установлены только на выполнение запросов. Формирование инструкций не учитывается.
46 Ёпрст
 
гуру
26.01.21
11:06
(0) у тя строки что ле везде ? все 4 поля строковые ? Какой длины хоть ?
47 Галахад
 
гуру
26.01.21
11:22
(46) Измерения - строки.
Длинна - 5, 9, 9, 9.
Пятое поле ресурс - число.
48 Fragster
 
гуру
26.01.21
11:26
Сделай INSERT INTO ... WITH (TABLOCK)
и INSERT INTO ... WITH (NOLOCK)
49 Fragster
 
гуру
26.01.21
11:27
хотя нолок здесь не применим, он на селект
50 Fragster
 
гуру
26.01.21
11:28
вообще условия тестирования какие ? это отдельный физический сервер, я надеюсь? или ты (хотя бы) в цикле раз 10-50 повторяешь и мат ожидание нам сообщаешь?
51 Галахад
 
гуру
26.01.21
12:10
(48) Плюс-минус пару процентов.

(50) Ну, такие себе условия. :-)
Нет, не отдельный.
Ну не 10-50, но раз по пять каждый.
52 Галахад
 
гуру
26.01.21
14:34
Ну вот нашлась разгадка.

Оказывается построчно выполняется быстрее по простой причине - команда выполняется частично. :-)
53 lEvGl
 
гуру
26.01.21
14:50
(52) а подробнее можно? не понял
инсерт знач, знач, знач
инсерт знач, знач, знач
инсерт знач, знач, знач

выполняется быстрее чем
инсерт знач, знач, знач
знач, знач, знач
знач, знач, знач
?
или в каждой итерации цикла запись?
54 ДедМорроз
 
26.01.21
14:56
А кстати,если через Prepare и Execute делать построчно - насколько медленнее?
55 ДедМорроз
 
26.01.21
14:59
Просто,каждый insert это трансляция текста запроса для исполнения,здесь - самая медленная операция.
56 ДедМорроз
 
26.01.21
15:00
В adodb для prepare нужно установить текст запроса с параметрами и обновить информацию о параметрах.
57 Вафель
 
26.01.21
15:01
а еще можно индексы на таблице приостановить а потом включить