|
Записать разом много записей | ☑ | ||
---|---|---|---|---|
0
Asmody
28.09.22
✎
20:46
|
Предположим, вам нужно записывать много данных. Порядка 10 млн. записей разом.
Не часто, допустим, 1-2 раза в год. Данные получаются как результат некоторого алгоритма на основании внешних данных. Ваши действия? |
|||
1
Aleksey
28.09.22
✎
20:48
|
Писать куда? в Null? Так он вроде и так туда быстро пишет
|
|||
2
H A D G E H O G s
28.09.22
✎
20:50
|
Для Каждого СтрокаТаблицы Из Таблица Цикл
Док.Заполнить(СтрокаТаблицы); Док.Записать(); КонецЦикла; |
|||
3
Asmody
28.09.22
✎
20:53
|
(1) В 1С. допустим, в РС
|
|||
4
Asmody
28.09.22
✎
20:54
|
(2) смело, оригинально
|
|||
5
H A D G E H O G s
28.09.22
✎
20:54
|
(3)
Для Каждого СтрокаТаблицы Из Таблица Цикл МенеджерЗаписи.Заполнить(СтрокаТаблицы); МенеджерЗаписи.Записать(); КонецЦикла; Ты не прибедняйся, напиши подробней, што тебе надо |
|||
6
Ivan_495
28.09.22
✎
20:54
|
если нужна скорость то смотреть технологии bug date, если про 1с то писать напрямую в левую таблицу sql без блокировок
|
|||
7
Ivan_495
28.09.22
✎
20:55
|
потом тащить медленно в регистр
|
|||
8
Asmody
28.09.22
✎
20:56
|
(5) есть у меня некая маркенговая инфа.
По-сути, в пределе произведение товаров на контрагентов. И с пяток чиселок в каждом пересечении |
|||
9
H A D G E H O G s
28.09.22
✎
20:58
|
Если пофиг на время - см. 5
Если надо быстрее, но в рамках ЛицСоглашения - то разбиваем данные по числу процессоров на сервере 1С - 1, и пишем фоновыми заданиями, внутри фонового - транзакция на 10000 записей. Если не в рамках лиц соглашения - bulkinsert и смотрим, хватает ли диска. Если диска не хватает - секвестируем таблицу |
|||
10
Asmody
28.09.22
✎
20:58
|
Тех и других немного - в деле порядка 3-4 тыс. Но если умножить, будут миллионы
|
|||
11
H A D G E H O G s
28.09.22
✎
20:59
|
Ну и отключаем индексы, кроме кластерного.
|
|||
12
Aleksey
28.09.22
✎
20:59
|
(8) чем тебе ВИД не нравиться? На скуль из текстового файла грузиться быстро, а дальше цепляй таблицу и крути
|
|||
13
Asmody
28.09.22
✎
20:59
|
(11) о! А вот это я попробую.
|
|||
14
Aleksey
28.09.22
✎
21:01
|
Куда маньяка дели? Он как раз на загрузки больших данных в РС собаку съел
|
|||
15
Garykom
гуру
28.09.22
✎
21:01
|
(0)
1. Создать заранее в 1С 10 лямов пустых записей РС 2. Средствами SQL сделать напрямую UPDATE |
|||
16
Asmody
28.09.22
✎
21:01
|
(12) тем, что это все внутри 1С считается.
считается оно мухой, там элементарная арифметика. но вот доходит до Записать() и можно идти ночевать. |
|||
17
Ivan_495
28.09.22
✎
21:01
|
csv
|
|||
18
Asmody
28.09.22
✎
21:04
|
(17) это я читаю так: надо писать во внешний файл, а оттуда уже в базу?
Не уверен я, что в файл будет писать быстрее, чем в sql |
|||
19
H A D G E H O G s
28.09.22
✎
21:04
|
Вот, кстати, тут на bcp батон крошат и ты можешь затестить схему
1С-> csv-> SQL через эту утиль, но я не проверял. https://habr.com/ru/post/536572/ |
|||
20
H A D G E H O G s
28.09.22
✎
21:04
|
(18) Будешь
|
|||
21
Garykom
гуру
28.09.22
✎
21:04
|
1С в РС в кучу фоновых на сервере пишет достаточно быстро
Особенно если как правильно заметили без индексов лишних |
|||
22
Garykom
гуру
28.09.22
✎
21:06
|
(9) >разбиваем данные по числу процессоров на сервере 1С
не совсем правильно с точки зрения максимизации скорости по числу процессоров надо бить если в базе активно работают если же только эта задача грузит то надо задавать фоновых в 2-3 раза больше чем логических процессоров |
|||
23
Garykom
гуру
28.09.22
✎
21:08
|
(22) *надо = можно
на практике лучше тестами подбирать сколько фоновых под конкретный сервак там особенности есть что пока одно фоновое ждет ответа от скуля, другое уже готовится и т.д. |
|||
24
H A D G E H O G s
28.09.22
✎
21:16
|
(23) Пока одно ждет ответа от скуля, это ядро занято скулем.
|
|||
25
Garykom
гуру
28.09.22
✎
21:19
|
(24) Совершенно не факт, там может быть ожидание дисковой в скуле и ядро по сути свободно
|
|||
26
Ivan_495
28.09.22
✎
21:34
|
(0) выгружаем , загружаем . может проще хранимку на sql написать она перемножит две вьюхи , а результат сохранит в таблице sql , а потом это рещультат торжественно вывести в скд.
|
|||
27
Ivan_495
28.09.22
✎
21:37
|
возможно даже без хранимки ado все это потянет
|
|||
28
RomanYS
28.09.22
✎
23:25
|
(18) а в чём вообще проблема?
Вот замер на файловой базе для записи 10 млн записей (2 измерения ссылка, 5 ресурсов Строка10) Набор.Записать(); 1 65,249991 27,77% Набор.Загрузить(ТЗ); 1 47,858034 20,37% ЗначениеВФайл(ИмяФайла, ТЗ); 1 29,283295 12,46% ТЗ = РезультатЗапроса.Выгрузить(); 1 25,161717 10,71% Памяти конечно жрет, и на сервере одним набором писать не стоит. Но тупая внутренняя сериализация такой ТЗ - полминуты (файл 3GB) |
|||
29
H A D G E H O G s
28.09.22
✎
23:29
|
(28) ЗаписатьВJson, не?
|
|||
30
RomanYS
28.09.22
✎
23:30
|
(29) да можно и JSON, можно и в csv. Понять не могу о чем тема
|
|||
31
RomanYS
28.09.22
✎
23:33
|
можно тупо по 100к записей в РС писать в один поток. РС же будет исходно пустой и историю предыдущую хранить не нужно?
|
|||
32
H A D G E H O G s
28.09.22
✎
23:50
|
(31) В несколько быстрее
|
|||
33
RomanYS
28.09.22
✎
23:54
|
(32) раз в полгода можно и подождать 10 минут.
А параллельно кстати можно писать без отбора? |
|||
34
kortun
29.09.22
✎
00:58
|
Часто приходится писать большие объемы, обычно прямыми запросами пишем транзакциями по 10-50-100 тыс. записей, в зависимости от размера. Это самый быстрый вариант, в случае если по таблице есть итоги, пересчет идет сразу по большому количеству записей, что сокращает время расчета. Пересчеты итогов соответственно реализованы тоже прямыми запросами. Регистрация в обмен реализована аналогично прямыми запросами, но уже отдельными транзакциями. Если есть возможность разделить, то пишем в несколько потоков.
Если прямыми нет возможности, то отключаем индексы и грузим в режиме ОбменДанными.Загрузка = Истина, чтобы не было регистрации в обмен, это наиболее затратная часть. После записи уже регистрируем самостоятельно, если есть надобность. |
|||
35
H A D G E H O G s
29.09.22
✎
01:35
|
(34) В 1С нельзя грузить транзакциями более 10000 записей, линейно растет время на работу менеджера управляемых блокировок в зависимости от количества записей в транзакции. Чертовы линейные переборы, они везде
|
|||
36
Bigbro
29.09.22
✎
04:05
|
я бы и хранил во внешней SQL базе.
а если арифметика действительно тривиальная а данные все равно внешние - то какой смысл их в 1с тянуть. но если 1с все же нужна тогда грузим считаем и выгружаем обратно. |
|||
37
rphosts
29.09.22
✎
06:06
|
(11) отключаем = удаляем?
|
|||
38
rphosts
29.09.22
✎
06:11
|
(36) из-за загрузки 12 раза в год? Костыли и лисапеды
|
|||
39
Bigbro
29.09.22
✎
06:19
|
(38) наоборот, избавление от лисапедов.
зачем изобретать механизмы быстрой записи, тратить место в базе, конфиг менять возможно. если оно потом надо в 2 отчетах, которые манагер использует один раз в месяц. |
|||
40
rphosts
29.09.22
✎
06:40
|
(39) ты предлагаешь купить самолёт что-бы 1-2 раза в год летать на море... это и есть лисапед
|
|||
41
Bigbro
29.09.22
✎
07:04
|
(40) сделать микро скуль базенку из пары-тройки таблиц с тривиальной логикой = самолет? нуну))
это как раз адекватное решение которое позволит один раз его настроив забыть о нем на десятилетие. а костыли пытаться делать что надо инструментом который не предназначен. сегодня это 10млн записей завтра поменяются требования к глубине аналитики и 10 млн превратятся в 200 млн легко. мы вернемся туда же изобретать новые костыли и механизмы обхода ограничений 1с. либо добавим новую табличку в скуле и доп параметр в обработку которая с этими таблицами скуля работает - дело 10 минут. |
|||
42
mistеr
29.09.22
✎
09:00
|
К сожалению, 1С не умеет бвстро писать в свою базу. Ограничения архитектуры.
Если 1-2 раза в год, но производительность записи не критична, мо-моему. Если все же критична, то я бы писал в отдельную базу, а читал через ВИД. (16) >там элементарная арифметика Тогда и посчитать можно во внешней базе или при загрузке. |
|||
43
mistеr
29.09.22
✎
09:00
|
(42) "но" -> "то"
|
|||
44
RomanYS
29.09.22
✎
09:34
|
(42) нужно понимать где границы "быстро" и "ограничений архитектуры".
Если взять типовые периодические регистры обвешанные планами обмена, то задача ТС может уйти за эти границы. А для простого непериодического регистра замер на файловой базе в (28). Запись набора 10 млн - чуть больше минуты. Ну пусть на сервере и частями будет - 10 минут. |
|||
45
Garykom
гуру
29.09.22
✎
09:36
|
(42) Никаких ВИД!
Другие средства использовать Но да внешнее решение и не тянуть это в 1С |
|||
46
Garykom
гуру
29.09.22
✎
09:38
|
Была подобная трабла у Мани в его ГигаРазработке вроде
Короче нужные данные и/или некие "правила" из 1С наружу выкидываем и там снаружи пусть все считается А какие конкретно технологии выбрать это уже вкусовщина и знания |
|||
47
RomanYS
29.09.22
✎
09:52
|
(45) (46) а 1С тебе зачем?
|
|||
48
Garykom
гуру
29.09.22
✎
09:55
|
(47) Удобный/привычный интерфейс для юзеров
|
|||
49
Garykom
гуру
29.09.22
✎
09:56
|
(48)+ Имхо еще бы в динамический список можно было результата http запроса подсовывать и было бы супер
|
|||
50
RomanYS
29.09.22
✎
10:15
|
(49) ну так храни в базе и никаких проблем.
|
|||
51
ptiz
29.09.22
✎
10:22
|
(3) Разве НаборЗаписей долго пишет?
Если нужно именно добавить записи, то делаем в РС доп.измерение "ДопКлюч". И пишем новые записи блоками по 500 тыс. через Набор.Записать(). Для каждого набора указываем свой "ДопКлюч", чтобы они не затирали друг друга. И удалять так будет проще. |
|||
52
kortun
29.09.22
✎
10:24
|
(35) в 1С и не пишем такими транзакциями, речь шла о прямых запросах
|
|||
53
АнализДанных
29.09.22
✎
11:00
|
(13) Еще использование итогов у регистра отключи, перед началом обработки. Когда запись закончится надо будет включить. Так у тебя пересчеты не будут выполняться для каждого записанного набора, а в конце они пересчитаются одним махом.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |