|
Создание 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 Мб.
Так что если нужно быстрее вырубай ЖР. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |