เบ„เบงเบฒเบกเบžเบฐเบเบฒเบเบฒเบกเบ—เบตเปˆเบˆเบฐเบชเป‰เบฒเบ‡ ASH analogue เบชเปเบฒเบฅเบฑเบš PostgreSQL

เบเบฒเบ™เบชเป‰เบฒเบ‡เบšเบฑเบ™เบซเบฒ

เป€เบžเบทเปˆเบญเป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบเบฒเบ™เบชเบญเบšเบ–เบฒเบก PostgreSQL, เบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เปƒเบ™เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบ›เบฐเบซเบงเบฑเบ”เบเบดเบ”เบˆเบฐเบเปเบฒ, เป‚เบ”เบเบชเบฐเป€เบžเบฒเบฐ, เบเบฒเบ™เบฅเปเบ–เป‰เบฒ, locks, เปเบฅเบฐเบชเบฐเบ–เบดเบ•เบดเบ•เบฒเบ•เบฐเบฅเบฒเบ‡, เปเบกเปˆเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เบซเบผเบฒเบ.

เป‚เบญเบเบฒเบ”เบ—เบตเปˆเบกเบตเบขเบนเปˆ

เป€เบ„เบทเปˆเบญเบ‡เบกเบทเบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบงเบฝเบเบ›เบฐเบซเบงเบฑเบ”เบชเบฒเบ”เบซเบผเบท "AWR เบชเปเบฒเบฅเบฑเบš Postgres": เป€เบ›เบฑเบ™เบเบฒเบ™เปเบเป‰เป„เบ‚เบ—เบตเปˆเบซเบ™เป‰เบฒเบชเบปเบ™เปƒเบˆเบซเบผเบฒเบ, เปเบ•เปˆเบšเปเปˆเบกเบตเบ›เบฐเบซเบงเบฑเบ”เบ‚เบญเบ‡ pg_stat_activity เปเบฅเบฐ pg_locks.

เบเบฒเบ™เบ‚เบฐเบซเบเบฒเบ pgsentinel :
ยซเบ‚เปเป‰เบกเบนเบ™เบชเบฐเบชเบปเบกเบ—เบฑเบ‡เบซเบกเบปเบ”เบˆเบฐเบ–เบทเบเป€เบเบฑเบšเป„เบงเป‰เปƒเบ™ RAM เป€เบ—เบปเปˆเบฒเบ™เบฑเป‰เบ™, เปเบฅเบฐเบˆเปเบฒเบ™เบงเบ™เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเบ—เบตเปˆเบšเปเบฅเบดเป‚เบžเบเบ–เบทเบเบ„เบงเบšเบ„เบธเบกเป‚เบ”เบเบˆเปเบฒเบ™เบงเบ™เบšเบฑเบ™เบ—เบถเบเบ—เบตเปˆเป€เบเบฑเบšเป„เบงเป‰เบชเบธเบ”เบ—เป‰เบฒเบ.

เบŠเปˆเบญเบ‡เบ‚เปเป‰เบกเบนเบ™ queryid เบ–เบทเบเป€เบžเบตเปˆเบก - queryid เบ”เบฝเบงเบเบฑเบ™เบˆเบฒเบเบชเปˆเบงเบ™เบ‚เบฐเบซเบเบฒเบ pg_stat_statements (เบ•เป‰เบญเบ‡เบ•เบดเบ”เบ•เบฑเป‰เบ‡เบเปˆเบญเบ™).ยซ

เบ™เบตเป‰, เปเบ™เปˆเบ™เบญเบ™, เบˆเบฐเบŠเปˆเบงเบเป„เบ”เป‰เบซเบผเบฒเบ, เปเบ•เปˆเบชเบดเปˆเบ‡เบ—เบตเปˆเบซเบเบธเป‰เบ‡เบเบฒเบเบ—เบตเปˆเบชเบธเบ”เปเบกเปˆเบ™เบˆเบธเบ”เบ—เปเบฒเบญเบดเบ”.โ€เบ‚เปเป‰เบกเบนเบ™เบชเบฐเบชเบปเบกเบ—เบฑเบ‡เปเบปเบ”เบˆเบฐเบ–เบทเบเป€เบเบฑเบšเป„เบงเป‰เปƒเบ™ RAM เป€เบ—เบปเปˆเบฒเบ™เบฑเป‰เบ™ โ€, i.e. เบกเบตเบœเบปเบ™เบเบฐเบ—เบปเบšเบเปˆเบฝเบงเบเบฑเบšเบžเบทเป‰เบ™เบ–เบฒเบ™เป€เบ›เบปเป‰เบฒเบซเบกเบฒเบ. เบ™เบญเบเบˆเบฒเบเบ™เบฑเป‰เบ™, เบšเปเปˆเบกเบตเบ›เบฐเบซเบงเบฑเบ”เบเบฒเบ™เบฅเบฑเบญเบเปเบฅเบฐเบชเบฐเบ–เบดเบ•เบดเบ•เบฒเบ•เบฐเบฅเบฒเบ‡. เป€เบซเบผเบปเปˆเบฒเบ™เบฑเป‰เบ™. เบเบฒเบ™เปเบเป‰เป„เบ‚เป‚เบ”เบเบ—เบปเปˆเบงเป„เบ›เปเบฅเป‰เบงเปเบกเปˆเบ™เป€เบงเบปเป‰เบฒเบšเปเปˆเบ„เบปเบšเบ–เป‰เบงเบ™: "เบšเปเปˆเบกเบตเบŠเบธเบ”เบ—เบตเปˆเบเบฝเบกเบžเป‰เบญเบกเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡เป€เบ—เบทเปˆเบญ. เบกเบฑเบ™เป„เบ”เป‰เบ–เบทเบเปเบ™เบฐเบ™เปเบฒเปƒเบซเป‰เบ”เบฒเบงเบ™เปŒเป‚เบซเบฅเบ”เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™เปเบฅเบฐเบ›เบฐเบเบญเบšเบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เบ•เบปเบงเบ—เปˆเบฒเบ™เป€เบญเบ‡. เบ—เปเบฒเบญเบดเบ”เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบ•เบดเบ”เบ•เบฑเป‰เบ‡เบŠเบธเบ” "devel" เบชเปเบฒเบฅเบฑเบšเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบ‚เบญเบ‡เบ—เปˆเบฒเบ™เปเบฅเบฐเบเปเบฒเบ™เบปเบ”เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เป„เบ›เบซเบฒ pg_config เปƒเบ™เบ•เบปเบงเปเบ› PATH.".

เป‚เบ”เบเบ—เบปเปˆเบงเป„เบ›, เบกเบตเบซเบผเบฒเบ fuss, เปเบฅเบฐเปƒเบ™เบเปเบฅเบฐเบ™เบตเบ‚เบญเบ‡เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบเบฒเบ™เบœเบฐเบฅเบดเบ”เบ—เบตเปˆเบฎเป‰เบฒเบเปเบฎเบ‡, เบกเบฑเบ™เบญเบฒเบ”เบˆเบฐเบšเปเปˆเบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เบซเบเบฑเบ‡เบเบฑเบšเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ. เบžเบงเบเป€เบฎเบปเบฒเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป„เบ”เป‰เบกเบฒเบเบฑเบšเบšเบฒเบ‡เบชเบดเปˆเบ‡เบšเบฒเบ‡เบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบ•เบปเบ™เป€เบญเบ‡เบญเบตเบเป€เบ—เบทเปˆเบญเบซเบ™เบถเปˆเบ‡.

เบ„เปเบฒเป€เบ•เบทเบญเบ™

เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบ›เบฐเบฅเบดเบกเบฒเบ™เบ‚เบฐเบซเบ™เบฒเบ”เปƒเบซเบเปˆเบซเบผเบฒเบเปเบฅเบฐเป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเป„เบฅเบเบฐเป€เบงเบฅเบฒเบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบšเปเปˆเบ„เบปเบšเบ–เป‰เบงเบ™, เบšเบปเบ”เบ„เบงเบฒเบกเบชเปˆเบงเบ™เปƒเบซเบเปˆเปเบกเปˆเบ™เบกเบตเบฅเบฑเบเบชเบฐเบ™เบฐเบ‚เปเป‰เบกเบนเบ™, เปเบ—เบ™เบ—เบตเปˆเบˆเบฐเป€เบ›เบฑเบ™เบŠเบธเบ”เบ‚เบญเบ‡เบซเบปเบงเบ‚เปเป‰เปเบฅเบฐเบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบฅเบฐเบ”เบฑเบšเบ›เบฒเบ™เบเบฒเบ‡.
เป€เบญเบเบฐเบชเบฒเบ™เบฅเบฒเบเบฅเบฐเบญเบฝเบ”เป€เบžเบตเปˆเบกเป€เบ•เบตเบกเบˆเบฐเบ–เบทเบเบเบฐเบเบฝเบกเบ•เปเปˆเบกเบฒ, เปƒเบ™เบšเบฒเบ‡เบชเปˆเบงเบ™

เบฎเปˆเบฒเบ‡โ€‹เบ‚เปเป‰โ€‹เบเปเบฒโ€‹เบ™เบปเบ”โ€‹เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบเบฒเบ™โ€‹เปเบเป‰โ€‹เป„เบ‚โ€‹

เบกเบฑเบ™เป€เบ›เบฑเบ™เบชเบดเปˆเบ‡เบˆเปเบฒเป€เบ›เบฑเบ™เบ—เบตเปˆเบˆเบฐเบžเบฑเบ”เบ—เบฐเบ™เบฒเป€เบ„เบทเปˆเบญเบ‡เบกเบทเบ—เบตเปˆเบŠเปˆเบงเบเปƒเบซเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบเบฑเบšเบฎเบฑเบเบชเบฒ:

pg_stat_activity เป€เบšเบดเปˆเบ‡เบ›เบฐเบซเบงเบฑเบ”
เบ›เบฐเบซเบงเบฑเบ”เบเบฒเบ™เบฅเบฑเบญเบเป€เบŠเบชเบŠเบฑเบ™เป‚เบ”เบเปƒเบŠเป‰เบกเบธเบกเบกเบญเบ‡ pg_locks

เบ„เบงเบฒเบกเบ•เป‰เบญเบ‡เบเบฒเบ™เปเบเป‰เป„เบ‚- เบซเบผเบธเบ”เบœเปˆเบญเบ™เบœเบปเบ™เบเบฐเบ—เบปเบšเบ•เปเปˆเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เป€เบ›เบปเป‰เบฒเบซเบกเบฒเบ.

เปเบ™เบงเบ„เบงเบฒเบกเบ„เบดเบ”เบ—เบปเปˆเบงเป„เบ›โ€“ เบ•เบปเบงโ€‹เปเบ—เบ™โ€‹เป€เบเบฑเบšโ€‹เบเปเบฒโ€‹เบ‚เปเป‰โ€‹เบกเบนเบ™โ€‹เปเบกเปˆเบ™โ€‹เป„เบ”เป‰โ€‹เป€เบ›เบตเบ”โ€‹เบ•เบปเบงโ€‹เบšเปเปˆโ€‹เป„เบ”เป‰โ€‹เบขเบนเปˆโ€‹เปƒเบ™โ€‹เบ–เบฒเบ™โ€‹เบ‚เปเป‰โ€‹เบกเบนเบ™โ€‹เป€เบ›เบปเป‰เบฒโ€‹เบซเบกเบฒเบโ€‹, เปเบ•เปˆโ€‹เบงเปˆเบฒโ€‹เปƒเบ™โ€‹เบ–เบฒเบ™โ€‹เบ‚เปเป‰โ€‹เบกเบนเบ™โ€‹เบเบฒเบ™โ€‹เบ•เบดเบ”โ€‹เบ•เบฒเบกโ€‹เบเบงเบ”โ€‹เบเบฒโ€‹เป€เบ›เบฑเบ™โ€‹เบเบฒเบ™โ€‹เบšเปโ€‹เบฅเบดโ€‹เบเบฒเบ™โ€‹เบฅเบฐโ€‹เบšเบปเบšโ€‹. เปเบกเปˆเบ™เปเบฅเป‰เบง, เบเบฒเบ™เบชเบนเบ™เป€เบชเบเบ‚เปเป‰เบกเบนเบ™เบšเบฒเบ‡เบขเปˆเบฒเบ‡เปเบกเปˆเบ™เป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰, เปเบ•เปˆเบ™เบตเป‰เบšเปเปˆเบชเปเบฒเบ„เบฑเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบฅเบฒเบเบ‡เบฒเบ™, เปเบ•เปˆเบšเปเปˆเบกเบตเบœเบปเบ™เบเบฐเบ—เบปเบšเบเปˆเบฝเบงเบเบฑเบšเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เป€เบ›เบปเป‰เบฒเบซเบกเบฒเบเปƒเบ™เปเบ‡เปˆเบ‚เบญเบ‡เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเปเบฅเบฐเบžเบทเป‰เบ™เบ—เบตเปˆเบ”เบดเบ”. เปเบฅเบฐเปƒเบ™เบเปเบฅเบฐเบ™เบตเบ‚เบญเบ‡เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบชเบฐเบ™เบธเบเป€เบเบตเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ, เบœเบปเบ™เบเบฐเบ—เบปเบšเบ•เปเปˆเบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบ‚เบญเบ‡เบœเบนเป‰เปƒเบŠเป‰เปเบกเปˆเบ™เบซเบ™เป‰เบญเบ.

เบ‚เบฑเป‰เบ™เบ•เบญเบ™เบเบฒเบ™เบˆเบฑเบ”เบ•เบฑเป‰เบ‡เบ›เบฐเบ•เบดเบšเบฑเบ”

1.เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบšเปเบฅเบดเบเบฒเบ™

A schema เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบเบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เป€เบžเบทเปˆเบญเป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบ•เบฒเบ•เบฐเบฅเบฒเบ‡, เป€เบžเบทเปˆเบญเบšเปเปˆเปƒเบซเป‰เบชเบฑเบšเบชเบปเบ™เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบ•เบปเป‰เบ™เบ•เปเบ—เบตเปˆเปƒเบŠเป‰.

DROP SCHEMA IF EXISTS activity_hist ;
CREATE SCHEMA activity_hist AUTHORIZATION monitor ;

เบชเบดเปˆเบ‡เบชเปเบฒเบ„เบฑเบ™: schema เบšเปเปˆเป„เบ”เป‰เบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™เปƒเบ™เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เป€เบ›เบปเป‰เบฒเบซเบกเบฒเบ, เปเบ•เปˆเบขเบนเปˆเปƒเบ™เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบเบฒเบ™เบ•เบดเบ”เบ•เบฒเบก.

pg_stat_activity เป€เบšเบดเปˆเบ‡เบ›เบฐเบซเบงเบฑเบ”

เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบ–เบทเบเปƒเบŠเป‰เป€เบžเบทเปˆเบญเป€เบเบฑเบšเบžเบฒเบšเบ–เปˆเบฒเบเบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบ‚เบญเบ‡เบกเบธเบกเบกเบญเบ‡ pg_stat_activity

activity_hist.history_pg_stat_activity :

--ACTIVITY_HIST.HISTORY_PG_STAT_ACTIVITY
DROP TABLE IF EXISTS activity_hist.history_pg_stat_activity;
CREATE TABLE activity_hist.history_pg_stat_activity
(
  timepoint timestamp without time zone ,
  datid             oid  , 
  datname           name ,
  pid               integer,
  usesysid          oid    ,
  usename           name   ,
  application_name  text   ,
  client_addr       inet   ,
  client_hostname   text   ,
  client_port       integer,
  backend_start     timestamp with time zone ,
  xact_start        timestamp with time zone ,
  query_start       timestamp with time zone ,
  state_change      timestamp with time zone ,
  wait_event_type   text ,                     
  wait_event        text ,                   
  state             text ,                  
  backend_xid       xid  ,                 
  backend_xmin      xid  ,                
  query             text ,               
  backend_type      text ,  
  queryid           bigint
);

เป€เบžเบทเปˆเบญเป€เบฅเบฑเปˆเบ‡เบเบฒเบ™เปเบŠเบ - เบšเปเปˆเบกเบตเบ”เบฑเบ”เบชเบฐเบ™เบตเบซเบผเบทเบ‚เปเป‰เบˆเปเบฒเบเบฑเบ”.

เป€เบžเบทเปˆเบญเป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบ›เบฐเบซเบงเบฑเบ”เบชเบฒเบ”เบ•เบปเบงเบกเบฑเบ™เป€เบญเบ‡, เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เปเบšเปˆเบ‡เบชเปˆเบงเบ™เปเบกเปˆเบ™เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰:

activity_hist.archive_pg_stat_activity :

DROP TABLE IF EXISTS activity_hist.archive_pg_stat_activity;
CREATE TABLE activity_hist.archive_pg_stat_activity
(
  timepoint timestamp without time zone ,
  datid             oid  , 
  datname           name ,
  pid               integer,
  usesysid          oid    ,
  usename           name   ,
  application_name  text   ,
  client_addr       inet   ,
  client_hostname   text   ,
  client_port       integer,
  backend_start     timestamp with time zone ,
  xact_start        timestamp with time zone ,
  query_start       timestamp with time zone ,
  state_change      timestamp with time zone ,
  wait_event_type   text ,                     
  wait_event        text ,                   
  state             text ,                  
  backend_xid       xid  ,                 
  backend_xmin      xid  ,                
  query             text ,               
  backend_type      text ,
  queryid           bigint
)
PARTITION BY RANGE (timepoint);

เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒเปƒเบ™เบเปเบฅเบฐเบ™เบตเบ™เบตเป‰เบšเปเปˆเบกเบตเบ‚เปเป‰เบเปเบฒเบ™เบปเบ”เบชเปเบฒเบฅเบฑเบšเบ„เบงเบฒเบกเป„เบงเบเบฒเบ™เปเบŠเบ, เบšเบฒเบ‡เบ”เบฑเบ”เบชเบฐเบ™เบตเป„เบ”เป‰เบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบทเป‰เบ™เป€เบžเบทเปˆเบญเป€เบฅเบฑเปˆเบ‡เบเบฒเบ™เบชเป‰เบฒเบ‡เบšเบปเบ”เบฅเบฒเบเบ‡เบฒเบ™.

เบ›เบฐเบซเบงเบฑเบ”เบเบฒเบ™เบšเบฅเบฑเบญเบเป€เบŠเบ”เบŠเบฑเบ™

เบ•เบฒโ€‹เบ•เบฐโ€‹เบฅเบฒเบ‡โ€‹เปเบกเปˆเบ™โ€‹เป„เบ”เป‰โ€‹เบ–เบทเบโ€‹เบ™เปเบฒโ€‹เปƒเบŠเป‰โ€‹เป€เบžเบทเปˆเบญโ€‹เป€เบเบฑเบšโ€‹เบฎเบฑเบโ€‹เบชเบฒโ€‹เบฎเบนเบšโ€‹เบžเบฒเบšโ€‹เปƒเบ™โ€‹เบ›เบฑเบ”โ€‹เบˆเบธโ€‹เบšเบฑเบ™โ€‹เบ‚เบญเบ‡โ€‹เบเบฒเบ™โ€‹เบฅเบฑเบญเบโ€‹เบเบญเบ‡โ€‹เบ›เบฐโ€‹เบŠเบธเบกโ€‹:

activity_hist.history_locking :

--ACTIVITY_HIST.HISTORY_LOCKING
DROP TABLE IF EXISTS activity_hist.history_locking;
CREATE TABLE activity_hist.history_locking
(
	timepoint timestamp without time zone ,
	locktype text ,
	relation oid ,
	mode text ,
	tid xid ,
	vtid text ,
	pid integer ,
	blocking_pids integer[] ,
	granted boolean
);

เบ™เบญเบเบˆเบฒเบเบ™เบตเป‰, เป€เบžเบทเปˆเบญเป€เบฅเบฑเปˆเบ‡เบเบฒเบ™เปเบŠเบ, เบšเปเปˆเบกเบตเบ”เบฑเบ”เบชเบฐเบ™เบตเบซเบผเบทเบ‚เปเป‰เบˆเปเบฒเบเบฑเบ”.

เป€เบžเบทเปˆเบญเป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบ›เบฐเบซเบงเบฑเบ”เบชเบฒเบ”เบ•เบปเบงเบกเบฑเบ™เป€เบญเบ‡, เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เปเบšเปˆเบ‡เบชเปˆเบงเบ™เปเบกเปˆเบ™เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰:

activity_hist.archive_locking:

DROP TABLE IF EXISTS activity_hist.archive_locking;
CREATE TABLE activity_hist.archive_locking
(
	timepoint timestamp without time zone ,
	locktype text ,
	relation oid ,
	mode text ,
	tid xid ,
	vtid text ,
	pid integer ,
	blocking_pids integer[] ,
	granted boolean	
)
PARTITION BY RANGE (timepoint);

เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒเปƒเบ™เบเปเบฅเบฐเบ™เบตเบ™เบตเป‰เบšเปเปˆเบกเบตเบ‚เปเป‰เบเปเบฒเบ™เบปเบ”เบชเปเบฒเบฅเบฑเบšเบ„เบงเบฒเบกเป„เบงเบเบฒเบ™เปเบŠเบ, เบšเบฒเบ‡เบ”เบฑเบ”เบชเบฐเบ™เบตเป„เบ”เป‰เบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบทเป‰เบ™เป€เบžเบทเปˆเบญเป€เบฅเบฑเปˆเบ‡เบเบฒเบ™เบชเป‰เบฒเบ‡เบšเบปเบ”เบฅเบฒเบเบ‡เบฒเบ™.

2.เบเบฒเบ™เบ•เบทเปˆเบกเบ‚เปเป‰เบกเบนเบ™เบ›เบฐเบซเบงเบฑเบ”เบชเบฒเบ”เปƒเบ™เบ›เบฐเบˆเบธเบšเบฑเบ™

เป€เบžเบทเปˆเบญเป€เบเบฑเบšเบเปเบฒเบฎเบนเบšเบžเบฒเบšเบเบฒเบ™เป€เบšเบดเปˆเบ‡เป‚เบ”เบเบเบปเบ‡, script bash เบ–เบทเบเปƒเบŠเป‰เบ—เบตเปˆเป€เบฎเบฑเบ”เบงเบฝเบ plpgsql.

get_current_activity.sh

#!/bin/bash
#########################################################
#get_current_activity.sh

ERROR_FILE='/home/demon/get_current_activity'$(date +%Y%m%d-)'T'$(date +%H)$(date +%M)$(date +%S)
host=$1
s_name=$2
s_pass=$3

psql  -A -t -q -v ON_ERROR_STOP=1 -c "SELECT activity_hist.get_current_activity( '$host' , '$s_name' , '$s_pass' )" >/dev/null 2>$ERROR_FILE

line_count=`cat $ERROR_FILE | wc -l`
if [[ $line_count != '0' ]];
then
    rm -f /home/demon/*.err >/dev/null 2>/dev/null
	cp $ERROR_FILE $ERROR_FILE'.err' >/dev/null 2>/dev/null  
fi
rm $ERROR_FILE >/dev/null 2>/dev/null
exit 0

plpgsql เบŸเบฑเบ‡เบŠเบฑเบ™ dblink เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบกเบธเบกเป€เบšเบดเปˆเบ‡เปƒเบ™เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เป€เบ›เบปเป‰เบฒเบซเบกเบฒเบเปเบฅเบฐเปƒเบชเปˆเปเบ–เบงเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เปƒเบ™เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบเบฒเบ™เบ•เบดเบ”เบ•เบฒเบก.

get_current_activity.sql

CREATE OR REPLACE FUNCTION activity_hist.get_current_activity( current_host text , current_s_name text , current_s_pass text ) RETURNS BOOLEAN AS $$
DECLARE 
  database_rec record;
  dblink_str text ;
BEGIN   

	EXECUTE 'SELECT dblink_connect(''LINK1'',''host='||current_host||' port=5432 dbname=postgres'||
	                                         ' user='||current_s_name||' password='||current_s_pass|| ' '')';



--------------------------------------------------------------------
--GET pg_stat_activity stats
	INSERT INTO activity_hist.history_pg_stat_activity
	(
		SELECT * FROM dblink('LINK1',
			'SELECT 
			now() , 
			datid             , 
			datname           ,
			pid               ,
			usesysid              ,
			usename              ,
			application_name     ,
			client_addr          ,
			client_hostname      ,
			client_port       ,
			backend_start         ,
			xact_start            ,
			query_start           ,
			state_change          ,
			wait_event_type    ,                     
			wait_event         ,                   
			state              ,                  
			backend_xid         ,                 
			backend_xmin        ,                
			query              ,               
			backend_type   			
		FROM pg_stat_activity
		') 
		AS t (
		    timepoint 		  timestamp without time zone ,			
			datid             oid  , 
			datname           name ,
			pid               integer,
			usesysid          oid    ,
			usename           name   ,
			application_name  text   ,
			client_addr       inet   ,
			client_hostname   text   ,
			client_port       integer,
			backend_start     timestamp with time zone ,
			xact_start        timestamp with time zone ,
			query_start       timestamp with time zone ,
			state_change      timestamp with time zone ,
			wait_event_type   text ,                     
			wait_event        text ,                   
			state             text ,                  
			backend_xid       xid  ,                 
			backend_xmin      xid  ,                
			query             text ,               
			backend_type      text 			
		)
	);

---------------------------------------	
--ACTIVITY_HIST.HISTORY_LOCKING	
	INSERT INTO activity_hist.history_locking
	(
		SELECT * FROM dblink('LINK1',
			'SELECT 
			now() , 
			lock.locktype,
			lock.relation,
			lock.mode,
			lock.transactionid as tid,
			lock.virtualtransaction as vtid,
			lock.pid,
			pg_blocking_pids(lock.pid), 
			lock.granted
			FROM 	pg_catalog.pg_locks lock LEFT JOIN pg_catalog.pg_database db ON db.oid = lock.database
			WHERE NOT lock.pid = pg_backend_pid()	
		') 
		AS t (
			timepoint timestamp without time zone ,
			locktype text ,
			relation oid , 
			mode text ,
			tid xid ,
			vtid text ,
			pid integer ,
			blocking_pids integer[] ,
			granted boolean
		)
	);
	PERFORM dblink_disconnect('LINK1');
	
	RETURN TRUE ;
END
$$ LANGUAGE plpgsql;

เป€เบžเบทเปˆเบญเป€เบเบฑเบšเบเปเบฒเบฎเบนเบšเบžเบฒเบšเบเบฒเบ™เป€เบšเบดเปˆเบ‡, เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เบฅเบฐเบšเบปเบšเปเบฅเบฐเบชเบญเบ‡เบชเบฐเบ„เบดเบšเปเบกเปˆเบ™เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰:

pg_current_activity.service

# /etc/systemd/system/pg_current_activity.service
[Unit]
Description=Collect history of pg_stat_activity , pg_locks 
Wants=pg_current_activity.timer

[Service]
Type=forking
StartLimitIntervalSec=0
ExecStart=/home/postgres/pgutils/demon/get_current_activity.sh 10.124.70.40 postgres postgres

[Install]
WantedBy=multi-user.target

pg_current_activity.timer

# /etc/systemd/system/pg_current_activity.timer
[Unit]
Description=Run pg_current_activity.sh every 1 second
Requires=pg_current_activity.service

[Timer]
Unit=pg_current_activity.service
OnCalendar=*:*:0/1
AccuracySec=1

[Install]
WantedBy=timers.target

เบกเบญเบšเบชเบดเบ”เปƒเบซเป‰เบชเบฐเบ„เบฃเบดเบš:
# chmod 755 pg_current_activity.timer
# chmod 755 pg_current_activity.service

เบกเบฒเป€เบฅเบตเปˆเบกเบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™:
# systemctl daemon-reload
# systemctl เป€เบฅเบตเปˆเบก pg_current_activity.service

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบ›เบฐเบซเบงเบฑเบ”เบชเบฒเบ”เบ‚เบญเบ‡ views เปเบกเปˆเบ™เป€เบเบฑเบšเบเปเบฒเปƒเบ™เบฎเบนเบšเปเบšเบšเบ‚เบญเบ‡เบžเบฒเบšเบ–เปˆเบฒเบเบ—เบตเบชเบญเบ‡เป‚เบ”เบเบงเบดเบ™เบฒเบ—เบต. เปเบ™เปˆเบ™เบญเบ™, เบ–เป‰เบฒเบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เบ–เบทเบเบ›เบฐเป„เบงเป‰, เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบˆเบฐเป€เบžเบตเปˆเบกเบ‚เบถเป‰เบ™เบขเปˆเบฒเบ‡เป„เบงเบงเบฒเปƒเบ™เบ‚เบฐเบซเบ™เบฒเบ”เปเบฅเบฐเบเบฒเบ™เบœเบฐเบฅเบดเบ”เบซเบผเบฒเบเบซเบผเบทเบซเบ™เป‰เบญเบเบˆเบฐเป€เบ›เบฑเบ™เป„เบ›เบšเปเปˆเป„เบ”เป‰.

เบกเบฑเบ™เป€เบ›เบฑเบ™เบชเบดเปˆเบ‡เบˆเปเบฒเป€เบ›เบฑเบ™เป€เบžเบทเปˆเบญเบˆเบฑเบ”เบ•เบฑเป‰เบ‡เบเบฒเบ™เป€เบเบฑเบšเบ‚เปเป‰เบกเบนเบ™.

3. เบเบฒเบ™เป€เบเบฑเบšเบ›เบฐเบซเบงเบฑเบ”เบชเบฒเบ”

เบชเบณเบฅเบฑเบšเบเบฒเบ™เบˆเบฑเบ”เป€เบเบฑเบš, เบเบฒเบ™เบˆเบฑเบ”เป€เบเบฑเบšเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เปเบšเปˆเบ‡เบชเปˆเบงเบ™* เบ–เบทเบเปƒเบŠเป‰.

เบเบฒเบ™เปเบšเปˆเบ‡เบžเบฒเบ—เบดเบŠเบฑเบ™เปƒเบซเบกเปˆเบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบทเป‰เบ™เบ—เบธเบเป†เบŠเบปเปˆเบงเป‚เบกเบ‡, เปƒเบ™เบ‚เบฐเบ™เบฐเบ—เบตเปˆเบ‚เปเป‰เบกเบนเบ™เป€เบเบปเปˆเบฒเบ–เบทเบเป€เบญเบปเบฒเบญเบญเบเบˆเบฒเบเบ•เบฒเบ•เบฐเบฅเบฒเบ‡ * เบ›เบฐเบซเบงเบฑเบ”เบชเบฒเบ”, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบ‚เบฐเบซเบ™เบฒเบ”เบ‚เบญเบ‡เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบ›เบฐเบซเบงเบฑเบ”เบชเบฒเบ” * เบšเปเปˆเบ›เปˆเบฝเบ™เปเบ›เบ‡เบซเบผเบฒเบเปเบฅเบฐเบ„เบงเบฒเบกเป„เบงเบเบฒเบ™เปเบŠเบเบˆเบฐเบšเปเปˆเบซเบผเบธเบ”เบฅเบปเบ‡เบ•เบฒเบกเป€เบงเบฅเบฒ.

เบเบฒเบ™เบชเป‰เบฒเบ‡เบžเบฒเบเบชเปˆเบงเบ™เปƒเบซเบกเปˆเปเบกเปˆเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เป‚เบ”เบเบŸเบฑเบ‡เบŠเบฑเบ™ plpgsql activity_hist.archive_current_activity. เบชเบนเบ”เบเบฒเบ™เบ„เบดเบ”เป„เบฅเปˆเบ‚เบญเบ‡เบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเปเบกเปˆเบ™เบ‡เปˆเบฒเบเบ”เบฒเบเบซเบผเบฒเบ (เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบžเบฒเบเบชเปเบฒเบฅเบฑเบšเบ•เบฒเบ•เบฐเบฅเบฒเบ‡ archive_pg_stat_activity).

เบชเป‰เบฒเบ‡เปเบฅเบฐเบ•เบทเปˆเบกเบ‚เปเป‰เบกเบนเบ™เปƒเบชเปˆเบžเบฒเบเปƒเบซเบกเปˆ

EXECUTE format(
'CREATE TABLE ' || partition_name || 
' PARTITION OF activity_hist.archive_pg_stat_activity FOR VALUES FROM ( %L ) TO ( %L ) ' , 
to_char(date_trunc('year', partition_min_range ),'YYYY')||'-'||
to_char(date_trunc('month', partition_min_range ),'MM')||'-'||
to_char(date_trunc('day', partition_min_range ),'DD')||' '||
to_char(date_trunc('hour', partition_min_range ),'HH24')||':00', 
to_char(date_trunc('year', partition_max_range ),'YYYY')||'-'||
to_char(date_trunc('month', partition_max_range ),'MM')||'-'||
to_char(date_trunc('day', partition_max_range ),'DD')||' '||
to_char(date_trunc('hour', partition_max_range ),'HH24')||':00'
);

INSERT INTO activity_hist.archive_pg_stat_activity
(
	SELECT 	* 
	FROM 	activity_hist.history_pg_stat_activity
	WHERE 	timepoint BETWEEN partition_min_range AND partition_max_range 		
);

เบเบฒเบ™เบชเป‰เบฒเบ‡เบ”เบฑเบ”เบชเบฐเบ™เบต

EXECUTE format	(
'CREATE INDEX '||index_name||
' ON '||partition_name||' ( wait_event_type , backend_type , timepoint )' 
);

EXECUTE format	('CREATE INDEX '||index_name||
' ON '||partition_name||' ( wait_event_type , backend_type , timepoint , queryid )' 
);

เบเบฒเบ™เป€เบญเบปเบฒเบ‚เปเป‰เบกเบนเบ™เป€เบเบปเปˆเบฒเบญเบญเบเบˆเบฒเบเบ•เบฒเบ•เบฐเบฅเบฒเบ‡ history_pg_stat_activity

DELETE 
FROM 	activity_hist.history_pg_stat_activity
WHERE 	timepoint < partition_max_range;

เปเบ™เปˆเบ™เบญเบ™, เปƒเบ™เบšเบฒเบ‡เป€เบงเบฅเบฒ, เบžเบฒเบเบชเปˆเบงเบ™เป€เบเบปเปˆเบฒเบ–เบทเบเบฅเบถเบšเบ–เบดเป‰เบกเป‚เบ”เบเบšเปเปˆเบˆเปเบฒเป€เบ›เบฑเบ™.

เบšเบปเบ”เบฅเบฒเบเบ‡เบฒเบ™เบžเบทเป‰เบ™เบ–เบฒเบ™

เปเบ—เป‰เบˆเบดเบ‡เปเบฅเป‰เบง, เป€เบ›เบฑเบ™เบซเบเบฑเบ‡เบ—เบฑเบ‡เบซเบกเบปเบ”เบ™เบตเป‰เบˆเบถเปˆเบ‡เบ–เบทเบเป€เบฎเบฑเบ”? เป€เบžเบทเปˆเบญเปƒเบซเป‰เป„เบ”เป‰เบฎเบฑเบšเบšเบปเบ”เบฅเบฒเบเบ‡เบฒเบ™เบ—เบตเปˆ reminiscent vaguely เบ‚เบญเบ‡ AWR เบ‚เบญเบ‡ Oracle.

เบกเบฑเบ™เป€เบ›เบฑเบ™เบชเบดเปˆเบ‡เบชเปเบฒเบ„เบฑเบ™เบ—เบตเปˆเบˆเบฐเป€เบžเบตเปˆเบกเบงเปˆเบฒเป€เบžเบทเปˆเบญเปƒเบซเป‰เป„เบ”เป‰เบฎเบฑเบšเบšเบปเบ”เบฅเบฒเบเบ‡เบฒเบ™, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบชเป‰เบฒเบ‡เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบฅเบฐเบซเบงเปˆเบฒเบ‡ pg_stat_activity เปเบฅเบฐ pg_stat_statements views. เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบ–เบทเบเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเป‚เบ”เบเบเบฒเบ™เป€เบžเบตเปˆเบกเบ–เบฑเบ™ 'queryid' เปƒเบชเปˆเบ•เบฒเบ•เบฐเบฅเบฒเบ‡ 'history_pg_stat_activity', 'archive_pg_stat_activity'. เบงเบดเบ—เบตเบเบฒเบ™เป€เบžเบตเปˆเบกเบ„เปˆเบฒเบ–เบฑเบ™เปเบกเปˆเบ™เป€เบเบตเบ™เบ‚เบญเบšเป€เบ‚เบ”เบ‚เบญเบ‡เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰ เปเบฅเบฐเป„เบ”เป‰เบญเบฐเบ—เบดเบšเบฒเบเบขเบนเปˆเบ—เบตเปˆเบ™เบตเป‰ โˆ’ pg_stat_statements + pg_stat_activity + loq_query = pg_ash? .

เป€เบงเบฅเบฒ CPU เบ—เบฑเบ‡เปเบปเบ”เบชเบณเบฅเบฑเบšเบเบฒเบ™เบชเบญเบšเบ–เบฒเบก

เบฎเป‰เบญเบ‡เบ‚เป:

WITH hist AS
(
SELECT 
	aa.query ,aa.queryid ,			
	count(*) * interval '1 second' AS duration 
FROM 	activity_hist.archive_pg_stat_activity aa
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 backend_type = 'client backend' AND datname != 'postgres' AND	( aa.wait_event_type IS NULL  ) ANDaa.state = 'active'
GROUP BY aa.wait_event_type , aa.wait_event , aa.query ,aa.queryid		
UNION 
SELECT 
	ha.query ,ha.queryid,
	count(*) * interval '1 second' AS duration 
FROM 	activity_hist.history_pg_stat_activity_for_reports ha
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 	backend_type = 'client backend' AND datname != 'postgres' AND ( ha.wait_event_type IS NULL  )AND ha.state = 'active'
GROUP BY ha.wait_event_type , ha.wait_event , ha.query ,ha.queryid		
)
SELECT 	query , queryid , SUM( duration ) as duration 
FROM hist
GROUP BY  query , queryid 
ORDER BY 3 DESC

เบ•เบปเบงเบขเปˆเบฒเบ‡:

-------------------------------------------------------------------
| TOTAL CPU TIME FOR QUERIES : 07:47:36
+----+----------------------------------------+--------------------
|   #|                                 queryid|            duration
+----+----------------------------------------+--------------------
|   1|                      389015618226997618|            04:28:58
|   2|                                        |            01:07:29
|   3|                     1237430309438971376|            00:59:38
|   4|                     4710212362688288619|            00:50:48
|   5|                       28942442626229688|            00:15:50
|   6|                     9150846928388977274|            00:04:46
|   7|                    -6572922443698419129|            00:00:06
|   8|                                        |            00:00:01
+----+----------------------------------------+--------------------

เป€เบงเบฅเบฒเบฅเปเบ–เป‰เบฒเบ—เบฑเบ‡เปเบปเบ”เบชเบณเบฅเบฑเบšเบเบฒเบ™เบชเบญเบšเบ–เบฒเบก

เบฎเป‰เบญเบ‡เบ‚เป:

WITH hist AS
(
SELECT 
	aa.query ,aa.queryid ,			
	count(*) * interval '1 second' AS duration 
FROM 	activity_hist.archive_pg_stat_activity aa
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 
	backend_type = 'client backend' AND datname != 'postgres' AND
	( aa.wait_event_type IS NOT NULL  ) 
GROUP BY aa.wait_event_type , aa.wait_event , aa.query ,aa.queryid		
UNION 
SELECT 
	ha.query ,ha.queryid,
	count(*) * interval '1 second' AS duration 
FROM 	activity_hist.history_pg_stat_activity_for_reports ha
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 
	backend_type = 'client backend' AND datname != 'postgres' AND				
	( ha.wait_event_type IS NOT NULL  )
GROUP BY ha.wait_event_type , ha.wait_event , ha.query ,ha.queryid		
)
SELECT 	query , queryid , SUM( duration ) as duration 
FROM hist
GROUP BY  query , queryid 
ORDER BY 3 DESC 

เบ•เบปเบงเบขเปˆเบฒเบ‡:

-------------------------------------------------------------------
| TOTAL WAITINGS TIME FOR QUERIES : 21:55:04
+----+----------------------------------------+--------------------
|   #|                                 queryid|            duration
+----+----------------------------------------+--------------------
|   1|                      389015618226997618|            16:19:05
|   2|                                        |            03:47:04
|   3|                     8085340880788646241|            00:40:20
|   4|                     4710212362688288619|            00:13:35
|   5|                     9150846928388977274|            00:12:25
|   6|                       28942442626229688|            00:11:32
|   7|                     1237430309438971376|            00:09:45
|   8|                     2649515222348904837|            00:09:37
|   9|                                        |            00:03:45
|  10|                     3167065002719415275|            00:02:20
|  11|                     5731212217001535134|            00:02:13
|  12|                     8304755792398128062|            00:01:31
|  13|                     2649515222348904837|            00:00:59
|  14|                     2649515222348904837|            00:00:22
|  15|                                        |            00:00:12
|  16|                     3422818749220588372|            00:00:08
|  17|                    -5730801771815999400|            00:00:03
|  18|                    -1473395109729441239|            00:00:02
|  19|                     2404820632950544954|            00:00:02
|  20|                    -6572922443698419129|            00:00:02
|  21|                     2369289265278398647|            00:00:01
|  22|                      180077086776069052|            00:00:01
+----+----------------------------------------+--------------------

เบฅเปเบ–เป‰เบฒเบเบฒเบ™เบชเบญเบšเบ–เบฒเบก

เบ„เบณเบฎเป‰เบญเบ‡เบ‚เป:

WITH hist AS
(
SELECT 
	aa.wait_event_type , aa.wait_event 
FROM 	activity_hist.archive_pg_stat_activity aa
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 
	backend_type = 'client backend' AND datname != 'postgres' AND
	aa.wait_event IS NOT NULL 
GROUP BY aa.wait_event_type , aa.wait_event
UNION 
SELECT 
	ha.wait_event_type , ha.wait_event 
FROM 	activity_hist.history_pg_stat_activity_for_reports ha
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 
	backend_type = 'client backend' AND datname != 'postgres' AND
	ha.wait_event IS NOT NULL 
GROUP BY ha.wait_event_type , ha.wait_event		
)
SELECT 	wait_event_type , wait_event 
FROM hist
GROUP BY wait_event_type , wait_event
ORDER BY 1 ASC,2 ASC

----------------------------------------------------------------------

WITH hist AS
(
SELECT 
	aa.wait_event_type , aa.wait_event , aa.query ,aa.queryid ,			
	count(*) * interval '1 second' AS duration 
FROM 	activity_hist.archive_pg_stat_activity aa
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 
	backend_type = 'client backend' AND datname != 'postgres' AND
	( aa.wait_event_type = waitings_stat_rec.wait_event_type AND aa.wait_event = waitings_stat_rec.wait_event )
GROUP BY aa.wait_event_type , aa.wait_event , aa.query ,aa.queryid		
UNION 
SELECT 
	ha.wait_event_type , ha.wait_event , ha.query ,ha.queryid,
	count(*) * interval '1 second' AS duration 
FROM 	activity_hist.history_pg_stat_activity_for_reports ha
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 
	backend_type = 'client backend' AND datname != 'postgres' AND				
	( ha.wait_event_type = waitings_stat_rec.wait_event_type AND ha.wait_event = waitings_stat_rec.wait_event )
GROUP BY ha.wait_event_type , ha.wait_event , ha.query ,ha.queryid		
)
SELECT 	query , queryid , SUM( duration ) as duration 
FROM hist
GROUP BY  query , queryid 
ORDER BY 3 DESC

เบ•เบปเบงเบขเปˆเบฒเบ‡:

------------------------------------------------
| WAITINGS FOR QUERIES
+-----------------------------------------------
|                      wait_event_type = Client|
|                       wait_event = ClientRead|
|                        Total time  = 00:46:56|
------------------------------------------------
|    #|             queryid|            duration
+-----+--------------------+--------------------
|    1| 8085340880788646241|            00:40:20
|    2|                    |            00:03:45
|    3| 5731212217001535134|            00:01:53
|    4|                    |            00:00:12
|    5| 9150846928388977274|            00:00:09
|    6| 3422818749220588372|            00:00:08
|    7| 1237430309438971376|            00:00:06
|    8|   28942442626229688|            00:00:05
|    9| 4710212362688288619|            00:00:05
|   10|-5730801771815999400|            00:00:03
|   11| 8304755792398128062|            00:00:02
|   12|-6572922443698419129|            00:00:02
|   13|-1473395109729441239|            00:00:02
|   14| 2404820632950544954|            00:00:02
|   15|  180077086776069052|            00:00:01
|   16| 2369289265278398647|            00:00:01

+-----------------------------------------------
|                          wait_event_type = IO|
|                      wait_event = BufFileRead|
|                        Total time  = 00:00:38|
------------------------------------------------
|    #|             queryid|            duration
+-----+--------------------+--------------------
|    1|   28942442626229688|            00:00:38

+-----------------------------------------------

เบ›เบฐเบซเบงเบฑเบ”เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบ—เบตเปˆเบ–เบทเบเบฅเบฑเบญเบ

เบฎเป‰เบญเบ‡เบ‚เป:

SELECT 
MIN(date_trunc('second',timepoint)) AS started , 
	count(*) * interval '1 second' as duration ,
	pid , blocking_pids , relation , mode , locktype 	 
FROM 
	activity_hist.archive_locking al 
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 AND 
	locktype = 'relation' 
GROUP BY pid , blocking_pids , relation , mode , locktype			
UNION
SELECT 
	MIN(date_trunc('second',timepoint)) AS started , 
	count(*) * interval '1 second' as duration ,
	pid , blocking_pids , relation , mode , locktype
FROM 
	activity_hist.history_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 AND 
	locktype = 'relation' 
GROUP BY pid , blocking_pids , relation , mode , locktype			
ORDER BY 1

เบ•เบปเบงเบขเปˆเบฒเบ‡:

------------------------------------------------ ------------------------------------------------ --------------------------------- | เบ›เบฐเบซเบงเบฑเบ”เบเบฒเบ™เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบ—เบตเปˆเบ–เบทเบเบฅเบฑเบญเบ +-----+----------+--------+--------+---------- --------+--------------------+--------------------- +-------------------- | #| pid| เป€เบฅเบตเปˆเบก| เป„เบฅเบเบฐเป€เบงเบฅเบฒ| blocking_pids| เบ„เบงเบฒเบกเบชเบณเบžเบฑเบ™| เป‚เปเบ”| locktype ----------+----------+-----+---------- +--------- -----------+-----------+----------------------+----- -------------- | 1| 26224| 2019-09-02 19:32:16| 00:01:45| {26211}| 16541| AccessShareLock| เบ„เบงเบฒเบกเบชเบณเบžเบฑเบ™ | 2| 26390| 2019-09-02 19:34:03| 00:00:53| {26211}| 16541| AccessShareLock| เบ„เบงเบฒเบกเบชเบณเบžเบฑเบ™ | 3| 26391| 2019-09-02 19:34:03| 00:00:53| {26211}| 16541| AccessShareLock| เบ„เบงเบฒเบกเบชเบณเบžเบฑเบ™ | 4| 26531| 2019-09-02 19:35:27| 00:00:12| {26211}| 16541| AccessShareLock| เบ„เบงเบฒเบกเบชเบณเบžเบฑเบ™ | 5| 27284| 2019-09-02 19:44:02| 00:00:19| {27276}| 16541| AccessShareLock| เบ„เบงเบฒเบกเบชเบณเบžเบฑเบ™ | 6| 27283| 2019-09-02 19:44:02| 00:00:19| {27276}| 16541| AccessShareLock| เบ„เบงเบฒเบกเบชเบณเบžเบฑเบ™ | 7| 27286| 2019-09-02 19:44:02| 00:00:19| {27276}| 16541| AccessShareLock| เบ„เบงเบฒเบกเบชเบณเบžเบฑเบ™ | 8| 27423| 2019-09-02 19:45:24| 00:00:12| {27394}| 16541| AccessShareLock| เบ„เบงเบฒเบกเบชเบณเบžเบฑเบ™ | 9| 27648| 2019-09-02 19:48:06| 00:00:20| {27647}| 16541| AccessShareLock| เบ„เบงเบฒเบกเบชเบณเบžเบฑเบ™ | 10| 27650| 2019-09-02 19:48:06| 00:00:20| {27647}| 16541| AccessShareLock| เบ„เบงเบฒเบกเบชเบณเบžเบฑเบ™ | 11| 27735| 2019-09-02 19:49:08| 00:00:06| {27650}| 16541| AccessExclusiveLock| เบ„เบงเบฒเบกเบชเบณเบžเบฑเบ™ | 12| 28380| 2019-09-02 19:56:03| 00:01:56| {28379}| 16541| AccessShareLock| เบ„เบงเบฒเบกเบชเบณเบžเบฑเบ™ | 13| 28379| 2019-09-02 19:56:03| 00:00:01| 28377| 16541| AccessExclusiveLock| เบ„เบงเบฒเบกเบชเบณเบžเบฑเบ™ | | | | | 28376| | 

เบเบฒเบ™เบ‚เบฑเบ”เบ‚เบงเบฒเบ‡เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบ›เบฐเบซเบงเบฑเบ”เบชเบฒเบ”

เบ„เบณเบฎเป‰เบญเบ‡เบ‚เป:

SELECT 
blocking_pids 
FROM 
	activity_hist.archive_locking al 
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 AND 
	locktype = 'relation' 
GROUP BY blocking_pids 		
UNION
SELECT 
	blocking_pids 
FROM 
	activity_hist.history_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 AND 
	locktype = 'relation' 
GROUP BY blocking_pids 		
ORDER BY 1

---------------------------------------------------------------

SELECT 
	pid , usename , application_name , datname ,
	MIN(date_trunc('second',timepoint)) as started , 
	count(*) * interval '1 second' as duration ,		 
	state , 
	query
				FROM  	activity_hist.archive_pg_stat_activity
				WHERE 	pid= current_pid AND 
						timepoint BETWEEN pg_stat_history_begin+(current_hour_diff * interval '1 hour') AND pg_stat_history_end+(current_hour_diff * interval '1 hour') 						 
				GROUP BY pid , usename , application_name , 
						datname , 
						state_change, 
						state , 
						query 
				UNION
				SELECT 
					pid , usename , application_name , datname ,
					MIN(date_trunc('second',timepoint)) as started , 
					count(*) * interval '1 second' as duration ,		 
					state , 
					query
				FROM  	activity_hist.history_pg_stat_activity_for_reports
				WHERE 	pid= current_pid AND 
						timepoint BETWEEN pg_stat_history_begin+(current_hour_diff * interval '1 hour') AND pg_stat_history_end+(current_hour_diff * interval '1 hour') 						 
				GROUP BY pid , usename , application_name , 
						datname , 
						state_change, 
						state , 
						query 
				ORDER BY 5 , 1

เบ•เบปเบงเบขเปˆเบฒเบ‡:

------------------------------------------------ ------------------------------------------------ ------------------------------------------------ ----------------------- เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบ›เบดเบ”เบเบฑเป‰เบ™เบ›เบฐเบซเบงเบฑเบ”เบเบฒเบ™ +----+----------+-------- ------------------------------------+---------------- ------+--------------------+--------------------- ----------+------------------------------------------------ | #| pid| เบŠเบทเปˆเปƒเบŠเป‰| application_name| เบŠเบทเปˆเบ‚เปเป‰เบกเบนเบ™| เป€เบฅเบตเปˆเบก| เป„เบฅเบเบฐเป€เบงเบฅเบฒ| เบฅเบฑเบ”| เบชเบญเบšเบ–เบฒเบก +----------+----------+----------+-----+ --------- ------------------------+---------------------+------ --------------------------+-------------------------------- ----------------- | 1| 26211| tuser| psql| tdb1| 2019-09-02 19:31:54| 00:00:04| idle| | 2| 26211| tuser| psql| tdb1| 2019-09-02 19:31:58| 00:00:06| idle เปƒเบ™เบ—เบธเบฅเบฐเบเปเบฒ| เป€เบฅเบตเปˆเบก; | 3| 26211| tuser| psql| tdb1| 2019-09-02 19:32:16| 00:01:45| idle เปƒเบ™เบ—เบธเบฅเบฐเบเปเบฒ| lock เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ wafer_data; | 4| 26211| tuser| psql| tdb1| 2019-09-02 19:35:54| 00:01:23| idle| เบ„เปเบฒเบซเบกเบฑเป‰เบ™เบชเบฑเบ™เบเบฒ; | 5| 26211| tuser| psql| tdb1| 2019-09-02 19:38:46| 00:00:02| idle เปƒเบ™เบ—เบธเบฅเบฐเบเปเบฒ| เป€เบฅเบตเปˆเบก; | 6| 26211| tuser| psql| tdb1| 2019-09-02 19:38:54| 00:00:08| idle เปƒเบ™เบ—เบธเบฅเบฐเบเปเบฒ| lock เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ wafer_data; | 7| 26211| tuser| psql| tdb1| 2019-09-02 19:39:08| 00:42:42| idle| เบ„เปเบฒเบซเบกเบฑเป‰เบ™เบชเบฑเบ™เบเบฒ; | 8| 26211| tuser| psql| tdb1| 2019-09-03 07:12:07| 00:00:52| เป€เบ„เบทเปˆเบญเบ™เป„เบซเบง| เป€เบฅเบทเบญเบ test_del();

เบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒ.

เบเบฒเบ™เบชเบญเบšเบ–เบฒเบกเบžเบทเป‰เบ™เบ–เบฒเบ™เบ—เบตเปˆเบชเบฐเปเบ”เบ‡เปƒเบซเป‰เป€เบซเบฑเบ™เปเบฅเบฐเบšเบปเบ”เบฅเบฒเบเบ‡เบฒเบ™เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเปเบฅเป‰เบงเป€เบฎเบฑเบ”เปƒเบซเป‰เบŠเบตเบงเบดเบ”เบ‡เปˆเบฒเบเบ‚เบถเป‰เบ™เบซเบผเบฒเบเป€เบกเบทเปˆเบญเบงเบดเป€เบ„เบฒเบฐเป€เบซเบ”เบเบฒเบ™เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”.
เบญเบตเบ‡เบ•เบฒเบกเบเบฒเบ™เบชเบญเบšเบ–เบฒเบกเบžเบทเป‰เบ™เบ–เบฒเบ™, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป„เบ”เป‰เบฎเบฑเบšเบšเบปเบ”เบฅเบฒเบเบ‡เบฒเบ™เบ—เบตเปˆเบ„เป‰เบฒเบเบ„เบทเบเบฑเบš AWR เบ‚เบญเบ‡ Oracle.
เบ•เบปเบงเบขเปˆเบฒเบ‡เบšเบปเบ”เบฅเบฒเบเบ‡เบฒเบ™เบชเบฐเบซเบผเบธเบš

+------------------------------------------------ ----------------------------------- | เบšเบปเบ”เบฅเบฒเบเบ‡เบฒเบ™เบฅเบงเบกเบชเปเบฒเบฅเบฑเบšเบเบดเบ”เบˆเบฐเบเปเบฒเปเบฅเบฐเบเบฒเบ™เบฅเปเบ–เป‰เบฒ. 

เบ•เบดเบ”โ€‹เบ•เบฒเบกโ€‹เบ•เบญเบ™โ€‹เบ•เปเปˆโ€‹เป„เบ›. เบ•เปเปˆเป„เบ›เปƒเบ™เปเบ–เบงเปเบกเปˆเบ™เบเบฒเบ™เบชเป‰เบฒเบ‡เบ›เบฐเบซเบงเบฑเบ”เบเบฒเบ™เบฅเบฑเบญเบ (pg_stat_locks), เบฅเบฒเบเบฅเบฐเบญเบฝเบ”เป€เบžเบตเปˆเบกเป€เบ•เบตเบกเบ‚เบญเบ‡เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบ•เบทเปˆเบกเบ•เบฒเบ•เบฐเบฅเบฒเบ‡.

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™