PostgreSQL 101: Bekleyen Sorgular

pg_stat_activity görünümü boolean bir alan olan waiting sütununa sahiptir. Bu sütunun değerleri

 pg_ terminate_backend(procpid) from pg_stat_activity, where current_query = <IDLE>

işlemin (transaction) devam ettiği sorgular, ve

current_timestamp - query_start > '1 min';

olarak seçildiğinde bir sistem kilidinin (lock) açılmasını bekleyen sorgular olarak çalışır. Diğer bir şekilde açıklamaya çalışırsak; pg_stat_activity görünümünü eğer waiting = TRUE olarak filtrelersek bu durumda yukarıdaki ilk sorgu ile sonuçlar getirilir.

Sorgumu Kim Blokluyor?

Bir sorgunun bloklandığını öğrendikten sonra hemen kimin blokladığını bulmak isteriz. Aşağıdakine benzer bir soru bu sorumuzun cevabını bize verecektir:

SELECT
    w.current_query as waiting_query,
    w.procpid as w_pid,
    w.usename as w_user,
    l.current_query as locking_query,
    l.procpid as l_pid,
    l.usename as l_user,
    t.schemaname || '.' || t.relname as tablename
FROM pg_stat_activity w
    join pg_locks l1 on w.procpid = l1.pid and not l1.granted
    join pg_locks l2 on l1.relation = l2.relation and l2.granted
    join pg_stat_activity l on  l2.pid = l.procpid
    join pg_stat_user_tables t on l1.relation = t.relid
WHERE w.waiting;

Bu sorgunun sonucu process ID ile süreç numarasını, kullanıcı, ve current query ile işlenen sorguyu bloklayan ve bloklanan işleçler ile beraber gösterecektir. Sorgu sonucu aynı zamanda bloğa sebep olan şema ve tablo adlarını da gösterir.

Kullanıcı adları yine bir sistem görünümü olan pg_stat_user_tables görünümünden bir join aracılığı ile getirilmektedir.