Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Вход | Зарегистрироваться )



> PostgreSQL и 1С , Тормозит запрос          
Veizdem Подменю пользователя
сообщение 15.01.15, 11:02
Сообщение #1

Говорящий
***
Группа: Пользователи
Сообщений: 96
Из: Кривой Рог, Украина
Спасибо сказали: 10 раз
Рейтинг: 0

Доброе утро всем. Столкнулся с проблемой в запросах. Конфигурация с 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

Помогите разобраться хотя бы куда копать.


Signature
В моих жилах текут нолики и единички...

andr_andrey Подменю пользователя
сообщение 15.01.15, 13:40
Сообщение #2

Почти ветеран
Иконка группы
Группа: Местный
Сообщений: 623
Спасибо сказали: 166 раз
Рейтинг: 130.8

Если Вы нашли запрос, который действительно тормозит, тогда смотрите планы запросов и стоимости операций.


Signature
#define private public
enum BOOL { FALSE, TRUE, FILENOTFOUND } is made my day

Veizdem Подменю пользователя
сообщение 15.01.15, 13:55
Сообщение #3

Говорящий
***
Группа: Пользователи
Сообщений: 96
Из: Кривой Рог, Украина
Спасибо сказали: 10 раз
Рейтинг: 0

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


Дело в том, что я с PostgreSQL знаком без году неделю... Можно немного подробнее? Это в postgresql.conf надо смотреть?


Signature
В моих жилах текут нолики и единички...

Veizdem Подменю пользователя
сообщение 03.06.15, 7:13
Сообщение #4

Говорящий
***
Группа: Пользователи
Сообщений: 96
Из: Кривой Рог, Украина
Спасибо сказали: 10 раз
Рейтинг: 0

Итак, нашел кое-какое решение для устранения этой печали, поставил PostgreSQL 9.3 с офсайта 1С. Теперь заполнение документа выполняется более-менее быстро (15-20 сек), но возникает другая беда. При работе двух и более пользователей все ждут пока кто-то один работает с уведомлением (через htop) LOCK TABLE waiting. Я так полагаю стоит блокировка всей таблицы сразу, а как можно по умолчанию указать блокировку только строк?


Signature
В моих жилах текут нолики и единички...

Veizdem Подменю пользователя
сообщение 03.06.15, 8:25
Сообщение #5

Говорящий
***
Группа: Пользователи
Сообщений: 96
Из: Кривой Рог, Украина
Спасибо сказали: 10 раз
Рейтинг: 0

Нашел решение и этой проблеме в этой [необходимо зарегистрироваться для просмотра ссылки]. Поставил управляемую блокировку в свойствах конфигурации и LOCK TABLE waiting исчез.


Signature
В моих жилах текут нолики и единички...

Acid Подменю пользователя
сообщение 03.06.15, 8:25
Сообщение #6

Про1С-ник
Иконка группы
За заслуги на форуме в 2010 году
Группа: Местный
Сообщений: 2104
Из: Занзибар
Спасибо сказали: 377 раз
Рейтинг: 260.7

блокировка строк невозможна. Блокируется конкретная таблица перед записью.
Я скажу так - если запрос нормально отрабатывал на 8.2, то это проблема релиза 8.3. Корявость 1С никто не отменял.
Варианты решения следующие :
1. Отладить запрос в менеджере постгрю. Когда заработает, переделать запрос в 1С.
2. Если не поможет пункт 1, тогда переписать данную функцию на прямой запрос к БД, вставив уже готовый код отлаженого запроса.
3. Вернуть пользователя, который занимается расчетом ЗП на версию 8.2


Signature

Документируйте Код! мать вашу...


Petre Подменю пользователя
сообщение 03.06.15, 8:29
Сообщение #7

Живет на форуме
Иконка группы
Группа: Местный
Сообщений: 2902
Из: Київ, Україна
Спасибо сказали: 1144 раз
Рейтинг: 1225

В PostgreSQL блокировка на уровне записей возможна в управляемом режиме блокировок данных.


Signature
Допрацьовую:
- "Бухгалтерія для України 2.1";
- "Альфа-Авто: Автосалон+Автосервіс+Автозапчастини, українська версія".

Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


Ответить Новая тема
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 28.03.24, 20:26
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!