|
ТЗ.Скопировать( забивает темпдб | ☑ | ||
---|---|---|---|---|
0
1Сергей
15.05.16
✎
13:16
|
Есть обработина, которая на основании некоих данных создаёт большую тучу документов. Дабы не плодить запросы в цикл было принято решение собирать данные одним запросом, а потом внутри цикла из полученных данных выбирать только необходимые строки. Всё бы ничего, но такая конструкция через несколько часов работы забила темпдб на сервере до 70 гб, после чего благополучно рухнула из-за нехватки свободного места. Подскажите, как можно избежать забивания темпдб?
ТЧ_Обороты = ПолучитьОборотыВсе(НачалоПериода, КонецПериода, Организация, Договора); // получение данных по всем документам ... Пока ВыборкаДетальныеЗаписи.Следующий() Цикл ОбработкаПрерыванияПользователя(); Документ = ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект(); //Документ.ПолучитьОбороты(); Документ.ТЧ_Обороты = ПолучитьОбороты(ТЧ_Обороты, Документ.Договор); // отбор нужных данных по одному документу Функция ПолучитьОбороты(ТЧ_Обороты, Договор) Отбор = Новый Структура("ДоговорКлюч", Договор); Строки = ТЧ_Обороты.НайтиСтроки(Отбор); Возврат ТЧ_Обороты.Скопировать(Строки); КонецФункции |
|||
1
wertyu
15.05.16
✎
13:32
|
а если порциями?
|
|||
2
МихаилМ
15.05.16
✎
13:36
|
научитесь пользоваться ТЖ или ms sql profiler.
"дабы не плодить запросы в цикл было принято решение собирать данные одним запросом, а потом внутри цикла из полученных данных выбирать только необходимые строки" - враньё. напишите 1 запрос. |
|||
3
4St
15.05.16
✎
15:42
|
(0) из приведенного кода не следует, что темпдб забивает именно копирование таблицы значений. Но даже если есть 100% уверенность в этом, то что делает вот эта конструкция:
Документ.ТЧ_Обороты = ПолучитьОбороты(ТЧ_Обороты, Документ.Договор); Что такое Документ.ТЧ_обороты??? |
|||
4
1Сергей
15.05.16
✎
15:50
|
(3) ТаблицуЗначений она возвращает, полученную запросом. Думал, это очевидно. Документ.ТЧ_Обороты - это переменная модуля документа:
Перем ТЧ_Обороты Экспорт; |
|||
5
Матиус III
15.05.16
✎
16:02
|
(0) Можно попытаться не использовать МенеджерВременныхТаблиц или не создавать временные таблицы в запросе.
|
|||
6
Матиус III
15.05.16
✎
16:04
|
Ну или удалять временные таблицы в запросе.
А какой размер у самой БД? |
|||
7
Матиус III
15.05.16
✎
16:06
|
Ну или почистить диск на котором хранится темпдб, чтобы все падало после 500 Гб.
|
|||
8
wertyu
15.05.16
✎
16:07
|
(7) проще шринкать темпдб
|
|||
9
Матиус III
15.05.16
✎
16:09
|
(8) проживет до следующего запуска обработки
|
|||
10
wertyu
15.05.16
✎
16:10
|
(9) я так понимаю это единичный случай
|
|||
11
1Сергей
15.05.16
✎
16:13
|
(10) нет
|
|||
12
1Сергей
15.05.16
✎
16:15
|
Ребята, запрос выполняется один раз, до цикла. ТемпДБ разростается при выполнении Функции ПолучитьОбороты(ТЧ_Обороты, Договор)
Там нет запроса, как видите |
|||
13
wertyu
15.05.16
✎
16:16
|
(11) тогда надо переходить на порции, возможно выгрузка во внешнюю базу и прямое подключение к внешнему источнику
|
|||
14
Матиус III
15.05.16
✎
16:17
|
Можно полный путь к файлу темпдб выложить?
|
|||
15
wertyu
15.05.16
✎
16:17
|
(12) в ПолучитьОборотыВсе это и есть, что дальше?
|
|||
16
wertyu
15.05.16
✎
16:18
|
это и есть что дальше* без запятой
|
|||
17
Матиус III
15.05.16
✎
16:19
|
темпдб - это файл сервера SQL, как я понимаю. Не может на нем сказываться работа кластера серверов 1С без обращения к СУБД.
|
|||
18
4St
15.05.16
✎
16:19
|
(4) я уточнял про левую часть.
Однако вопрос остаётся. Я один наблюдаю, что переменная ТЧ_Обороты в цикле пишется сама в себя? |
|||
19
4St
15.05.16
✎
16:20
|
И почему переменная зовется ТЧ_обороты, если это ТЗ? Похоже на наследование каких-то старых костылей
|
|||
20
wertyu
15.05.16
✎
16:22
|
разбей ТЧ_Обороты на части, и ищи не в одной таблице, а в нескольких
|
|||
21
Матиус III
15.05.16
✎
16:23
|
прием
|
|||
22
4St
15.05.16
✎
16:24
|
(19) прошу прощения,нет,не пишется.
Темп постепенно растёт или в какой-то момент? |
|||
23
wertyu
15.05.16
✎
16:26
|
(22) я так понял в цикле, можно шринкать
|
|||
24
1Сергей
15.05.16
✎
16:26
|
(19) так и есть, осталось в наследство
Я пока вижу один выход. Необходимо без всяких ТЗ делать заполнение документа при обходе запроса. Но, там слишком много и перемудрено всё. Придётся полностью переписывать модуль проведения документа. |
|||
25
wertyu
15.05.16
✎
16:29
|
(24) попробуй задание, каждые пять минут шринк
|
|||
26
wertyu
15.05.16
✎
16:30
|
мне кажется у тебя большой своп начинается
|
|||
27
1Сергей
15.05.16
✎
16:31
|
(25) Что-то мне не нравится идея чистить скуль при активной работе с базой данных
|
|||
28
1Сергей
15.05.16
✎
16:31
|
||||
29
wertyu
15.05.16
✎
16:31
|
(27) это нормально )
|
|||
30
Матиус III
15.05.16
✎
16:31
|
>> попробуй задание, каждые пять минут шринк
Парни успокойтесь, сегодня не 1 апреля. |
|||
31
1Сергей
15.05.16
✎
16:32
|
(30) +1
|
|||
32
4St
15.05.16
✎
16:33
|
(24) я бы поставил на то, что в алгоритме проведения ТЧ_обороты отправляется во временные таблицы, с чем-то тяжёлым соединяется, и по каким-то причинам не освобождает память.
Ещё можно глянуть, что происходит с этим сеансом в консоли кластера. Колонка "захвачено данных" если не пустая и с растущим значением, значит,не удаляются временные таблицы. |
|||
33
1Сергей
15.05.16
✎
16:34
|
Мне казалось, что любая ТЗ - это и есть временная таблица, создаваемая в tempdb. не?
|
|||
34
4St
15.05.16
✎
16:37
|
(33) не уверен в этом.
Ещё: попробуй явно очищать Документ.ТЧ_обороты и сам Документ, когда они не нужны. Т.е. делать Документ.ТЧ_обороты = неопределено; документ=неопределено; |
|||
35
zak555
15.05.16
✎
16:41
|
> Есть обработина, которая на основании некоих данных создаёт большую тучу документов. Дабы не плодить запросы в цикл было принято решение собирать данные одним запросом, а потом внутри цикла из полученных данных выбирать только необходимые строки.
какая сложность в написании одного запроса ? |
|||
36
1Сергей
15.05.16
✎
16:45
|
(35) Грубо говоря, при проведении документа, выполняется запрос (на самом деле несколько), который выгружается в ТЗ и эта самая ТЗ используется в нескольких местах, для получения различных данных и формировании проводок. Чтобы как-то без сильного вмешательства ускорить этот процесс, было сделано (0). Но, похоже, всё-таки придётся переписывать всю логику проведения документа :(
|
|||
37
spock
15.05.16
✎
16:46
|
(0) Открыта одна транзакция на все время выполнения алгоритма, который работает несколько часов?
|
|||
38
1Сергей
15.05.16
✎
16:47
|
(37) да
|
|||
39
1Сергей
15.05.16
✎
16:48
|
(37) несколько суток, если быть точным :)
|
|||
40
spock
15.05.16
✎
16:49
|
(38) после выяснения такой пикантной особенности, дальше советовать что-нибудь нужно?
|
|||
41
1Сергей
15.05.16
✎
16:50
|
(40) Скажи, разве проведение каждого документа не происходит в отдельной транзакции? В 7.7 было так. Со снеговиком не уверен
|
|||
42
Матиус III
15.05.16
✎
16:53
|
(41) Нет слов.
|
|||
43
spock
15.05.16
✎
16:54
|
(41) ты же только что сказал, что на все время работы алгоритма открываешь явную транзакцию о_О
|
|||
44
4St
15.05.16
✎
16:57
|
(39) лицорука....
|
|||
45
1Сергей
15.05.16
✎
16:58
|
(43) Да, вот в том-то и дело, что пробовал по всякому и пытался всё сделать в одной транзакции и порциями по 20, по 100 документов. всё-равно, быстрее всего выполнялось без использования каких-либо транзакций
|
|||
46
Матиус III
15.05.16
✎
17:00
|
(45) Между ними успевали зафиксироваться транзакии из очереди. Они, нехорошие такие, отъедали время.
|
|||
47
Матиус III
15.05.16
✎
17:02
|
(45) Вообще, при проведении документа откырвается неявная транзакция.
|
|||
48
spock
15.05.16
✎
17:03
|
"Подскажите, как можно избежать забивания темпдб?" - делать транзакции короче.
Оставаясь в этой модели без отказа от ТЗ, можно проиндексировать ТЧ_Обороты - будет быстрее. Поиски (НайтиСтроки) на больших таблицах работают медленно без индекса. |
|||
49
Матиус III
15.05.16
✎
17:03
|
Пятничная темка, 1Сергей ты сделал мой день :)
|
|||
50
4St
15.05.16
✎
17:03
|
(45) дак есть сейчас явная транзакция или нет?
|
|||
51
1Сергей
15.05.16
✎
17:03
|
(47) я про это и спрашивал в (41). И я рад, что у тебя появились-таки слова :)
|
|||
52
Матиус III
15.05.16
✎
17:07
|
Я еще с (21) сижу жду.
|
|||
53
1Сергей
15.05.16
✎
17:07
|
(50) сейчас отключил, но кмк это не влияет.
Мне админ сказал, что обработка выполняется очень долго, а память на сервере почти не жрётся. Первое что пришло на ум - делать в транзакции. Не улучшило. Пришлось переписывать логику |
|||
54
4St
15.05.16
✎
17:08
|
Код явно выполняется в толстом клиенте. Следовательно, темпдб может расти за счёт временных таблиц или результатов запросов. ЕМНИП ТаблицыЗначений лежат в оперативе, в данном случае - клиента. Транзакции увеличивают ldf самой базы, но не темпдб.
|
|||
55
spock
15.05.16
✎
17:10
|
(53) так чего хочется и что не работает?
|
|||
56
Матиус III
15.05.16
✎
17:10
|
(54) Бесполезно, уже объяснял.
|
|||
57
4St
15.05.16
✎
17:10
|
(53) правильно, это ещё один аргумент в пользу врем.таблиц и результатов запросов.
|
|||
58
Матиус III
15.05.16
✎
17:11
|
(54) хотя не это
|
|||
59
1Сергей
15.05.16
✎
17:13
|
(55) хочется ускорить обработку. Всеми доступными средствами
|
|||
60
Wern
15.05.16
✎
17:15
|
(0) не может ускорить ничего при данных условиях. Запусти замер, скорей всего он покажет 99% времени это время проведения документов. И вынесение запроса за цикл тут не поможет никак.
|
|||
61
4St
15.05.16
✎
17:17
|
(59) т.е. проблема с темпдб уже решилась?
Про ускорение - один рецепт на все времена, "замер производительности". |
|||
62
1Сергей
15.05.16
✎
17:20
|
(60) Не прав. 65% занимает выполнение запроса при провдении. Когда я выполнение запроса вынес за пределы обработки проведения, и сделал один по всем документам, с отбором строк (см(0)), обработка значительно ускорилась. Но, возникла проблема с темпдб. Правда, я не уверен, что темпдб был маленький до выполнения обработки. Просто при выполнении обработки кончилось место на сервере. И всё прервалось. Напоминаю, обработка выполняется несколько суток
|
|||
63
spock
15.05.16
✎
17:21
|
(59) Проиндексируй ТЗ. У тебя наверняка там несколько сотен тысяч строк? Вот на этом тупит 1с.
|
|||
64
1Сергей
15.05.16
✎
17:22
|
(63) если не миллионов. Хорошо. Про индексацию я как-то забыл, да
|
|||
65
4St
15.05.16
✎
17:36
|
(64) после индексации ещё раз прогони обработку с замером производительности на небольшом количестве документов. Скажем, после 1000 выйди из цикла. Может, удастся ещё что оптимизировать. Обычно когда один тормозной кусок приводишь в порядок, выползает следующий, который тоже можно причесать.
|
|||
66
Wern
15.05.16
✎
17:37
|
(64) а зачем тебе вообще эти отдельные тз для каждого документа? Может их вообще не создавать, а просто тянуть данные из исходного большого тз?
|
|||
67
4St
15.05.16
✎
17:41
|
(66) ТЗ вообще не нужна,нужен один грамотный РезультатЗапроса, но вопрос был не о том))
|
|||
68
1Сергей
15.05.16
✎
18:11
|
(67) Запрос составить не проблема. Проблема переписать весь модуль проведения документа под этот Запрос
|
|||
69
4St
15.05.16
✎
18:21
|
(68) я имел в виду немного другое. Вместо генерации одной большой ТЗ,как сейчас, можно переписать исходный запрос. На предпоследнем уровне будет Договор+Документ, а в детальных записях - уже сами строки для ТЧ_Обороты. Это вместо НайтиСтроки и необходимости держать всю ТЗ в оперативе. Минус - выборка будет лежать в темпдб до окончания обработки. Но она и сейчас там лежит, а плюсом - большая ТЗ в оперативе на клиенте.
|
|||
70
1Сергей
15.05.16
✎
18:29
|
(69) это не отменяет того, что я написал в (68) :)
Я тоже имел в виду такой запрос, без использования излишних ТЗ |
|||
71
4St
15.05.16
✎
18:33
|
(70) отменяет, т.к. из детальных записей уже получаем ТЗ, и больше ничего переделывать не надо на текущем этапе. Речь об этом.
Но если обработка будет запускаться редко, то можно пока оставить и через большую индексированную ТЗ. Напиши потом о результатах, любопытно. |
|||
72
Матиус III
15.05.16
✎
19:08
|
||||
73
1Сергей
16.05.16
✎
05:56
|
(71) а как ты предлагаешь из детальных записей собирать ТЗ? Перебором чтоли? И чем это лучше "Скопировать"? Уж, не быстрее, это точно
|
|||
74
DrZombi
гуру
16.05.16
✎
06:02
|
(0) Придется пожертвовать временем и отбирать все более детально, по каждому контрагенту, если нужно по каждому договору в отдельности :)
А так, стоит подумать об добавлении какого либо регистра для заранее подготовки нужных данных :) |
|||
75
Timon1405
16.05.16
✎
06:52
|
(18)>>Перем ТЧ_Обороты Экспорт;
1)А зачем в этом случае вообще передавать эту переменную в качестве параметра? она и так будет доступна в функции 2)Зачем вообще нужна функция? //Документ.ТЧ_Обороты = ПолучитьОбороты(ТЧ_Обороты, Документ.Договор);// отбор нужных данных по одному документу //СП //Вариант синтаксиса: Скопировать по отбору //Синтаксис: //Скопировать(<ПараметрыОтбора>, <Колонки>) Документ.ТЧ_Обороты = ТЧ_Обороты.Скопировать(Новый Структура("ДоговорКлюч", Договор)); |
|||
76
Timon1405
16.05.16
✎
07:00
|
*(75) Документ.Договор конечно
|
|||
77
1Сергей
16.05.16
✎
07:00
|
(75) Видимо, я не дочитал СП :)
Ну, сути это не меняет |
|||
78
wertyu
16.05.16
✎
07:42
|
(77) надо переделать получение данных, вернее время получения, для проведения или записи данные уже должны быть готовы
|
|||
79
wertyu
16.05.16
✎
07:42
|
время получения по оси времени*
|
|||
80
1Сергей
16.05.16
✎
07:52
|
(78) Андрюха, вот что ты сейчас имел в виду? "данные уже должны быть готовы"... проведение любого документа подразумевает сбор данных (как правило запрос) и запись данных (в регистры и прочие места)
|
|||
81
4St
16.05.16
✎
08:01
|
(73) тут куча вариантов. Перебором, скорее всего, будет медленнее, на несколько секунд в твоих условиях (гигантская ТЗ). Зато позволит не уронить процесс, когда объём памяти для выгрузки результата запроса перевалит за 2-3 ГБ.
Ещё можно выгружать все в ДеревоЗначений, и в глобальную переменную документа передавать СтрокаДереваСДоговором.Строки. В зависимости от того, что написано в модуле документа, это может и сработать. Ещё один вариант того же самого : Документ.ТЧ_Обороты = ТЧ_Обороты.НайтиСтроки(Новый Структура("ДоговорКлюч", Договор)); Т.е. передаем не новую ТЗ, а Массив строк из исходной, сэкономив на выделении памяти под каждую новую ТЗ. Но можно остановиться и на том, что сейчас, главное, таблицу проиндексировать. |
|||
82
1Сергей
16.05.16
✎
08:06
|
(81) >>Зато позволит не уронить процесс, когда объём памяти для выгрузки результата запроса перевалит за 2-3 ГБ
Проблема как раз в неэфективном использовании памяти. На сервере 16 ГБ, 12 из которых не используются. Все остальные варианты подразумевают переделывание логики проведения. Если уж её переделывать, то по правильному. Этот вариант я написал здесь и не раз |
|||
83
1Сергей
16.05.16
✎
08:07
|
ладно, тема ушла в пустой трёп. Что мне нужно было, я выяснил
|
|||
84
wertyu
16.05.16
✎
08:32
|
(80) есть короткий сбор данных, а у тебя долгий, сократи это время, кто тебе мешает наплодить дополнительных сущностей, а потом юзать их при проведении?
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |