powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как узнать, какие таблицы/записи ожидает запрос
5 сообщений из 5, страница 1 из 1
Как узнать, какие таблицы/записи ожидает запрос
    #40027510
qi_ip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приветствую!

Подскажите, пожалуйста, как можно проследить, что происходит в БД во время выполнения запроса.
htop показывает, что один из процов грузит процесс pgsql.
В pg_stat_activity показывает, что выполняется процедура.

Внутри процедуры идут два DELETE операции.

Код: plsql
1.
2.
3.
4.
5.
6.
DELETE FROM user_messages WHERE status = 1 AND user_id = val;

DELETE FROM batch_messages WHERE id NOT IN 
(
    SELECT batch_id FROM user_messages
);



То есть, в какой-то момент времени, в логах постоянно висит эта процедура и один из процессоров забит на 100%.
Индексы на эти таблицы стоят.

Есть предположение, что в какой-то момент эта процедура запускается для каждого user_id (несколько раз) и происходит коллизия.

Но это только лишь предположение...потому что локов в pg_locks тоже не наблюдается в этот момент.

Отсюда вопрос, можно ли включить логирование таких моментов, чтобы было видно, какой запрос, что ждет и почему сильно грузится процессор? Не исключаю, что сам запрос тоже написан не корректно, что вызывает тормоза.

Спасибо!
...
Рейтинг: 0 / 0
Как узнать, какие таблицы/записи ожидает запрос
    #40027512
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qi_ip,

log_lock_waits. Но ожидание чего-либо не даст 100% cpu.
Скорее у вас FK без индексов
...
Рейтинг: 0 / 0
Как узнать, какие таблицы/записи ожидает запрос
    #40027519
qi_ip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Melkij, вот скрипты создания БД. Индекс стоит (((

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
-- Table: batch_messages

CREATE TABLE batch_messages
(
    id bigint NOT NULL DEFAULT nextval('seq_id'::regclass),
    body text COLLATE pg_catalog."default" NOT NULL,
    created_timestamp timestamp without time zone NOT NULL,
    CONSTRAINT batch_messages_pkey PRIMARY KEY (id)
)

-- Table: user_messages

CREATE TABLE user_messages
(
    user_id bigint NOT NULL,
    batch_id bigint NOT NULL,
    status smallint NOT NULL,
    CONSTRAINT frn_key_user_messages_batch_msg_id FOREIGN KEY (batch_id)
        REFERENCES batch_messages (id) MATCH SIMPLE
        ON UPDATE NO ACTION
        ON DELETE NO ACTION,
    CONSTRAINT frn_key_user_messages_user_id FOREIGN KEY (user_id)
        REFERENCES users (id) MATCH SIMPLE
        ON UPDATE NO ACTION
        ON DELETE NO ACTION
)

CREATE INDEX idx_user_messages_batch_id
    ON user_messages USING btree
    (batch_id ASC NULLS LAST)
    TABLESPACE pg_default;

CREATE INDEX idx_user_messages_user_id
    ON user_messages USING btree
    (user_id ASC NULLS LAST)
    TABLESPACE pg_default;

CREATE INDEX idx_user_messages_user_id_status
    ON user_messages USING btree
    (user_id ASC NULLS LAST, status ASC NULLS LAST)
    TABLESPACE pg_default;

--Trigger event
CREATE TRIGGER user_messages_event
    AFTER INSERT
    ON user_messages
    FOR EACH ROW
    EXECUTE PROCEDURE user_messages_event();
...
Рейтинг: 0 / 0
Как узнать, какие таблицы/записи ожидает запрос
    #40027546
Swa111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qi_ip,

Not in довольно дорогая операция, и плохо поддается оптимизации. Лучше удаляйте последовательно известные компоненты.

Код: plsql
1.
2.
3.
DELETE FROM batch_messages WHERE id IN (SELECT batch_id FROM user_messages WHERE status = 1 AND user_id = val);

DELETE FROM user_messages WHERE status = 1 AND user_id = val;
...
Рейтинг: 0 / 0
Как узнать, какие таблицы/записи ожидает запрос
    #40027565
qi_ip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Swa111
qi_ip,

Not in довольно дорогая операция, и плохо поддается оптимизации. Лучше удаляйте последовательно известные компоненты.

Код: plsql
1.
2.
3.
DELETE FROM batch_messages WHERE id IN (SELECT batch_id FROM user_messages WHERE status = 1 AND user_id = val);

DELETE FROM user_messages WHERE status = 1 AND user_id = val;


Спасибо большое за совет! Попробую оптимизировать!
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как узнать, какие таблицы/записи ожидает запрос
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]