За последние 24 часа нас посетили 17484 программиста и 987 роботов. Сейчас ищут 447 программистов ...

Ошибка canceling statement due to statement timeout

Тема в разделе "PostgreSQL", создана пользователем polin11, 15 июн 2022.

Метки:
  1. polin11

    polin11 Активный пользователь

    С нами с:
    22 янв 2019
    Сообщения:
    20
    Симпатии:
    0
    Использую PGSQL.
    Есть таблица записей ~ 1000 000 записей
    Код (Text):
    1. CRE ATE   TABLE forms (
    2.     id serial PRIMARY KEY,
    3.     account INT NOT NULL,
    4.     author text,
    5.     salary INT NOT NULL
    6. );
    7. INS ERT INTO  forms(account, author, salary) VALUES
    8. (1100889, 'Иванов', 30),
    9. (1100889, 'Петров', 40),
    10. (4443, 'Сидоров', 40),
    11. (1100889, 'Сергеев', 50)
    При авторизации пользователя в аккаунт идет пересчет поля salary в целом по аккаунту для всех пользователей
    Код (Text):
    1. UPD ATE forms
    2. SET salary = (SEL ECT....)
    3. WHERE account = 1100889
    Перед обновление делаю блокировку по аккаунту с таймаутом 5 секунд.
    Код (Text):
    1. BEGIN ISOLATION LEVEL READ COMMITTED READ WRITE;
    2. SE T LOCAL statement_timeout = '5000ms';
    3. SELECT PG_ADVISORY_XACT_LOCK("lock_id") FR OM (
    4.                 SELECT UNNEST('{1100889}'::BIGINT[]) AS "lock_id"
    5.             ) LocksId    
    6. RESET statement_timeout
    В процессе обновления могут выполнятся обновления по конкретному сотруднику из этого аккаунта, я также ставлю
    блокировку по аккаунту.
    Код (Text):
    1. UPDATE forms
    2. SE T salary = 100
    3. WHERE account = 1100889 AND author = 'Иванов'
    Когда общий запрос обновления по аккаунту (большой аккаунт) выполняется долго > 5 секунд,
    то падает ошибка на второй запрос обновления
    по сотруднику ошибка canceling statement due to statement timeout.
    Понятно, что оптимальное решение ускорить запрос расчета целиком по аккаунту.

    Плохо разбираюсь в тебе блокировок в PGSQL, просьба подсказать как исправить ситуацию с точки зрения
    блокировок, в какую сторону смотреть?
     
  2. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.547
    Симпатии:
    1.753
    А индексы есть? Хотя, вы зачем-то на имя ставите text, лишая себя же возможности туда индекс поставить... Вообще, ориентироваться на такое поле - такое себе. У вас может быть несколько Ивановых