FortsÀttningen av artikeln "«.
Artikeln kommer att granska och visa med konkreta fraser och exempel vilken anvÀndbar information som kan erhÄllas genom visningen av pg_locks.
Varning.
PÄ grund av Àmnets nyhet och det ofullstÀndiga testperioden kan artikeln innehÄlla fel. Kritik och kommentarer vÀlkomnas och förvÀntas.
Indata
Historik över visningen pg_locks
archive_locking
CREATE TABLE archive_locking
( timepoint timestamp without time zone ,
locktype text ,
relation oid ,
mode text ,
tid xid ,
vtid text ,
pid integer ,
blocking_pids integer[] ,
granted boolean ,
queryid bigint
);I grunden Ă€r tabellen liknande tabellen archive_pg_stat_activity, som beskrivs mer detaljerat hĂ€r â och hĂ€r â
För att fylla i kolumnen queryid anvÀnds funktionen
update_history_locking_by_queryid
--update_history_locking_by_queryid.sql
CREATE OR REPLACE FUNCTION update_history_locking_by_queryid() RETURNS boolean AS $$
DECLARE
result boolean ;
current_minute double precision ;
start_minute integer ;
finish_minute integer ;
start_period timestamp without time zone ;
finish_period timestamp without time zone ;
lock_rec record ;
endpoint_rec record ;
current_hour_diff double precision ;
BEGIN
RAISE NOTICE '***update_history_locking_by_queryid';
result = TRUE ;
current_minute = extract ( minute from now() );
SELECT * FROM endpoint WHERE is_need_monitoring
INTO endpoint_rec ;
current_hour_diff = endpoint_rec.hour_diff ;
IF current_minute < 5
THEN
RAISE NOTICE 'Current time is less than 5 minute.';
start_period = date_trunc('hour',now()) + (current_hour_diff * interval '1 hour');
finish_period = start_period - interval '5 minute' ;
ELSE
finish_minute = extract ( minute from now() ) / 5 ;
start_minute = finish_minute - 1 ;
start_period = date_trunc('hour',now()) + interval '1 minute'*start_minute*5+(current_hour_diff * interval '1 hour');
finish_period = date_trunc('hour',now()) + interval '1 minute'*finish_minute*5+(current_hour_diff * interval '1 hour') ;
END IF ;
RAISE NOTICE 'start_period = %', start_period;
RAISE NOTICE 'finish_period = %', finish_period;
FOR lock_rec IN
WITH act_queryid AS
(
SELECT
pid ,
timepoint ,
query_start AS started ,
MAX(timepoint) OVER (PARTITION BY pid , query_start ) AS finished ,
queryid
FROM
activity_hist.history_pg_stat_activity
WHERE
timepoint BETWEEN start_period and
finish_period
GROUP BY
pid ,
timepoint ,
query_start ,
queryid
),
lock_pids AS
(
SELECT
hl.pid ,
hl.locktype ,
hl.mode ,
hl.timepoint ,
MIN ( timepoint ) OVER (PARTITION BY pid , locktype ,mode ) as started
FROM
activity_hist.history_locking hl
WHERE
hl.timepoint between start_period and
finish_period
GROUP BY
hl.pid ,
hl.locktype ,
hl.mode ,
hl.timepoint
)
SELECT
lp.pid ,
lp.locktype ,
lp.mode ,
lp.timepoint ,
aq.queryid
FROM lock_pids lp LEFT OUTER JOIN act_queryid aq ON ( lp.pid = aq.pid AND lp.started BETWEEN aq.started AND aq.finished )
WHERE aq.queryid IS NOT NULL
GROUP BY
lp.pid ,
lp.locktype ,
lp.mode ,
lp.timepoint ,
aq.queryid
LOOP
UPDATE activity_hist.history_locking SET queryid = lock_rec.queryid
WHERE pid = lock_rec.pid AND locktype = lock_rec.locktype AND mode = lock_rec.mode AND timepoint = lock_rec.timepoint ;
END LOOP;
RETURN result ;
END
$$ LANGUAGE plpgsql;Förklaring: VÀrdet i kolumnen queryid uppdateras i tabellen history_locking, och nÀr en ny sektion för tabellen archive_locking skapas, kommer vÀrdet att sparas i de historiska vÀrdena.
Utdata
Ăversikt över processerna som helhet.
VĂNTAR PĂ LĂ SNINGAR ENLIGA LĂ STYPER
FrÄga
WITH
t AS
(
SELECT
locktype ,
mode ,
count(*) as total
FROM
activity_hist.archive_locking
WHERE
timepoint between pg_stat_history_begin+(current_hour_diff * interval '1 hour') AND pg_stat_history_end+(current_hour_diff * interval '1 hour') AND
NOT granted
GROUP BY
locktype ,
mode
)
SELECT
locktype ,
mode ,
total * interval '1 second' as duration
FROM t
ORDER BY 3 DESC Exempel
| VĂNTAR PĂ LĂ S PER LĂ STYP +--------------------+------------------------------+-------------------- | lĂ„styp| lĂ€ge| varaktighet +--------------------+------------------------------+-------------------- | transaktionsid| DelaLĂ„s| 19:39:26 | tuple| Ă tkomstExklusivLĂ„s| 00:03:35 +--------------------+------------------------------+--------------------
TAGNINGAR AV LĂ S PER LĂ STYP
FrÄga
MED
t AS
(
VĂLJ
lÄstyp ,
lÀge ,
antal(*) som totalt
FRĂ
N
activity_hist.archive_locking
DĂR
tidpunkt mellan pg_stat_history_begin+(current_hour_diff * intervall '1 timme') OCH pg_stat_history_end+(current_hour_diff * intervall '1 timme') OCH
tilldelat
GRUPPERA EFTER
lÄstyp ,
lÀge
)
VĂLJ
lÄstyp ,
lÀge ,
totalt * intervall '1 sekund' som varaktighet
FRĂ
N t
ORDNA EFTER 3 DESC Exempel
| TAGNINGAR AV Là S PER Là STYP +--------------------+------------------------------+-------------------- | lÄstyp| lÀge| varaktighet +--------------------+------------------------------+-------------------- | relation| RadExklusivLÄs| 51:11:10 | virtualxid| ExklusivLÄs| 48:10:43 | transaktionsid| ExklusivLÄs| 44:24:53 | relation| à tkomstDelaLÄs| 20:06:13 | tuple| à tkomstExklusivLÄs| 17:58:47 | tuple| ExklusivLÄs| 01:40:41 | relation| DelaUppdateraExklusivLÄs| 00:26:41 | objekt| RadExklusivLÄs| 00:00:01 | transaktionsid| DelaLÄs| 00:00:01 | extend| ExklusivLÄs| 00:00:01 +--------------------+------------------------------+--------------------
Detaljerad information om specifika queryid-frÄgor
VĂNTAR PĂ LĂ S PER LĂ STYP PER QUERYID
FrÄga
MED
lt AS
(
VĂLJ
pid ,
lÄstyp ,
lÀge ,
tidpunkt ,
queryid ,
blockerande_pid ,
MIN ( tidpunkt ) ĂVER (PARTITION BY pid , lĂ„styp ,lĂ€ge ) som startad
FRĂ
N
activity_hist.archive_locking
DĂR
tidpunkt mellan pg_stat_history_begin+(current_hour_diff * intervall '1 timme') OCH
pg_stat_history_end+(current_hour_diff * intervall '1 timme') OCH
IKKE tilldelat OCH
queryid ĂR INTE NULL
GRUPPERA EFTER
pid ,
lÄstyp ,
lÀge ,
tidpunkt ,
queryid ,
blockerande_pid
)
VĂLJ
lt.pid ,
lt.lÄstyp ,
lt.lÀge ,
lt.startad ,
lt.queryid ,
lt.blockerande_pid ,
ANTAL(*) * intervall '1 sekund' som varaktighet
FRĂ
N lt
GRUPPERA EFTER
lt.pid ,
lt.lÄstyp ,
lt.lÀge ,
lt.startad ,
lt.queryid ,
lt.blockerande_pid
ORDNA EFTER 4Exempel
| VĂNTAR PĂ
LĂ
S EFTER LĂ
STYPER EFTER FRĂ
GE-ID
+----------+-------------------------+--------------------+------------------------------+--------------------+--------------------+--------------------
| pid| lÄstyp| lÀge| startad| frÄgaid| blockering_pid| varaktighet
+----------+-------------------------+--------------------+------------------------------+--------------------+--------------------+--------------------
| 11288| transaktionsid| ShareLock| 2019-09-17 10:00:00.302936| 389015618226997618| {11092}| 00:03:34
| 11626| transaktionsid| ShareLock| 2019-09-17 10:00:21.380921| 389015618226997618| {12380}| 00:00:29
| 11626| transaktionsid| ShareLock| 2019-09-17 10:00:21.380921| 389015618226997618| {11092}| 00:03:25
| 11626| transaktionsid| ShareLock| 2019-09-17 10:00:21.380921| 389015618226997618| {12213}| 00:01:55
| 11626| transaktionsid| ShareLock| 2019-09-17 10:00:21.380921| 389015618226997618| {12751}| 00:00:01
| 11629| transaktionsid| ShareLock| 2019-09-17 10:00:24.331935| 389015618226997618| {11092}| 00:03:22
| 11629| transaktionsid| ShareLock| 2019-09-17 10:00:24.331935| 389015618226997618| {12007}| 00:00:01
| 12007| transaktionsid| ShareLock| 2019-09-17 10:05:03.327933| 389015618226997618| {11629}| 00:00:13
| 12007| transaktionsid| ShareLock| 2019-09-17 10:05:03.327933| 389015618226997618| {11092}| 00:01:10
| 12007| transaktionsid| ShareLock| 2019-09-17 10:05:03.327933| 389015618226997618| {11288}| 00:00:05
| 12213| transaktionsid| ShareLock| 2019-09-17 10:06:07.328019| 389015618226997618| {12007}| 00:00:10TAR LĂ SAR EFTER LĂ STYPER EFTER FRĂ GE-ID
FrÄga
MED
lt SOM
(
VĂLJ
pid ,
lÄstyp ,
lÀge ,
tidpunkt ,
frÄge-id ,
blockering_pid ,
MIN ( tidpunkt ) ĂVER (PARTITION BY pid , lĂ„styp ,lĂ€ge ) som startad
FRĂ
N
aktivitet_hist.archive_locking
DĂR
tidpunkt mellan pg_stat_history_begin+(current_hour_diff * intervall '1 timme') OCH
pg_stat_history_end+(current_hour_diff * intervall '1 timme') OCH
beviljad OCH
frĂ„ge-id ĂR INTE NULL
GROUP BY
pid ,
lÄstyp ,
lÀge ,
tidpunkt ,
frÄge-id ,
blockering_pid
)
VĂLJ
lt.pid ,
lt.lÄstyp ,
lt.lÀge ,
lt.startad ,
lt.frÄge-id ,
lt.blockering_pid ,
COUNT(*) * intervall '1 sekund' som varaktighet
FRĂ
N lt
GROUP BY
lt.pid ,
lt.lÄstyp ,
lt.lÀge ,
lt.startad ,
lt.frÄge-id ,
lt.blockering_pid
ORDER BY 4Exempel
| TAGNING AV LĂ
S GENOM LĂ
STYPER GENOM QUERYID
+----------+-------------------------+--------------------+------------------------------+--------------------+--------------------+--------------------
| pid| lÄstyp| lÀge| startad| queryid| blockerande_pids| varaktighet
+----------+-------------------------+--------------------+------------------------------+--------------------+--------------------+--------------------
| 11288| relation| RadExklusivtLÄs| 2019-09-17 10:00:00.302936| 389015618226997618| {11092}| 00:03:34
| 11092| transaktionsid| ExklusivtLÄs| 2019-09-17 10:00:00.302936| 389015618226997618| {}| 00:03:34
| 11288| relation| RadExklusivtLÄs| 2019-09-17 10:00:00.302936| 389015618226997618| {}| 00:00:10
| 11092| relation| RadExklusivtLÄs| 2019-09-17 10:00:00.302936| 389015618226997618| {}| 00:03:34
| 11092| virtualxid| ExklusivtLÄs| 2019-09-17 10:00:00.302936| 389015618226997618| {}| 00:03:34
| 11288| virtualxid| ExklusivtLÄs| 2019-09-17 10:00:00.302936| 389015618226997618| {11092}| 00:03:34
| 11288| transaktionsid| ExklusivtLÄs| 2019-09-17 10:00:00.302936| 389015618226997618| {11092}| 00:03:34
| 11288| tuple| Ă
tkomstExklusivtLÄs| 2019-09-17 10:00:00.302936| 389015618226997618| {11092}| 00:03:34AnvÀndning av lÄshistorik vid analys av prestandaincidenter.
- FörfrÄgan med queryid=389015618226997618 utförd av processen med pid=11288 vÀntade pÄ lÄs sedan 2019-09-17 10:00:00 i 3 minuter.
- LÄset hölls av processen med pid=11092.
- Processen med pid=11092, som utförde förfrÄgan med queryid=389015618226997618 sedan 2019-09-17 10:00:00, höll lÄset i 3 minuter.
Resultat
Nu hoppas jag att det mest intressanta och nyttiga börjar - insamlingen av statistik och analys av fall baserade pÄ vÀntetider och lÄshistorik.
I framtiden hoppas jag att det blir en uppsÀttning av nÄgot som en note (i likhet med metallÀnken i Oracle).
Det Àr egentligen av denna anledning som den anvÀnda metoden snabbt görs tillgÀnglig för allmÀnheten.
SÄ snart som möjligt ska jag försöka lÀgga upp projektet pÄ GitHub.
KĂ€lla: habr.com
