Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.06.2022, 16:04   #1
polin11
Форумчанин
 
Регистрация: 07.06.2015
Сообщений: 164
По умолчанию Ошибка canceling statement due to statement timeout

Использую PGSQL.
Есть таблица записей ~ 1000 000 записей


Код:
CREATE TABLE forms (
    id serial PRIMARY KEY,
    account INT NOT NULL,
    author text,
    salary INT NOT NULL
);
INSERT INTO  forms(account, author, salary) VALUES 
(1100889, 'Иванов', 30),
(1100889, 'Петров', 40),
(4443, 'Сидоров', 40),
(1100889, 'Сергеев', 50)
При авторизации пользователя в аккаунт идет пересчет поля salary в целом по аккаунту для всех пользователей
Код:
UPDATE forms
SET salary = (SELECT....)
WHERE account = 1100889
Перед обновление делаю блокировку по аккаунту с таймаутом 5 секунд.

Код:
BEGIN ISOLATION LEVEL READ COMMITTED READ WRITE;
SET LOCAL statement_timeout = '5000ms'; 
SELECT PG_ADVISORY_XACT_LOCK("lock_id") FROM (
                SELECT UNNEST('{1100889}'::BIGINT[]) AS "lock_id"
            ) LocksId      
RESET statement_timeout
В процессе обновления могут выполнятся обновления по конкретному сотруднику из этого аккаунта, я также ставлю
блокировку по аккаунту.

Код:
UPDATE forms
SET salary = 100
WHERE account = 1100889 AND author = 'Иванов'
Когда общий запрос обновления по аккаунту (большой аккаунт) выполняется долго > 5 секунд,
то падает ошибка на второй запрос обновления
по сотруднику ошибка canceling statement due to statement timeout.
Понятно, что оптимальное решение ускорить запрос расчета целиком по аккаунту.

Плохо разбираюсь в тебе блокировок в PGSQL, просьба подсказать как исправить ситуацию с точки зрения
блокировок, в какую сторону смотреть?
polin11 вне форума Ответить с цитированием
Старый 05.06.2022, 16:58   #2
Valick
Форумчанин
 
Регистрация: 27.04.2022
Сообщений: 492
По умолчанию

Запрос UPDATE выполняется в цикле? Сколько итераций? Поле account под индексом?

Последний раз редактировалось Valick; 05.06.2022 в 17:18.
Valick вне форума Ответить с цитированием
Старый 06.06.2022, 13:40   #3
polin11
Форумчанин
 
Регистрация: 07.06.2015
Сообщений: 164
По умолчанию

Цитата:
Сообщение от Valick Посмотреть сообщение
Запрос UPDATE выполняется в цикле? Сколько итераций? Поле account под индексом?
Запрос не в цикле, поле account есть в индексе.
Вопрос ускорения запроса пока не хочу рассматривать.
Хотелось бы понять про блокировки, вообще можно ли обойтись здесь без них
polin11 вне форума Ответить с цитированием
Старый 06.06.2022, 15:50   #4
Valick
Форумчанин
 
Регистрация: 27.04.2022
Сообщений: 492
По умолчанию

Вы хотите сказать, что единственный запрос
Код:
UPDATE forms
SET salary = (SELECT....)
WHERE account = 1100889
выполняется дольше 5 секунд?
Valick вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка. Statement expected but 'PROCEDURE' found Merroto Общие вопросы Delphi 5 03.03.2013 23:06
Ошибка [C++ Error] Unit1.cpp(14): E2379 Statement missing ; Guzel' C++ Builder 6 13.11.2012 00:11
Ошибка Unit1.pas(100): Statement expected, but expression of type 'Boolean' found sedoq Общие вопросы Delphi 3 08.02.2012 01:27
Ошибка statement missing ; gamer-25 Общие вопросы C/C++ 2 03.10.2011 15:16
Ошибка before statement NARKOM JavaScript, Ajax 0 27.09.2011 09:12