Добрый день!
Ситуация такая: имеем Postgres 10.3, 1С 8.3.15.1830, ERP2 2.4.11.65 и при закрытии месяца, регламентным заданием в ночь, создаются временные файлы до тех пор пока не закончится все свободное место (конкретно Гигов 150 примерно за час). Ранее была похожая ситуация при расчете документа увольнения и там виновником был запрос в процедуре СоздатьВТНачисленияСотрудниковПоПоказателямПерерасчетов в модуле РасчетЗарплатыРасширенный
ВЫБРАТЬ РАЗЛИЧНЫЕ
СотрудникиПериоды.Период КАК Период,
СотрудникиПериоды.Организация КАК Организация,
СотрудникиПериоды.Сотрудник КАК Сотрудник,
СотрудникиПериоды.Начисление КАК Начисление,
Начисления.ЯвляетсяЛьготой КАК ЯвляетсяЛьготой,
СотрудникиПериоды.ИзмененныеДанные КАК ИзмененныеДанные
ПОМЕСТИТЬ ВТНачисленияСотрудниковПоПоказателямПерерасчетов
ИЗ
ВТИзмеренияДатыДляСрезаПлановыхНачислений КАК СотрудникиПериоды
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ПланВидовРасчета.Начисления КАК Начисления
ПО СотрудникиПериоды.Начисление = Начисления.Ссылка
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ПоказателиРасчетаЗарплаты КАК ПоказателиРасчетаЗарплаты
ПО (ПоказателиРасчетаЗарплаты.Ссылка = СотрудникиПериоды.ИзмененныеДанные)
ЛЕВОЕ СОЕДИНЕНИЕ ВТПлановыеНачисленияСрезПоследних КАК ПлановыеНачисления
ПО СотрудникиПериоды.Период = ПлановыеНачисления.Период
И СотрудникиПериоды.ГоловнаяОрганизация = ПлановыеНачисления.ГоловнаяОрганизация
И СотрудникиПериоды.Сотрудник = ПлановыеНачисления.Сотрудник
И СотрудникиПериоды.Начисление = ПлановыеНачисления.Начисление
И (НЕ ПоказателиРасчетаЗарплаты.ПериодическийПоказательСотрудника
ИЛИ СотрудникиПериоды.ДокументОснование = ПлановыеНачисления.ДокументОснование)
И (ПлановыеНачисления.Используется)
ГДЕ
(НЕ ПлановыеНачисления.Период ЕСТЬ NULL
ИЛИ Начисления.СпособВыполненияНачисления = ЗНАЧЕНИЕ(Перечисление.СпособыВыполненияНачислений.ПоЗначениюПоказателяПриОкончательномРасчете))
Показать
тут Данную проблему обошли тем что перестали производить расчет в документе Увольнение делается теперь отдельными документами расчет и увольнение. Кто то сталкивался с подобным, есть идеи куда копать?
С того момента вышло уже не менее десятка обновлений СУБД со значительным количеством улучшений, исправлений, а также оптимизацией выполнения запросов в различных случаях. Актуальная версия на сегодняшний день - 11.5-12.1С. Есть еще тестовая 11.5-17.1С.
проанализируйте в отладке почему временные файлы поедают диски.
вероятно...
1. так и должно быть если ваша ИБ это горячий юпитер, а не холодная луна.
2. косяки с удалением временных, понадеялись что они удаляться сами а вот и нет.
если варик 1, то только сидеть и плакать когда наступит эра стабильной работы больших данных в 1С.
если варик 2, то регистрируем грамотный результат анализа как ошибку на ИТС и сидим плачем
пока 1С не найдет жирного кролика для теста и того кто с удовольствием будет копаться в больших данных - ведь на песочной демке все работает и красиво.
если варик n, то...
Аппаратно.
1. Лучше бы сразу удвоить ОЗУ на сервере СУБД. А лучше провести анализ на самый большой объём выборки запроса и добавить ОЗУ до этого размера + запас (база же растёт).
2. Добавить дискового пространства (но лучше ОЗУ добавлять)
Программно.
1. Анализировать запросы и удалять временные таблицы, когда они уже не нужны.
2. Анализировать запросы и накладывать дополнительные ограничения, чтобы итоговые выборки были меньше по количеству записей = объёму.
3. Анализировать закрытие и вынести те блоки, которые можно выполнить отдельно заранее.
Дополнение. Забыл уточнить, база вся весит 15 гигов, с Увольнением повторялось и на файловой версии, закрытие месяца на файловой не тестировал. на сервере сейчас 80 Гигабайт ОЗУ, половину съедает 1С в рабочее время, Posgres по памяти: shared_buffers = 9GB, temp_buffers = 512MB, work_mem = 256MB, maintenance_work_mem = 1GB
До обновления Postgres планирую добраться в выходные, но меня это мало обнадеживает в связи с тем что аналогичная ситуация в документе Увольнение повторилась и на файловой версии.
1. Временные файлы создаются где? Была какая-то замута с платформой в связи с перемещением контекста через временное хранилище, которое раньше чистилось, а теперь перестало, но для "старых" алгоритмов народ постоянно кладет в хранилище измененные данные при переключении контекста , надеясь, что 1С сама почистит за ним, ан нет...
2. ОСь какая?
(8) Сервер на WinServer 2016, временные файлы создаются в каталоге базы, в логе полно записей наподобие :
INS ERT INTO pg_temp.tt139 (_Q_000_F_000TRef, _Q_000_F_000RRef, _Q_000_F_001, _Q_000_F_002RRef, _Q_000_F_003RRef, _Q_000_F_004, _Q_000_F_005, _Q_000_F_006_TYPE, _Q_000_F_006_RTRef, _Q_000_F_006_RRRef) SEL ECT DISTINCT
T1.RecorderTRef,
T1.RecorderRRef,
T1.LineNo_,
T1.Fld65221RRef,
T1.CalcKindRRef,
T1.APDateFrom_,
T1.APDateTill_,
T1.Fld65247_TYPE,
T1.Fld65247_RTRef,
T1.Fld65247_RRRef
FR OM (SEL ECT
T2._RecorderTRef AS RecorderTRef,
T2._RecorderRRef AS RecorderRRef,
T2._LineNo AS LineNo_,
T2._Fld65221RRef AS Fld65221RRef,
T2._CalcKindRRef AS CalcKindRRef,
CASE WHEN T3._APDateFrom IS NULL THEN T2._APDateFrom ELSE T3._APDateFrom END AS APDateFrom_,
CASE WHEN T3._APDateTill IS NULL THEN T2._APDateTill ELSE T3._APDateTill END AS APDateTill_,
T2._Fld65247_TYPE AS Fld65247_TYPE,
T2._Fld65247_RTRef AS Fld65247_RTRef,
T2._Fld65247_RRRef AS Fld65247_RRRef
FROM _CRg65220 T2
LEFT OUTER JOIN _CRgActP65254 T3
ON (T2._RecorderTRef = T3._RecorderTRef AND T2._RecorderRRef = T3._RecorderRRef AND T2._LineNo = T3._LineNo) AND (T3._Fld2331 = CAST(0 AS NUMERIC))
WH ERE ((T2._Fld2331 = CAST(0 AS NUMERIC))) AND ((T3._APDateFrom <> '0001-01-01 00:00:00'::timestamp OR T3._APDateFrom IS NULL) AND (T2._Fld65221RRef, T2._ActionPeriod) IN
(SELECT
T4._Q_000_F_005RRef AS Q_001_F_000RRef,
T4._Q_000_F_001 AS Q_001_F_001_
FR OM pg_temp.tt137 T4) AND T2._CalcKindRRef IN
(SELE CT
T5._Q_000_F_000RRef AS Q_001_F_000RRef
FR OM pg_temp.tt138 T5) AND (T2._Fld65224_TYPE = '\\001'::bytea AND T2._Fld65224_RTRef = '\\000\\000\\000\\000'::bytea AND T2._Fld65224_RRRef = '\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000'::bytea))) T1
после очередного запроса уже сообщается что нет свободного места. Получается что Postgres честно отрабатывает то что ему шлет 1С, пока не упирается в физические приделы.
(21) Обычная пустая дата. В Постгресе нет тех ограничений, которые есть в MS SQL, в котором для разрешения пустых дат есть смещение этих дат (там пустая дата - это "2001-01-01", и все даты смещены на 2к лет, т.е. 4020-й год - это 2020й).
На PostgreSQL 11.5-12.1C, в ЗКГУ 3.1.10.309, наличие "обычной пустой даты" в данных сотрудника(дата начала действия документа) стало приводить к ошибке СУБД при выполнении рег. задания "обновление индекса ППД"(точный текст ошибки не помню).
На более ранних версиях СУБД и конфигурации "никогда такого не было".
Полечилось установкой даты. Так что, как знать...
(23) индекс ППД, имхо, не в СУБД хранится, а в отдельных файлах 1С. То, что на пустую дату ругается, вполне могло быть следствием ошибки платформы, когда неуглядели разработчики и подшаманили чтото с индексами своими.
Конечно файл ТЖ есть, а этот лог от Postgres, и судя по логу во временные таблицы перегружаются данные движения по регистру бухучата (всех таблиц), собственно как только он дошел до регистра ЗаработанныеПраваНаОтпуск то уже данные от него не выгрузились во временную таблицу, закончилось место.
(11) тогда вопросы:
1. В каталоге какой базы? В каталоге кластера? Короче, нужно понять, что за каталог.
2. Смысла создавать файлы с запросами у постгреса никакого нет, если не было установлено какое-либо расширение для этого (может быть кто-то смотрел, какие запросы выполняет сервер - каакой-нить "эксперт", который забыл потом это отключить). Смотрите тут: http://www.dtulyakov.ru/postgresql_log.html
(14) Логи уже настроены, только не все подряд. Углубился в логи и сопоставив их с метаданными 1С получается что 1С создает кучу временных таблиц, последние пару дней происходит "сжирание" оперативки.
1С всегда "создает кучу временных таблиц". Так юных падаванов учат программировать на 1С - это неизбежное зло, которое лучше варианта, когда эти юные падаваны будут делать это все на подзапросах без фильтрации.
Если логи - указанные файлы - создаются в каталоге кластера Postgres, то чтобы они перестали создаваться, стоит прибить эту настройку. Или это неочевидно?
(19) А что не за такие настройки, если ограничивать временные файлы то просто будет откидываться транзакция которой не повезло и на ней закончилось дозволенное место.
Поглядите, может, это особенность работы Postgres и 1С? Они намного хуже дружат друг с другом, чем MS SQL и 1С.
Помню, Postgres и таблицы крашил 1С-у, и неверно запросы исполнял в базе. Ну что поделать - бесплатный же....