Имя: Пароль:
1C
1С v8
Создание 20 тыс. элементов справочника долго происходит
0 larx83
 
02.05.14
19:56
Создаю 20 тысяч элементов справочника.
Процесс занимает около 4 минут. Можно ускорить?
&НаСервере
Процедура СоздатьЭлементыСправочника(МассивЛС)
    Для Каждого ЛС из МассивЛС Цикл
        Если ЛС[0] = Неопределено Тогда
            Продолжить;
        КонецЕсли;
        Элемент = Справочники.СписокЛС.СоздатьЭлемент();
        Элемент.Наименование = ЛС[0];
        Элемент.НомерПП = ЛС[0];
        Элемент.ЛС = ЛС[1];
        Элемент.Адрес = ЛС[2];
        Элемент.Площадь = ЛС[3];
        Элемент.Проживающих = ЛС[4];
        Элемент.ЗадолжностьНач = ЛС[5];
        Элемент.Начислено = ЛС[6];
        Элемент.Оплачено = ЛС[8];
        Элемент.ЗадолженностьКон = ЛС[9];
        Элемент.СрокЗадолж = ЛС[10];
        Элемент.Записать();
    КонецЦикла;
КонецПроцедуры
1 ДенисЧ
 
02.05.14
19:57
Файловая? В транзакции попробуй
2 larx83
 
02.05.14
19:57
Файловая..
3 larx83
 
02.05.14
19:57
А как в транзакции??
4 iamnub
 
02.05.14
19:59
Вот вам пажалста - в языке без типизации - что "скрывается" за .адрес? Может строка, а может ссылочный тип, за которым надо лезть в базу?
5 ДенисЧ
 
02.05.14
19:59
НачатьТранзакцию() / ЗафкисироватьТранзакцию()
И счётчик, сколько элементов в одной транзакции.
Значением счётчика - поиграться, сколько будет оптимально, это сильно зависит от твоей базы
6 ДенисЧ
 
02.05.14
20:00
(4) Зачем за ним лезть?
7 larx83
 
02.05.14
20:00
(1) Понял. Спасибо, БОльшое!
8 ДенисЧ
 
02.05.14
20:01
(7) Ты сначала попробуй, сделай...
А спасибать будешь, когда работать нормально будет...
9 larx83
 
02.05.14
20:01
Щас попробую..
10 larx83
 
02.05.14
20:03
А удалять быстро тоже так же??
11 zulu_mix
 
02.05.14
20:05
практика показывает, что серверная быстрее всех отрабатывает на 10к элементах. файловая хз
12 larx83
 
02.05.14
20:06
(11) Спасибо!
13 КонецЦикла
 
02.05.14
20:37
(11) А если в каждом элементе 100500 реквизитов? И от сервера зависит...
14 Torquader
 
02.05.14
21:27
Насколько я помню, в стандартных конфах или 100 или 1000 элементов в транзакции, не больше.
15 vi0
 
02.05.14
21:33
зачем транзакция?
16 Torquader
 
02.05.14
21:33
(15) Чтобы одна блокировка, а не на каждый элемент заново.
17 vi0
 
02.05.14
21:34
(0) как часто ты эти элементы создаешь?
18 ДенисЧ
 
02.05.14
21:34
(16) в 77 файловой был ещё прикол, что всё в транзакции держалось в памяти и только при коммите писалось в файлы...
19 vi0
 
02.05.14
21:34
(16) что за одна блокировка? что-то новое
можно немного теории
20 larx83
 
02.05.14
21:35
(17) - раз 5 в день.
21 Torquader
 
02.05.14
21:36
(19) Каждое обращение в базу открывает свою транзакцию, если мы явно открыли транзакцию, то следующие обращения в базу идут без необходимости открытия транзакции (и коммита изменений после каждой записи).
22 larx83
 
02.05.14
21:37
Проверил. В транзакции работает быстрее раза в два.
23 vi0
 
02.05.14
21:37
(20) 100т. элементов в день?
зачем такое?
24 larx83
 
02.05.14
21:39
(23) тестируем, пробуем всякие вещи.
25 vi0
 
02.05.14
21:41
(21) про блокировки ты не сказал
26 vi0
 
02.05.14
21:42
у транзакции другое назначение
общая рекомендация - делать транзакции как можно быстрее, как можно меньше элементов изменять в одной транзакции
в данном случае тр-я не нужна
27 larx83
 
02.05.14
21:43
(26) а что нужно тогда?
28 vi0
 
02.05.14
21:44
(27) расскажи, что ты делаешь такого, создавая 100т. элементов  в день?
29 vi0
 
02.05.14
21:45
(18) в 77 там да, летало все
30 larx83
 
02.05.14
21:45
(28) Просто экспериментирую. Учусь.
31 vi0
 
02.05.14
21:49
(30) если пример из головы и не имеет отношения к реальной ситуации, то тут сложно сказать 4 минуты быстро это или медленно
вот если бы тебе заказчик сказал - меня это не устраивает, мне нужно не 4 минуты, а 2, тогда можно было думать
32 Torquader
 
02.05.14
21:52
(25) Так блокировки тоже устанавливаются в процессе работы транзакции, а снимаются не после записи, а после подтверждения транзакции.
33 larx83
 
02.05.14
21:53
Я предполагал, есть более быстрый метод. Известный, который не надо выдумывать. Транзакции кстати мне помогли. В 2 раза быстрее примерно работает.
34 larx83
 
02.05.14
21:54
(32) Вроде как да.
35 larx83
 
02.05.14
21:54
На то они и транзакции, чтобы установить блокировки.
36 vi0
 
02.05.14
21:55
(33) мне кажется, в твоем случае нужно не вопрос скорости решать, а начать с самой задачи
вот ты пишешь, что учишься
но какую задачу ты решаешь?
37 vi0
 
02.05.14
21:58
(32) не вижу связи со скоростью записи и с тем, что ты сказал в (15)
38 vi0
 
02.05.14
21:58
в (16)
39 Torquader
 
02.05.14
22:07
(38) У вас или каждый элемент блокируется, открывается транзакция, производится запись, подтверждается транзакция и разблокируется элемент.
В транзакции, два первых действия - в начале транзакции, а два последних - в конце.
40 vi0
 
02.05.14
22:15
(39) соглашусь, что может быть прирост скорости засчет меньшего числа коммитов, но не вижу, что блокировок становится меньше или больше
и соглашусь, что может быть в особых ситуациях стоит писать пачками, но тут пока неясно
41 Torquader
 
02.05.14
22:17
(40) Блокировок становится как раз больше, так как они не отпускаются, а вот COMMIT - только один.
42 vi0
 
02.05.14
22:28
(41) я к тому, что общее число блокировок не меняется
при большой транзакции они удерживаются до ее конца, но не вижу причин, чтобы именно это уменьшало время записи
43 Torquader
 
02.05.14
22:32
(42) В sql-варианте время тратится на открытие и закрытие транзакции, а в файловом - блокируется вся таблица - остальные попытки записи уже не требуют никаких блокировок - именно из-за этого на файловой базе будет прирост скорости больше, чем на SQL.
44 vi0
 
02.05.14
22:37
(43) файловая возможно
тогда тем более не надо так делать - если блокируется вся таблица
45 Torquader
 
02.05.14
22:38
(44) Лучше заблокировать один раз на всю транзакцию, чем каждый раз на каждую запись.
46 vi0
 
02.05.14
22:40
(45) я говорю, нужно понять задачу
неясно, что у него там за справочник, кто там еще пишет
тут можно много размышлять
47 Torquader
 
02.05.14
22:42
(46) Если база тестовая - то пишет в один поток - так что - блокировка всей таблицы ничего страшного не принесёт, а скорость увеличит сильно.
48 vi0
 
02.05.14
22:43
(47) тебе так важно быть правым, не поняв задачи?)
49 Torquader
 
02.05.14
22:45
(48) Я говорю, что транзакция обычно ускоряет работу - а прав я или нет - автор проверит сам, если не верит.
Просто, если два процесса одновременно будут создавать элементы (а такая реализация тоже имеет право на жизнь), то транзакция, наоборот, навредит.
50 vi0
 
02.05.14
22:53
(49) ну вот оговорку сделал, уже шаг вперед)
51 rsv
 
02.05.14
22:56
(0)Потомуштааа в 1С нет DML .  Доступен только  Select
52 rsv
 
02.05.14
22:59
и кроме как insert  в 20 0000 цикле вам ничего не доступно  для справочника
53 Torquader
 
02.05.14
23:00
(51) При перестроении конфигурации не только SELECT работает, а вот при работе - поменять структуру объекта нельзя - просто - если бы можно было, то это была бы уже не 1С.
(50) Я, например, до конца не знаю, что происходит внутри SQL-сервера, и думаю, что очень мало людей это знают до конца.
54 Torquader
 
02.05.14
23:00
(52) Ты ещё скажи, что хранимку написать, чтобы она всё сделала - мечтать не вредно.
55 rsv
 
02.05.14
23:03
(53) вызывается 20 000 insert....  я же написал. Для справочника это единтсвенный путь записи. Новый элемент - новая команда вставки
56 rsv
 
02.05.14
23:03
и причем здесь хранимки....
57 rsv
 
02.05.14
23:05
и причем здесь перестроение конфы ... :)
58 Torquader
 
02.05.14
23:07
(56) Ну, можно одну "хранимку", которая внутри сделает 20000 insert-ов, но это будет внутри сервера выполняться.
59 romix
 
02.05.14
23:37
НачатьТранзакцию
ЗафиксироватьТранзакцию
60 Torquader
 
02.05.14
23:40
(57) Хотя, некоторые SQL-сервера поддерживают multi-insert, но один insert на 20 тыс.записей - это будет выглядеть очень интересно.
61 ДенисЧ
 
02.05.14
23:41
(60) bulk insert
62 Torquader
 
02.05.14
23:42
(61) Ну, там же отката транзакции нет ?
63 ДенисЧ
 
02.05.14
23:44
(62) мммм... Только пачкой. Или всё, или ничего
64 КонецЦикла
 
03.05.14
00:04
(60) Да фигня. Вставка куска 20 тыс. из одной таблицы в другую, таким еще на 2000 баловались. Все это быстро делается.
65 iamnub
 
03.05.14
03:11
(6)
Г-н 1С-ник не знает, что такое lazy loading? У него "как всегда" всё за-бес-плат-на?
66 vi0
 
03.05.14
08:35
(65) а можно все таки ответ на вопрос из (6)
зачем за ссылочным типом лезть в базу?
67 Мимохожий Однако
 
03.05.14
09:12
(36)У него одна задача - поэкспериментировать )) "раз 5 в день".
68 ДенисЧ
 
03.05.14
10:32
(65) Г-н 1С-ник знает.
Но совершенно в душе не ***т, причём тут это в данном случае
69 Сниф
 
03.05.14
12:11
Можно фунцайку набросать для вычисления оптимального количества элементов на транзакцию.Например, начали со 100 элементов на транзакцию - померяли время. С шагом 50, например, увеличиваем количество элементов и меряем. Стало хуже - уменьшаем количество элементов.
70 Torquader
 
03.05.14
12:46
(69) Ну, начинаем со 100 и плюс 100 пока не стало медленнее, а потом дихотомией до нужного значения - только может оказаться, что интервалы занимают различное время работы.
71 MadHead
 
03.05.14
14:21
может попробовать хранить данные в РС и записывать данные наборами. Побыстрее должно шуршать.
72 Torquader
 
03.05.14
14:52
(71) В принципе, большой разницы не должно быть - только время на создание ГУИД-ов не нужно тратить.
73 hhhh
 
03.05.14
15:19
(66) а откуда вы возьмете ссылку? Из базы
74 vi0
 
03.05.14
15:22
(73) для программного кода в (0) какая разница какого типа элементы массива? вы хотите сказать, что при использовании ссылки будет дополнительное обращение к серверу?
75 ДенисЧ
 
03.05.14
15:29
(73) ссылка УЖЕ есть.
76 hhhh
 
03.05.14
15:31
(74) вы не поняли, ссылки вообще нет. И взять ее неоткуда. Только в базе искать. Например, по наименованию.
77 ДенисЧ
 
03.05.14
15:33
(76) Это на потолке написано?
78 MadHead
 
03.05.14
15:47
(72) Я подразумевал, что запись пройдет одним запросов вместо 20тыс запросов
79 Torquader
 
03.05.14
15:58
(78) Тогда вообще лучше табличную часть справочника - чтобы и чтение тоже за один присест шло ^_^
80 ILM
 
гуру
04.05.14
09:56
Параллельно в фоновых задачах. сделай регистр, а потом фоновыми задачами создавай элементы частями.
81 ILM
 
гуру
04.05.14
09:57
О, в (71) уже говорили
82 Эмбеддер
 
04.05.14
10:00
(14) логично, много не надо. 1 или 100 элементов даст прирост в скорости, а 100 или 10000 разница будет незаметна
83 vi0
 
04.05.14
10:06
(14) а можно поподробнее где это в "стандартных конфах"?
что за операция?
84 hhhh
 
04.05.14
10:28
(83) ну, самая главная обработка

УниверсальныйОбменДаннымиXML

которая используется везде и всюду.
85 ProProg
 
04.05.14
11:42
20 000 за 4 минуты??? на файловой? да ты летаешь.
86 Эмбеддер
 
04.05.14
11:45
(85) файловая работает медленнее SQL?
87 MadHead
 
04.05.14
14:27
(85) По моему опыту маленькая 1-2 гб база в файловой на запись работает существенно быстрее серверной на одинаковом железе
88 Web00001
 
04.05.14
14:56
(87)так и есть, неоднократно уже обсасывали, статья даже есть по этому поводу http://infostart.ru/public/174086/ можно все не читать, а почитать последний абзац, тот который 4.
89 МоеИмя
 
04.05.14
16:01
В пустой(1 спр) базе, просто создать и записать элемент.
20 тыс. элементов 32 сек. х.з. быстро это или медленно.
90 МоеИмя
 
04.05.14
16:01
+(89) файло
91 МоеИмя
 
04.05.14
16:04
запустил мульйон ща скажу сколько времени.
92 МоеИмя
 
04.05.14
16:37
+(91) 1 млн. эл. 25 мин. 14 сек.
93 МоеИмя
 
04.05.14
16:42
Но по факту думаю что в больше половине времени это регистрация события в ЖР если его отключить полностью думаю прирост будет 50%. База весит 190 мб. ЖР весит 300 Мб.
Так что если нужно быстрее вырубай ЖР.
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.