Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: PostgreSQL и 1С
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Администратору 1С / Системному администратору / Администратору баз данных > Администрирование и настройка серверов баз данных
Veizdem
Доброе утро всем. Столкнулся с проблемой в запросах. Конфигурация с 8.2 перекочевала на 8.3, запускаем, вроде все работает, но в один прекрасный момент начинает жутко тормозить (процессор на 100%, все ждут пока завершится 1 запрос). Ковыряния в логах, конфигах и кодах показало следующий результат:
Со стороны PostgreSQL жутко тормозит такой запрос:
DELETE FROM _CRgActP435
    WHERE EXISTS(
    SELECT 1
    FROM (SELECT 1 AS SDBL_DUMMY) SDBL_DUAL
    INNER JOIN (SELECT
    T4._RecorderTRef AS RecorderTRef,
    T4._RecorderRRef AS RecorderRRef,
    T4._LineNo AS LineNo_
    FROM _CRgActP435 T4
    INNER JOIN tt5 T5
    ON T4._RecorderTRef = T5._RecorderTRef AND T4._RecorderRRef = T5._RecorderRRef AND T4._LineNo = T5._LineNo LIMIT 100000) T3
    ON _CRgActP435._RecorderTRef = T3.RecorderTRef AND _CRgActP435._RecorderRRef = T3.RecorderRRef AND _CRgActP435._LineNo = T3.LineNo_
    WHERE _CRgActP435._RecorderTRef = T3.RecorderTRef AND _CRgActP435._RecorderRRef = T3.RecorderRRef AND _CRgActP435._LineNo = T3.LineNo_);

Что в 1С (согласно средства профилирования) отражается как такой вот код, конкретно - строка "НаборЗаписей.Записать(Истина, Ложь);":
Функция УчестьВытеснениеРасчетов(Конт, тбСостав) Экспорт 
    НаборЗаписей = РегистрыРасчета.РасчетЗарплаты.СоздатьНаборЗаписей();
    НаборЗаписей.Загрузить(тбСостав);
    // Получим дополнительные записи, имеющие признак сторно, которые необходимо добавить  
    // в текущий набор для того, чтобы в результате сохранения получился максимальный  
    // фактический период действия
    
    Конт.Записать();
    НаборЗаписей.Отбор.Регистратор.Значение = Конт.Ссылка;
    НаборЗаписей.Записать(Истина, Ложь);
    ТаблицаСторноЗаписей = НаборЗаписей.ПолучитьДополнение();
    
    Для каждого Строка Из ТаблицаСторноЗаписей Цикл
        
        // Сторно-запись движений
        Движение = НаборЗаписей.Добавить();
        
        // Свойства
        Движение.ПериодРегистрации              = Строка.ПериодРегистрацииСторно;
        Движение.ПериодДействияНачало           = Строка.ПериодДействияНачалоСторно;
        Движение.ПериодДействияКонец                = Строка.ПериодДействияКонецСторно;
        Движение.БазовыйПериодНачало            = Строка.БазовыйПериодНачало;
        Движение.БазовыйПериодКонец                 = Строка.БазовыйПериодКонец;
        Движение.ВидРасчета                        = Строка.ВидРасчета;
        Движение.Сторно                            = Истина;
        
        // Измерения
        Движение.ФизЛицо                        = Строка.ФизЛицо;
        Движение.Приказ                            = Строка.Приказ;
        Движение.РУ                                = Строка.РУ;
        
        // Ресурсы
        
        // Реквизиты
        Движение.ГрафикРаботы                    = Строка.ГрафикРаботы;
        Движение.Ставка                          = Строка.Ставка;
        Движение.ВидУчетаВремени                  = Строка.ВидУчетаВремени;
        Движение.Подразделение                    = Строка.Подразделение;
        Движение.Должность                        = Строка.Должность;
        Движение.ЗанимаемыхСтавок                = Строка.ЗанимаемыхСтавок;
        Движение.НормаДнейЗаМесяц                = Строка.НормаДнейЗаМесяц;
        Движение.НормаЧасовЗаМесяц                = Строка.НормаЧасовЗаМесяц;
        Движение.СпособОтраженияВБухучете        = Строка.СпособОтраженияВБухучете;
        Движение.ЗаменаФизЛицо                    = Строка.ЗаменаФизЛицо;
        Движение.ЗаменаВидРасчета                = Строка.ЗаменаВидРасчета;
        Движение.ЗаменаПриказ                    = Строка.ЗаменаПриказ;
        Движение.ЗаменаЗанимаемыхСтавок            = Строка.ЗаменаЗанимаемыхСтавок;
        Движение.БазаРасчета                    = Строка.БазаРасчета;
        Движение.БазаРасчетаВсего                = Строка.БазаРасчетаВсего;
        Движение.ДополнительныеДанные           = Строка.ДополнительныеДанные;
        Движение.ДокументОснование                = Строка.ДокументОснование;
        Движение.ПериодРасчетаСреднегоЗаработкаНачало        = Строка.ПериодРасчетаСреднегоЗаработкаНачало;
        Движение.ПериодРасчетаСреднегоЗаработкаКонец        = Строка.ПериодРасчетаСреднегоЗаработкаКонец;
        Движение.ПорогПоВзносам                    = Строка.ПорогПоВзносам;
        Движение.ПериодНачалаРасчетаСредней        = Строка.ПериодНачалаРасчетаСредней;
    КонецЦикла;
    
    НаборЗаписей.Записать(Истина, Ложь);
    Возврат НаборЗаписей;
КонецФункции

Тестовые компьютеры:
Сервер, где установлена PostgreSQL - два ксеона по 4 ядра 2.5 ГГц, 16 гиг оперативки, ssd 240 гб, система ubuntu server 14.04 amd64
Сервер, где установлен 1С - два ксеона по 4 ядра 2.5 ГГц, 8 гиг оперативки, RAID0 HDD 2 штуки, система debian7 server x86 (так же пробовал amd64)
Клиент, где запускается 1с - целерон 2 ядра 2.8 ГГц, 4 гига оперативки, система ubuntu 14.04 x86 (так же пробовал amd64)

Конфиг необходимо зарегистрироваться для просмотра ссылки

С такими параметрами, самое простое - заполнение документа "начисление зарплаты" по 1 сотруднику - выполняется 471 секунду! Этот же запрос на PostgreSQL 9.1 и 1С 8.2 под тем же линуксом выполнялс почти мгновенно (до 1 секунды).
Текущие версии:
1С - 8.3.5.1231
PostgreSQL - 9.2.4

Помогите разобраться хотя бы куда копать.
andr_andrey
Если Вы нашли запрос, который действительно тормозит, тогда смотрите планы запросов и стоимости операций.
Veizdem
Цитата(andr_andrey @ 15.01.15, 13:40) необходимо зарегистрироваться для просмотра ссылки
Если Вы нашли запрос, который действительно тормозит, тогда смотрите планы запросов и стоимости операций.


Дело в том, что я с PostgreSQL знаком без году неделю... Можно немного подробнее? Это в postgresql.conf надо смотреть?
Veizdem
Итак, нашел кое-какое решение для устранения этой печали, поставил PostgreSQL 9.3 с офсайта 1С. Теперь заполнение документа выполняется более-менее быстро (15-20 сек), но возникает другая беда. При работе двух и более пользователей все ждут пока кто-то один работает с уведомлением (через htop) LOCK TABLE waiting. Я так полагаю стоит блокировка всей таблицы сразу, а как можно по умолчанию указать блокировку только строк?
Veizdem
Нашел решение и этой проблеме в этой необходимо зарегистрироваться для просмотра ссылки. Поставил управляемую блокировку в свойствах конфигурации и LOCK TABLE waiting исчез.
Acid
блокировка строк невозможна. Блокируется конкретная таблица перед записью.
Я скажу так - если запрос нормально отрабатывал на 8.2, то это проблема релиза 8.3. Корявость 1С никто не отменял.
Варианты решения следующие :
1. Отладить запрос в менеджере постгрю. Когда заработает, переделать запрос в 1С.
2. Если не поможет пункт 1, тогда переписать данную функцию на прямой запрос к БД, вставив уже готовый код отлаженого запроса.
3. Вернуть пользователя, который занимается расчетом ЗП на версию 8.2
Petre
В PostgreSQL блокировка на уровне записей возможна в управляемом режиме блокировок данных.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.