Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как узнать, какие таблицы/записи ожидает запрос / 5 сообщений из 5, страница 1 из 1
13.12.2020, 21:05
    #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
13.12.2020, 21:09
    #40027512
Melkij
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать, какие таблицы/записи ожидает запрос
qi_ip,

log_lock_waits. Но ожидание чего-либо не даст 100% cpu.
Скорее у вас FK без индексов
...
Рейтинг: 0 / 0
13.12.2020, 21:24
    #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
14.12.2020, 06:20
    #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
14.12.2020, 11:06
    #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
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как узнать, какие таблицы/записи ожидает запрос / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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