Имя: Пароль:
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 Мб.
Так что если нужно быстрее вырубай ЖР.
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn