PostgreSQL-เดจเดพเดฏเดฟ เด’เดฐเต ASH เด…เดจเดฒเต‹เด—เต เดธเตƒเดทเตเดŸเดฟเด•เตเด•เดพเดจเตเดณเตเดณ เดถเตเดฐเดฎเด‚

เดชเตเดฐเดถเตเดจ เดชเตเดฐเดธเตเดคเดพเดตเดจ

PostgreSQL เด…เดจเตเดตเต‡เดทเดฃเด™เตเด™เตพ เด’เดชเตเดฑเตเดฑเดฟเดฎเตˆเดธเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเต, เด†เด•เตเดฑเตเดฑเดฟเดตเดฟเดฑเตเดฑเดฟ เดนเดฟเดธเตเดฑเตเดฑเดฑเดฟ เดตเดฟเดถเด•เดฒเดจเด‚ เดšเต†เดฏเตเดฏเดพเดจเตเดณเตเดณ เด•เดดเดฟเดตเต, เดชเตเดฐเดคเตเดฏเต‡เด•เดฟเดšเตเดšเต, เดตเต†เดฏเดฟเดฑเตเดฑเตเดธเต, เดฒเต‹เด•เตเด•เตเด•เตพ, เดŸเต‡เดฌเดฟเตพ เดธเตเดฑเตเดฑเดพเดฑเตเดฑเดฟเดธเตเดฑเตเดฑเดฟเด•เตเดธเต เดŽเดจเตเดจเดฟเดต เดตเดณเดฐเต† เด†เดตเดถเตเดฏเดฎเดพเดฃเต.

เดฒเดญเตเดฏเดฎเดพเดฏ เด…เดตเดธเดฐเด™เตเด™เตพ

เดšเดฐเดฟเดคเตเดฐเดชเดฐเดฎเดพเดฏ เดตเตผเด•เตเด•เต เดฒเต‹เดกเต เด…เดจเดพเดฒเดฟเดธเดฟเดธเต เดŸเต‚เตพ เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ "AWR for Postgres": เดตเดณเดฐเต† เดฐเดธเด•เดฐเดฎเดพเดฏ เด’เดฐเต เดชเดฐเดฟเดนเดพเดฐเด‚, เดŽเดจเตเดจเดพเตฝ pg_stat_activity, pg_locks เดŽเดจเตเดจเดฟเดตเดฏเตเดŸเต† เดšเดฐเดฟเดคเตเดฐเดฎเดฟเดฒเตเดฒ.

pgsentinel เดตเดฟเดชเตเดฒเต€เด•เดฐเดฃเด‚ :
ยซเดถเต‡เด–เดฐเดฟเดšเตเดš เดŽเดฒเตเดฒเดพ เดตเดฟเดตเดฐเด™เตเด™เดณเตเด‚ เดฑเดพเดฎเดฟเตฝ เดฎเดพเดคเตเดฐเดฎเต‡ เดธเด‚เดญเดฐเดฟเด•เตเด•เดชเตเดชเต†เดŸเตเด•เดฏเตเดณเตเดณเต‚, เด•เต‚เดŸเดพเดคเต† เด…เดตเดธเดพเดจเดฎเดพเดฏเดฟ เดธเด‚เดญเดฐเดฟเดšเตเดš เดฑเต†เด•เตเด•เต‹เตผเดกเตเด•เดณเตเดŸเต† เดŽเดฃเตเดฃเด‚ เด…เดจเตเดธเดฐเดฟเดšเตเดšเต เดฎเต†เดฎเตเดฎเดฑเดฟเดฏเตเดŸเต† เด‰เดชเดญเต‹เด—เด‚ เดจเดฟเดฏเดจเตเดคเตเดฐเดฟเด•เตเด•เดชเตเดชเต†เดŸเตเดจเตเดจเต.

เด•เตเดตเดฑเดฟเดกเต เดซเต€เตฝเดกเต เดšเต‡เตผเดคเตเดคเต - pg_stat_statements เดŽเด•เตเดธเตเดฑเตเดฑเตปเดทเดจเดฟเตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เด…เดคเต‡ เด•เตเดตเดฑเดฟเดกเต (เดชเตเดฐเต€-เด‡เตปเดธเตเดฑเตเดฑเดฒเต‡เดทเตป เด†เดตเดถเตเดฏเดฎเดพเดฃเต).ยซ

เด‡เดคเต เดคเต€เตผเดšเตเดšเดฏเดพเดฏเตเด‚ เดตเดณเดฐเต†เดฏเดงเดฟเด•เด‚ เดธเดนเดพเดฏเดฟเด•เตเด•เตเด‚, เดชเด•เตเดทเต‡ เดเดฑเตเดฑเดตเตเด‚ เดตเดฟเดทเดฎเด•เดฐเดฎเดพเดฏ เด•เดพเดฐเตเดฏเด‚ เด†เดฆเตเดฏ เดชเต‹เดฏเดฟเดจเตเดฑเดพเดฃเต.เดถเต‡เด–เดฐเดฟเดšเตเดš เดŽเดฒเตเดฒเดพ เดตเดฟเดตเดฐเด™เตเด™เดณเตเด‚ เดฑเดพเดฎเดฟเตฝ เดฎเดพเดคเตเดฐเดฎเต‡ เดธเด‚เดญเดฐเดฟเดšเตเดšเดฟเดŸเตเดŸเตเดณเตเดณเต‚ โ€, เด…เดคเดพเดฏเดคเต. เดฒเด•เตเดทเตเดฏ เด…เดŸเดฟเดคเตเดคเดฑเดฏเดฟเตฝ เดธเตเดตเดพเดงเต€เดจเดฎเตเดฃเตเดŸเต. เด•เต‚เดŸเดพเดคเต†, เดฒเต‹เด•เตเด•เต เดšเดฐเดฟเดคเตเดฐเดตเตเด‚ เดชเดŸเตเดŸเดฟเด• เดธเตเดฅเดฟเดคเดฟเดตเดฟเดตเดฐเด•เตเด•เดฃเด•เตเด•เตเด•เดณเตเด‚ เด‡เดฒเตเดฒ. เด†. เดชเดฐเดฟเดนเดพเดฐเด‚ เดชเตŠเดคเตเดตเต† เด…เดชเต‚เตผเดฃเตเดฃเดฎเดพเดฃเต: "เด‡เตปเดธเตเดฑเตเดฑเดพเดณเต‡เดทเดจเดพเดฏเดฟ เด‡เดคเตเดตเดฐเต† เด’เดฐเต เดฑเต†เดกเดฟเดฎเต†เดฏเตเดกเต เดชเดพเด•เตเด•เต‡เดœเต เด‡เดฒเตเดฒ. เด‰เดฑเดตเดฟเดŸเด™เตเด™เตพ เดกเต—เตบเดฒเต‹เดกเต เดšเต†เดฏเตเดฏเดพเดจเตเด‚ เดฒเตˆเดฌเตเดฐเดฑเดฟ เดธเตเดตเดฏเด‚ เด•เต‚เดŸเตเดŸเดฟเดšเตเดšเต‡เตผเด•เตเด•เดพเดจเตเด‚ เดจเดฟเตผเดฆเตเดฆเต‡เดถเดฟเด•เตเด•เตเดจเตเดจเต. เดจเดฟเด™เตเด™เตพ เด†เดฆเตเดฏเด‚ เดจเดฟเด™เตเด™เดณเตเดŸเต† เดธเต†เตผเดตเดฑเดฟเดจเดพเดฏเดฟ "devel" เดชเดพเด•เตเด•เต‡เดœเต เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดฏเตเด•เดฏเตเด‚ PATH เดตเต‡เดฐเดฟเดฏเดฌเดฟเดณเดฟเตฝ pg_config-เดฒเต‡เด•เตเด•เต เดชเดพเดคเตเดคเต เดธเดœเตเดœเดฎเดพเด•เตเด•เตเด•เดฏเตเด‚ เดตเต‡เดฃเด‚.".

เดชเตŠเดคเตเดตเต‡, เดงเดพเดฐเดพเดณเด‚ เดฌเดนเดณเด™เตเด™เตพ เด‰เดฃเตเดŸเต, เด—เตเดฐเตเดคเดฐเดฎเดพเดฏ เดชเตเดฐเตŠเดกเด•เตเดทเตป เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเตเด•เดณเตเดŸเต† เด•เดพเดฐเตเดฏเดคเตเดคเดฟเตฝ, เดธเต†เตผเดตเตผ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด’เดจเตเดจเตเด‚ เดšเต†เดฏเตเดฏเดพเตป เด•เดดเดฟเดžเตเดžเต‡เด•เตเด•เดฟเดฒเตเดฒ. เดจเดฎเตเด•เตเด•เต เดตเต€เดฃเตเดŸเตเด‚ เดธเตเดตเดจเตเดคเดฎเดพเดฏเดฟ เดŽเดจเตเดคเต†เด™เตเด•เดฟเดฒเตเด‚ เด•เตŠเดฃเตเดŸเตเดตเดฐเดฃเด‚.

เดฎเตเดจเตเดจเดฑเดฟเดฏเดฟเดชเตเดชเต

เดตเดฒเดฟเดฏ เดตเต‹เดณเดฟเดฏเด‚ เด•เดพเดฐเดฃเด‚, เด…เดชเต‚เตผเดฃเตเดฃเดฎเดพเดฏ เดŸเต†เดธเตเดฑเตเดฑเดฟเด‚เด—เต เด•เดพเดฒเดฏเดณเดตเต เด•เดพเดฐเดฃเด‚, เดฒเต‡เด–เดจเด‚ เดชเตเดฐเดงเดพเดจเดฎเดพเดฏเตเด‚ เดตเดฟเดตเดฐเดฆเดพเดฏเด• เด†เดตเดถเตเดฏเด™เตเด™เตพเด•เตเด•เดพเดฏเดพเดฃเต, เดชเด•เดฐเด‚ เดชเตเดฐเดฌเดจเตเดงเด™เตเด™เดณเตเดŸเต†เดฏเตเด‚ เด‡เดจเตเดฑเตผเดฎเต€เดกเดฟเดฏเดฑเตเดฑเต เดซเดฒเด™เตเด™เดณเตเดŸเต†เดฏเตเด‚ เด’เดฐเต เด•เต‚เดŸเตเดŸเด‚.
เด•เต‚เดŸเตเดคเตฝ เดตเดฟเดถเดฆเดฎเดพเดฏ เดฎเต†เดฑเตเดฑเต€เดฐเดฟเดฏเตฝ เดชเดฟเดจเตเดจเต€เดŸเต เดญเดพเด—เด™เตเด™เดณเดฟเตฝ เดคเดฏเตเดฏเดพเดฑเดพเด•เตเด•เตเด‚

เดชเดฐเดฟเดนเดพเดฐเดคเตเดคเดฟเดจเตเดณเตเดณ เดกเตเดฐเดพเดซเตเดฑเตเดฑเต เด†เดตเดถเตเดฏเด•เดคเด•เตพ

เดธเด‚เดญเดฐเดฟเด•เตเด•เดพเตป เดจเดฟเด™เตเด™เดณเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจ เด’เดฐเต เด‰เดชเด•เดฐเดฃเด‚ เดตเดฟเด•เดธเดฟเดชเตเดชเดฟเด•เตเด•เต‡เดฃเตเดŸเดคเต เด†เดตเดถเตเดฏเดฎเดพเดฃเต:

pg_stat_activity เด•เดพเดดเตเดš เดšเดฐเดฟเดคเตเดฐเด‚
pg_locks เดตเตเดฏเต‚ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดธเต†เดทเตป เดฒเต‹เด•เตเด•เต เดšเดฐเดฟเดคเตเดฐเด‚

เดชเดฐเดฟเดนเดพเดฐ เด†เดตเดถเตเดฏเด•เดค- เดŸเดพเตผเด—เต†เดฑเตเดฑเต เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเดฟเดฒเต† เดธเตเดตเดพเดงเต€เดจเด‚ เด•เตเดฑเดฏเตเด•เตเด•เตเด•.

เดชเตŠเดคเตเดตเดพเดฏ เด†เดถเดฏเด‚- เดกเดพเดฑเตเดฑเดพ เด•เดณเด•เตเดทเตป เดเดœเดจเตเดฑเต เดธเดฎเดพเดฐเด‚เดญเดฟเด•เตเด•เตเดจเตเดจเดคเต เดŸเดพเตผเด—เต†เดฑเตเดฑเต เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเดฟเดฒเดฒเตเดฒ, เดฎเดฑเดฟเดšเตเดšเต เด’เดฐเต systemd เดธเต‡เดตเดจเดฎเดพเดฏเดฟ เดฎเต‹เดฃเดฟเดฑเตเดฑเดฑเดฟเด‚เด—เต เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเดฟเดฒเดพเดฃเต. เด…เดคเต†, เดšเดฟเดฒ เดกเดพเดฑเตเดฑ เดจเดทเตเดŸเด‚ เดธเดพเดงเตเดฏเดฎเดพเดฃเต, เดชเด•เตเดทเต‡ เด‡เดคเต เดฑเดฟเดชเตเดชเต‹เตผเดŸเตเดŸเดฟเด‚เด—เดฟเดจเต เดจเดฟเตผเดฃเดพเดฏเด•เดฎเดฒเตเดฒ, เดŽเดจเตเดจเดพเตฝ เดฎเต†เดฎเตเดฎเดฑเดฟเดฏเตเดŸเต†เดฏเตเด‚ เดกเดฟเดธเตเด•เต เดธเตเดฅเดฒเดคเตเดคเดฟเดจเตเดฑเต†เดฏเตเด‚ เด•เดพเดฐเตเดฏเดคเตเดคเดฟเตฝ เดŸเดพเตผเด—เต†เดฑเตเดฑเต เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเดฟเตฝ เดฏเดพเดคเตŠเดฐเต เดธเตเดตเดพเดงเต€เดจเดตเตเดฎเดฟเดฒเตเดฒ. เด’เดฐเต เด•เดฃเด•เตเดทเตป เดชเต‚เตพ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจ เด•เดพเดฐเตเดฏเดคเตเดคเดฟเตฝ, เด‰เดชเดฏเต‹เด•เตเดคเตƒ เดชเตเดฐเด•เตเดฐเดฟเดฏเด•เดณเดฟเดฒเต† เดธเตเดตเดพเดงเต€เดจเด‚ เดตเดณเดฐเต† เด•เตเดฑเดตเดพเดฃเต.

เดจเดŸเดชเตเดชเดพเด•เตเด•เตฝ เด˜เดŸเตเดŸเด™เตเด™เตพ

1. เดธเต‡เดตเดจ เดชเดŸเตเดŸเดฟเด•เด•เตพ

เดŸเต‡เดฌเดฟเดณเตเด•เตพ เดธเด‚เดญเดฐเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เด’เดฐเต เดชเตเดฐเดคเตเดฏเต‡เด• เดธเตเด•เต€เดฎ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต, เด…เดคเดฟเดจเดพเตฝ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดš เดชเตเดฐเดงเดพเดจ เดชเดŸเตเดŸเดฟเด•เด•เดณเตเดŸเต† เดตเดฟเดถเด•เดฒเดจเด‚ เดธเด™เตเด•เต€เตผเดฃเตเดฃเดฎเดพเด•เตเด•เดฐเตเดคเต.

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

เดชเตเดฐเดงเดพเดจเดชเตเดชเต†เดŸเตเดŸเดคเต: เดธเตเด•เต€เดฎ เดธเตƒเดทเตเดŸเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเดคเต เดŸเดพเตผเด—เต†เดฑเตเดฑเต เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเดฟเตฝ เด…เดฒเตเดฒ, เดฎเต‹เดฃเดฟเดฑเตเดฑเดฑเดฟเด‚เด—เต เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเดฟเดฒเดพเดฃเต.

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. เดจเดฟเดฒเดตเดฟเดฒเต† เดšเดฐเดฟเดคเตเดฐเด‚ เดชเต‚เดฐเดฟเดชเตเดชเดฟเด•เตเด•เตฝ

เด•เดพเดดเตเดš เดธเตเดจเดพเดชเตเดชเตเดทเต‹เดŸเตเดŸเตเด•เตพ เดจเต‡เดฐเดฟเดŸเตเดŸเต เดถเต‡เด–เดฐเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต, 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;

เด•เดพเดดเตเดš เดธเตเดจเดพเดชเตเดชเตเดทเต‹เดŸเตเดŸเตเด•เตพ เดถเต‡เด–เดฐเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต, systemd เดธเต‡เดตเดจเดตเตเด‚ เดฐเดฃเตเดŸเต เดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเตเด•เดณเตเด‚ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต:

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 เดกเต†เดฎเตบ-เดฑเต€เดฒเต‹เดกเต เดšเต†เดฏเตเดฏเตเด•
# systemctl เด†เดฐเด‚เดญเดฟเด•เตเด•เตเด• pg_current_activity.service

เด…เด™เตเด™เดจเต†, เด•เดพเดดเตเดšเด•เดณเตเดŸเต† เดšเดฐเดฟเดคเตเดฐเด‚ เดธเต†เด•เตเด•เตปเดกเต-เดฌเตˆ-เดธเต†เด•เตเด•เตปเดกเต เดธเตเดจเดพเดชเตเดชเตเดทเต‹เดŸเตเดŸเตเด•เดณเตเดŸเต† เดฐเต‚เดชเดคเตเดคเดฟเตฝ เดถเต‡เด–เดฐเดฟเด•เตเด•เตเดจเตเดจเต. เดคเต€เตผเดšเตเดšเดฏเดพเดฏเตเด‚, เดŽเดฒเตเดฒเดพเด‚ เด…เดคเต‡เดชเดŸเดฟ เด…เดตเดถเต‡เดทเดฟเด•เตเด•เตเดจเตเดจเตเดตเต†เด™เตเด•เดฟเตฝ, เดชเดŸเตเดŸเดฟเด•เด•เตพ เดตเดณเดฐเต† เดตเต‡เด—เดคเตเดคเดฟเตฝ เดตเดฒเตเดชเตเดชเด‚ เดตเตผเดฆเตเดงเดฟเดชเตเดชเดฟเด•เตเด•เตเด•เดฏเตเด‚ เด•เต‚เดŸเตเดคเดฒเต‹ เด•เตเดฑเดตเต‹ เด‰เตฝเดชเตเดชเดพเดฆเดจเด•เตเดทเดฎเดคเดฏเตเดณเตเดณ เดœเต‹เดฒเดฟ เด…เดธเดพเดงเตเดฏเดฎเดพเดตเตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเด‚.

เดกเดพเดฑเตเดฑ เด†เตผเด•เตเด•เตˆเดตเดฟเด‚เด—เต เดธเด‚เด˜เดŸเดฟเดชเตเดชเดฟเด•เตเด•เต‡เดฃเตเดŸเดคเต เด†เดตเดถเตเดฏเดฎเดพเดฃเต.

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;

เดคเต€เตผเดšเตเดšเดฏเดพเดฏเตเด‚, เด•เดพเดฒเดพเด•เดพเดฒเด™เตเด™เดณเดฟเตฝ, เดชเดดเดฏ เดตเดฟเดญเดพเด—เด™เตเด™เตพ เด…เดจเดพเดตเดถเตเดฏเดฎเดพเดฏเดฟ เด‡เดฒเตเดฒเดพเดคเดพเด•เตเด•เตเดจเตเดจเต.

เด…เดŸเดฟเดธเตเดฅเดพเดจ เดฑเดฟเดชเตเดชเต‹เตผเดŸเตเดŸเตเด•เตพ

เดตเดพเดธเตเดคเดตเดคเตเดคเดฟเตฝ, เดŽเดจเตเดคเตเด•เตŠเดฃเตเดŸเดพเดฃเต เด‡เดคเต†เดฒเตเดฒเดพเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเต? เด’เดฑเดพเด•เตเด•เดฟเดณเดฟเดจเตเดฑเต† AWR-เดจเต† เดตเดณเดฐเต† เด…เดตเตเดฏเด•เตเดคเดฎเดพเดฏเดฟ เด…เดจเตเดธเตเดฎเดฐเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจ เดฑเดฟเดชเตเดชเต‹เตผเดŸเตเดŸเตเด•เตพ เดฒเดญเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต.

เดฑเดฟเดชเตเดชเต‹เตผเดŸเตเดŸเตเด•เตพ เดฒเดญเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต, pg_stat_activity, pg_stat_statements เด•เดพเดดเตโ€Œเดšเด•เตพ เดŽเดจเตเดจเดฟเดตเดฏเตโ€Œเด•เตเด•เดฟเดŸเดฏเดฟเตฝ เดจเดฟเด™เตเด™เตพ เด’เดฐเต เด•เดฃเด•เตเดทเตป เดจเดฟเตผเดฎเตเดฎเดฟเด•เตเด•เต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต†เดจเตเดจเต เดšเต‡เตผเด•เตเด•เต‡เดฃเตเดŸเดคเต เดชเตเดฐเดงเดพเดจเดฎเดพเดฃเต. 'history_pg_stat_activity', 'archive_pg_stat_activity' เดชเดŸเตเดŸเดฟเด•เด•เดณเดฟเดฒเต‡เด•เตเด•เต เด’เดฐเต 'queryid' เด•เต‹เดณเด‚ เดšเต‡เตผเดคเตเดคเดพเดฃเต เดชเดŸเตเดŸเดฟเด•เด•เตพ เดฒเดฟเด™เตเด•เต เดšเต†เดฏเตเดคเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเดคเต. เด’เดฐเต เด•เต‹เดณเด‚ เดฎเต‚เดฒเตเดฏเด‚ เดšเต‡เตผเด•เตเด•เตเดจเตเดจ เดฐเต€เดคเดฟ เดˆ เดฒเต‡เด–เดจเดคเตเดคเดฟเดจเตเดฑเต† เดชเดฐเดฟเดงเดฟเด•เตเด•เดชเตเดชเตเดฑเดฎเดพเดฃเต, เด‡เดตเดฟเดŸเต† เดตเดฟเดตเดฐเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต - pg_stat_statements + pg_stat_activity + loq_query = pg_ash? .

เดšเต‹เดฆเตเดฏเด™เตเด™เตพเด•เตเด•เตเดณเตเดณ เดฎเตŠเดคเตเดคเด‚ เดธเดฟเดชเดฟเดฏเต เดธเดฎเดฏเด‚

เด…เดญเตเดฏเตผเดคเตเดฅเดจ:

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| เด†เดฐเด‚เดญเดฟเดšเตเดšเต| เด•เดพเดฒเดพเดตเดงเดฟ| เดฌเตเดฒเต‹เด•เตเด•เดฟเด‚เด—เต_เดชเดฟเดกเตเด•เตพ| เดฌเดจเตเดงเด‚| เดฎเต‹เดกเต| เดฒเต‹เด•เตเด•เตเดŸเตˆเดชเตเดชเต +----------+-----------+-------+------------ +--------- -----------+------------+----------------------+------ ------------- | 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| เด‰เดชเดฏเต‹เด—เดจเดพเดฎเด‚| เด…เดชเต‡เด•เตเดท_เดชเต‡เดฐเต| datname| เด†เดฐเด‚เดญเดฟเดšเตเดšเต| เด•เดพเดฒเดพเดตเดงเดฟ| เดธเด‚เดธเตเดฅเดพเดจ| เดšเต‹เดฆเตเดฏเด‚ +------------+----------+------------+-------+ ---------- -+--------------------------------------------------------------- ------------------------------------------------------------- ---------------- | 1| 26211| เดŸเตเดฏเต‚เดธเตผ| psql| tdb1| 2019-09-02 19:31:54| 00:00:04| เดจเดฟเดทเตเด•เตเดฐเดฟเดฏเด‚| | 2| 26211| เดŸเตเดฏเต‚เดธเตผ| psql| tdb1| 2019-09-02 19:31:58| 00:00:06| เด‡เดŸเดชเดพเดŸเดฟเตฝ เดจเดฟเดทเตเด•เตเดฐเดฟเดฏเด‚| เด†เดฐเด‚เดญเดฟเด•เตเด•เตเดจเตเดจเต; | 3| 26211| เดŸเตเดฏเต‚เดธเตผ| psql| tdb1| 2019-09-02 19:32:16| 00:01:45| เด‡เดŸเดชเดพเดŸเดฟเตฝ เดจเดฟเดทเตเด•เตเดฐเดฟเดฏเด‚| เดฒเต‹เด•เตเด•เต เดŸเต‡เดฌเดฟเตพ เดตเต‡เดซเตผ_เดกเดพเดฑเตเดฑ; | 4| 26211| เดŸเตเดฏเต‚เดธเตผ| psql| tdb1| 2019-09-02 19:35:54| 00:01:23| เดจเดฟเดทเตเด•เตเดฐเดฟเดฏเด‚| เดชเตเดฐเดคเดฟเดฌเดฆเตเดงเดค; | 5| 26211| เดŸเตเดฏเต‚เดธเตผ| psql| tdb1| 2019-09-02 19:38:46| 00:00:02| เด‡เดŸเดชเดพเดŸเดฟเตฝ เดจเดฟเดทเตเด•เตเดฐเดฟเดฏเด‚| เด†เดฐเด‚เดญเดฟเด•เตเด•เตเดจเตเดจเต; | 6| 26211| เดŸเตเดฏเต‚เดธเตผ| psql| tdb1| 2019-09-02 19:38:54| 00:00:08| เด‡เดŸเดชเดพเดŸเดฟเตฝ เดจเดฟเดทเตเด•เตเดฐเดฟเดฏเด‚| เดฒเต‹เด•เตเด•เต เดŸเต‡เดฌเดฟเตพ เดตเต‡เดซเตผ_เดกเดพเดฑเตเดฑ; | 7| 26211| เดŸเตเดฏเต‚เดธเตผ| psql| tdb1| 2019-09-02 19:39:08| 00:42:42| เดจเดฟเดทเตเด•เตเดฐเดฟเดฏเด‚| เดชเตเดฐเดคเดฟเดฌเดฆเตเดงเดค; | 8| 26211| เดŸเตเดฏเต‚เดธเตผ| psql| tdb1| 2019-09-03 07:12:07| 00:00:52| เดธเดœเต€เดตเดฎเดพเดฏ| test_del() เดคเดฟเดฐเดžเตเดžเต†เดŸเตเด•เตเด•เตเด•;

เดตเดฟเด•เดธเดจเด‚.

เดชเตเดฐเด•เดŸเดจ เดธเด‚เดญเดตเด™เตเด™เตพ เดตเดฟเดถเด•เดฒเดจเด‚ เดšเต†เดฏเตเดฏเตเดฎเตเดชเต‹เตพ เด•เดพเดฃเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจ เด…เดŸเดฟเดธเตเดฅเดพเดจ เด…เดจเตเดตเต‡เดทเดฃเด™เตเด™เดณเตเด‚ เดซเดฒเดฎเดพเดฏเตเดฃเตเดŸเดพเด•เตเดจเตเดจ เดฑเดฟเดชเตเดชเต‹เตผเดŸเตเดŸเตเด•เดณเตเด‚ เด‡เดคเดฟเดจเด•เด‚ เดคเดจเตเดจเต† เดœเต€เดตเดฟเดคเด‚ เดตเดณเดฐเต† เดŽเดณเตเดชเตเดชเดฎเดพเด•เตเด•เตเดจเตเดจเต.
เด…เดŸเดฟเดธเตเดฅเดพเดจ เด…เดจเตเดตเต‡เดทเดฃเด™เตเด™เดณเต† เด…เดŸเดฟเดธเตเดฅเดพเดจเดฎเดพเด•เตเด•เดฟ, Oracle-เดจเตเดฑเต† AWR-เดจเต‹เดŸเต เด…เดตเตเดฏเด•เตเดคเดฎเดพเดฏเดฟ เดธเดพเดฎเตเดฏเดฎเตเดณเตเดณ เด’เดฐเต เดฑเดฟเดชเตเดชเต‹เตผเดŸเตเดŸเต เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดฒเดญเดฟเด•เตเด•เตเด‚.
เดธเด‚เด—เตเดฐเดน เดฑเดฟเดชเตเดชเต‹เตผเดŸเตเดŸเต เด‰เดฆเดพเดนเดฐเดฃเด‚

+------------------------------------------------ ---------------------------------- | เดชเตเดฐเดตเตผเดคเตเดคเดจเดคเตเดคเดฟเดจเตเด‚ เด•เดพเดคเตเดคเดฟเดฐเดฟเดชเตเดชเตเด•เตพเด•เตเด•เตเดฎเดพเดฏเดฟ เดเด•เต€เด•เตƒเดค เดฑเดฟเดชเตเดชเต‹เตผเดŸเตเดŸเต. 

เดคเตเดŸเดฐเตเด‚. เดตเดฐเดฟเดฏเดฟเตฝ เด…เดŸเตเดคเตเดคเดคเต เด’เดฐเต เดฒเต‹เด•เตเด•เต เดšเดฐเดฟเดคเตเดฐเดคเตเดคเดฟเดจเตเดฑเต† (pg_stat_locks) เดธเตƒเดทเตเดŸเดฟเดฏเดพเดฃเต, เดชเดŸเตเดŸเดฟเด•เด•เตพ เดชเต‚เดฐเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจ เดชเตเดฐเด•เตเดฐเดฟเดฏเดฏเตเดŸเต† เด•เต‚เดŸเตเดคเตฝ เดตเดฟเดถเดฆเดฎเดพเดฏ เดตเดฟเดตเดฐเดฃเด‚.

เด…เดตเดฒเด‚เดฌเด‚: www.habr.com

เด’เดฐเต เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚ เดšเต‡เตผเด•เตเด•เตเด•