Задать вопрос
@lookingfor2

Почему запрос выполняется разное время?

WITH unique_records AS (
    SELECT DISTINCT ON (old_id) id, old_id, update_at
    FROM table_a
    ORDER BY old_id, update_at DESC
),

record_mapping AS (
    SELECT
        table_b.nm_id AS nm_id,
        unique_records.id AS new_record_id
    FROM table_b
    JOIN unique_records
        ON table_b.supplier_id = unique_records.old_id
    WHERE table_b.nm_id IN (
        SELECT nm_id FROM table_c
    )
)

UPDATE table_c
SET seller_id = record_mapping.new_record_id
FROM record_mapping
WHERE table_c.nm_id = record_mapping.nm_id
  AND table_c.seller_id != record_mapping.new_record_id;


есть такой запрос
в контекст особо смысла вникать нет
единственное: в каждой таблице миллионы записей, и есть ряд воркеров, которые на периодической основе делают insert, update таблиц учавствующих в запросе.

запрос выполняется за разные отрезки времени, может выполниться за 20 секунд, а может за 500
я не могу отловить причину такого разброса, есть подозрение что не хватает ресурсов i/o

если выполнить такой запрос:
SELECT pid,
       pg_blocking_pids(pid),
       wait_event_type,
       state,
       left(query,50) AS query
FROM pg_stat_activity
WHERE pid IN (SELECT pid FROM pg_stat_activity WHERE state = 'active');

67a10624ab739979697773.jpeg

Пытался посмотреть не блокирует ли его другой процесс, но нет: 0
select pg_blocking_pids(pid) as blocked_by
from pg_stat_activity
where cardinality(pg_blocking_pids(pid)) > 0;


вот что видно в графане
67a107453f294016760227.png

как понять почему он отрабатывает за разные промежутки времени ?
  • Вопрос задан
  • 48 просмотров
Подписаться 1 Простой 2 комментария
Пригласить эксперта
Ответы на вопрос 1
@rPman
FROM pg_stat_activity
WHERE pid IN (SELECT pid FROM pg_stat_activity WHERE state = 'active');
зачем ты in (select используешь на простую проверку where state='...', убери и оставь это условие в основном запросе.

И еще, каждый раз, когда ты не понимаешь почему тормозит, сначала делай explain запроса, как минимум сюда его закинь, так увидишь, используются ли индексы.

Судя по тому что у тебя 20 секунд выполняется примитивный запрос на всего миллионах записях с условием state='...' то у тебя на полях, используемых в условии нет индекса, а без них база перелопачивается вся целиком, и если быстро - значит она закешировалась, а если медленно - другие операции вытеснили ее из кеша.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы