PostgreSQL เจฒเจˆ ASH เจเจจเจพเจฒเจพเจ— เจฌเจฃเจพเจ‰เจฃ เจฆเฉ€ เจ•เฉ‹เจธเจผเจฟเจธเจผ

เจธเจฎเฉฑเจธเจฟเจ† เจฆเจพ เจ—เจ เจจ

PostgreSQL เจธเจตเจพเจฒเจพเจ‚ เจจเฉ‚เฉฐ เจ…เจจเฉเจ•เฉ‚เจฒ เจฌเจฃเจพเจ‰เจฃ เจฒเจˆ, เจธเจฐเจ—เจฐเจฎเฉ€ เจฆเฉ‡ เจ‡เจคเจฟเจนเจพเจธ เจฆเจพ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ เจ•เจฐเจจ เจฆเฉ€ เจฏเฉ‹เจ—เจคเจพ, เจ–เจพเจธ เจคเฉŒเจฐ 'เจคเฉ‡, เจ‰เจกเฉ€เจ•, เจคเจพเจฒเฉ‡ เจ…เจคเฉ‡ เจธเจพเจฐเจฃเฉ€ เจฆเฉ‡ เจ…เฉฐเจ•เฉœเฉ‡, เจฌเจนเฉเจค เจฒเฉ‹เฉœเฉ€เจ‚เจฆเฉ‡ เจนเจจเฅค

เจ‰เจชเจฒเจฌเจง เจฎเฉŒเจ•เฉ‡

เจ‡เจคเจฟเจนเจพเจธเจ• เจตเจฐเจ•เจฒเฉ‹เจก เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ เจŸเฉ‚เจฒ เจœเจพเจ‚ "เจชเฉ‹เจธเจŸเจ—เฉเจฐเฉ‡เจธ เจฒเจˆ AWR": เจ‡เฉฑเจ• เจฌเจนเฉเจค เจนเฉ€ เจฆเจฟเจฒเจšเจธเจช เจนเฉฑเจฒ เจนเฉˆ, เจชเจฐ pg_stat_activity เจ…เจคเฉ‡ pg_locks เจฆเจพ เจ•เฉ‹เจˆ เจ‡เจคเจฟเจนเจพเจธ เจจเจนเฉ€เจ‚ เจนเฉˆเฅค

pgsentinel เจเจ•เจธเจŸเฉˆเจ‚เจธเจผเจจ :
ยซเจธเจพเจฐเฉ€ เจ‡เจ•เฉฑเจคเจฐ เจ•เฉ€เจคเฉ€ เจœเจพเจฃเจ•เจพเจฐเฉ€ เจ•เฉ‡เจตเจฒ RAM เจตเจฟเฉฑเจš เจธเจŸเฉ‹เจฐ เจ•เฉ€เจคเฉ€ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆ, เจ…เจคเฉ‡ เจฎเฉˆเจฎเฉ‹เจฐเฉ€ เจฆเฉ€ เจ–เจชเจค เจ•เฉ€เจคเฉ€ เจฎเจพเจคเจฐเจพ เจจเฉ‚เฉฐ เจชเจฟเจ›เจฒเฉ‡ เจธเจŸเฉ‹เจฐ เจ•เฉ€เจคเฉ‡ เจฐเจฟเจ•เจพเจฐเจกเจพเจ‚ เจฆเฉ€ เจธเฉฐเจ–เจฟเจ† เจฆเฉเจ†เจฐเจพ เจจเจฟเจฏเฉฐเจคเฉเจฐเจฟเจค เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค

queryid เจซเฉ€เจฒเจก เจจเฉ‚เฉฐ เจœเฉ‹เฉœเจฟเจ† เจ—เจฟเจ† เจนเฉˆ - pg_stat_statements เจเจ•เจธเจŸเฉˆเจ‚เจธเจผเจจ เจคเฉ‹เจ‚ เจ‰เจนเฉ€ queryid (เจชเฉ‚เจฐเจต-เจ‡เฉฐเจธเจŸเจพเจฒเฉ‡เจธเจผเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ)เฅคยซ

เจ‡เจน, เจฌเฉ‡เจธเจผเฉฑเจ•, เจฌเจนเฉเจค เจฎเจฆเจฆ เจ•เจฐเฉ‡เจ—เจพ, เจชเจฐ เจธเจญ เจคเฉ‹เจ‚ เจฎเฉเจธเจผเจ•เจฒ เจ—เฉฑเจฒ เจ‡เจน เจนเฉˆ เจ•เจฟ เจชเจนเจฟเจฒเจพ เจฌเจฟเฉฐเจฆเฉ‚ เจนเฉˆเฅคเจธเจพเจฐเฉ€ เจ‡เจ•เฉฑเจคเจฐ เจ•เฉ€เจคเฉ€ เจœเจพเจฃเจ•เจพเจฐเฉ€ เจ•เฉ‡เจตเจฒ RAM เจตเจฟเฉฑเจš เจธเจŸเฉ‹เจฐ เจ•เฉ€เจคเฉ€ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆ โ€, i.e. เจŸเฉ€เจšเฉ‡ เจฆเฉ‡ เจ…เจงเจพเจฐ 'เจคเฉ‡ เจชเฉเจฐเจญเจพเจต เจนเฉˆเฅค เจ‡เจธ เจคเฉ‹เจ‚ เจ‡เจฒเจพเจตเจพ, เจ•เฉ‹เจˆ เจฒเจพเจ• เจ‡เจคเจฟเจนเจพเจธ เจ…เจคเฉ‡ เจธเจพเจฐเจฃเฉ€ เจฆเฉ‡ เจ…เฉฐเจ•เฉœเฉ‡ เจจเจนเฉ€เจ‚ เจนเจจ. เจ‰เจน. เจนเฉฑเจฒ เจ†เจฎ เจคเฉŒเจฐ 'เจคเฉ‡ เจ…เจงเฉ‚เจฐเจพ เจฌเฉ‹เจฒ เจฐเจฟเจนเจพ เจนเฉˆ: "เจ…เจœเฉ‡ เจคเฉฑเจ• เจ‡เฉฐเจธเจŸเจพเจฒเฉ‡เจธเจผเจจ เจฒเจˆ เจ•เฉ‹เจˆ เจคเจฟเจ†เจฐ เจชเฉˆเจ•เฉ‡เจœ เจจเจนเฉ€เจ‚ เจนเฉˆเฅค เจธเจฐเฉ‹เจคเจพเจ‚ เจจเฉ‚เฉฐ เจกเจพเจŠเจจเจฒเฉ‹เจก เจ•เจฐเจจ เจ…เจคเฉ‡ เจฒเจพเจ‡เจฌเฉเจฐเฉ‡เจฐเฉ€ เจจเฉ‚เฉฐ เจ†เจชเจฃเฉ‡ เจ†เจช เจ‡เจ•เฉฑเจ เจพ เจ•เจฐเจจ เจฆเจพ เจธเฉเจเจพเจ… เจฆเจฟเฉฑเจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค เจคเฉเจนเจพเจจเฉ‚เฉฐ เจชเจนเจฟเจฒเจพเจ‚ เจ†เจชเจฃเฉ‡ เจธเจฐเจตเจฐ เจฒเจˆ โ€œdevelโ€ เจชเฉˆเจ•เฉ‡เจœ เจจเฉ‚เฉฐ เจธเจฅเจพเจชเจฟเจค เจ•เจฐเจจ เจ…เจคเฉ‡ PATH เจตเฉ‡เจฐเฉ€เจเจฌเจฒ เจตเจฟเฉฑเจš pg_config เจฒเจˆ เจฎเจพเจฐเจ— เจธเฉˆเฉฑเจŸ เจ•เจฐเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆเฅค".

เจ†เจฎ เจคเฉŒเจฐ 'เจคเฉ‡, เจฌเจนเฉเจค เจœเจผเจฟเจ†เจฆเจพ เจ—เฉœเจฌเฉœ เจนเฉเฉฐเจฆเฉ€ เจนเฉˆ, เจ…เจคเฉ‡ เจ—เฉฐเจญเฉ€เจฐ เจ‰เจคเจชเจพเจฆเจจ เจกเฉ‡เจŸเจพเจฌเฉ‡เจธ เจฆเฉ‡ เจฎเจพเจฎเจฒเฉ‡ เจตเจฟเฉฑเจš, เจธเจฐเจตเจฐ เจจเจพเจฒ เจ•เฉเจ เจ•เจฐเจจเจพ เจธเฉฐเจญเจต เจจเจนเฉ€เจ‚ เจนเฉ‹ เจธเจ•เจฆเจพ เจนเฉˆ. เจธเจพเจจเฉ‚เฉฐ เจ†เจชเจฃเฉ€ เจ–เฉเจฆ เจฆเฉ€ เจšเฉ€เจœเจผ เจจเจพเจฒ เจฆเฉเจฌเจพเจฐเจพ เจ†เจ‰เจฃ เจฆเฉ€ เจœเจผเจฐเฉ‚เจฐเจค เจนเฉˆ.

เจšเฉ‡เจคเจพเจตเจจเฉ€

เจตเฉฑเจกเฉ€ เจฎเจพเจคเจฐเจพ เจฆเฉ‡ เจ•เจพเจฐเจจ เจ…เจคเฉ‡ เจ…เจงเฉ‚เจฐเฉ€ เจŸเฉˆเจธเจŸเจฟเฉฐเจ— เจฎเจฟเจ†เจฆ เจฆเฉ‡ เจ•เจพเจฐเจจ, เจฒเฉ‡เจ– เจฎเฉเฉฑเจ– เจคเฉŒเจฐ 'เจคเฉ‡ เจœเจพเจฃเจ•เจพเจฐเฉ€ เจฆเฉ‡ เจ‰เจฆเฉ‡เจธเจผเจพเจ‚ เจฒเจˆ เจนเฉˆ, เจจเจพ เจ•เจฟ เจฅเฉ€เจธเจธ เจ…เจคเฉ‡ เจตเจฟเจšเจ•เจพเจฐเจฒเฉ‡ เจจเจคเฉ€เจœเจฟเจ†เจ‚ เจฆเฉ‡ เจ‡เฉฑเจ• เจธเจฎเฉ‚เจน เจตเจœเฉ‹เจ‚เฅค
เจนเฉ‹เจฐ เจตเจฟเจธเจคเฉเจฐเจฟเจค เจธเจฎเฉฑเจ—เจฐเฉ€ เจฌเจพเจ…เจฆ เจตเจฟเฉฑเจš, เจญเจพเจ—เจพเจ‚ เจตเจฟเฉฑเจš เจคเจฟเจ†เจฐ เจ•เฉ€เจคเฉ€ เจœเจพเจตเฉ‡เจ—เฉ€

เจนเฉฑเจฒ เจฒเจˆ เจกเจฐเจพเจซเจŸ เจฒเฉ‹เฉœเจพเจ‚

เจ‡เฉฑเจ• เจธเจพเจงเจจ เจตเจฟเจ•เจธเจค เจ•เจฐเจจเจพ เจœเจผเจฐเฉ‚เจฐเฉ€ เจนเฉˆ เจœเฉ‹ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจธเจŸเฉ‹เจฐ เจ•เจฐเจจ เจฆเฉ€ เจ†เจ—เจฟเจ† เจฆเจฟเฉฐเจฆเจพ เจนเฉˆ:

pg_stat_activity เจฆเฉ‡เจ–เจฃ เจฆเจพ เจ‡เจคเจฟเจนเจพเจธ
pg_locks เจฆเฉเจฐเจฟเจธเจผ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจธเฉˆเจธเจผเจจ เจฒเฉŒเจ• เจ‡เจคเจฟเจนเจพเจธ

เจนเฉฑเจฒ เจฆเฉ€ เจฒเฉ‹เฉœ- เจŸเฉ€เจšเจพ เจกเฉ‡เจŸเจพเจฌเฉ‡เจธ 'เจคเฉ‡ เจชเฉเจฐเจญเจพเจต เจจเฉ‚เฉฐ เจ˜เฉฑเจŸ เจ•เจฐเฉ‹เฅค

เจ†เจฎ เจตเจฟเจšเจพเจฐ- เจกเฉ‡เจŸเจพ เจ•เจฒเฉˆเจ•เจธเจผเจจ เจเจœเฉฐเจŸ เจจเฉ‚เฉฐ เจŸเจพเจฐเจ—เฉ‡เจŸ เจกเฉ‡เจŸเจพเจฌเฉ‡เจธ เจตเจฟเฉฑเจš เจจเจนเฉ€เจ‚, เจชเจฐ เจ‡เฉฑเจ• เจธเจฟเจธเจŸเจฎเจก เจธเฉ‡เจตเจพ เจตเจœเฉ‹เจ‚ เจจเจฟเจ—เจฐเจพเจจเฉ€ เจกเฉ‡เจŸเจพเจฌเฉ‡เจธ เจตเจฟเฉฑเจš เจฒเจพเจ‚เจš เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆเฅค เจนเจพเจ‚, เจ•เฉเจ เจกเฉ‡เจŸเจพ เจฆเจพ เจจเฉเจ•เจธเจพเจจ เจธเฉฐเจญเจต เจนเฉˆ, เจชเจฐ เจ‡เจน เจฐเจฟเจชเฉ‹เจฐเจŸเจฟเฉฐเจ— เจฒเจˆ เจฎเจนเฉฑเจคเจตเจชเฉ‚เจฐเจจ เจจเจนเฉ€เจ‚ เจนเฉˆ, เจชเจฐ เจฎเฉˆเจฎเฉ‹เจฐเฉ€ เจ…เจคเฉ‡ เจกเจฟเจธเจ• เจธเจชเฉ‡เจธ เจฆเฉ‡ เจฐเฉ‚เจช เจตเจฟเฉฑเจš เจŸเจพเจฐเจ—เฉ‡เจŸ เจกเฉ‡เจŸเจพเจฌเฉ‡เจธ 'เจคเฉ‡ เจ•เฉ‹เจˆ เจชเฉเจฐเจญเจพเจต เจจเจนเฉ€เจ‚ เจนเฉˆเฅค เจ…เจคเฉ‡ เจ‡เฉฑเจ• เจ•เฉเจจเฉˆเจ•เจธเจผเจจ เจชเฉ‚เจฒ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจจ เจฆเฉ‡ เจฎเจพเจฎเจฒเฉ‡ เจตเจฟเฉฑเจš, เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ†เจตเจพเจ‚ 'เจคเฉ‡ เจชเฉเจฐเจญเจพเจต เจ˜เฉฑเจŸ เจนเฉเฉฐเจฆเจพ เจนเฉˆ.

เจฒเจพเจ—เฉ‚ เจ•เจฐเจจ เจฆเฉ‡ เจชเฉœเจพเจ…

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. เจฎเฉŒเจœเฉ‚เจฆเจพ เจ‡เจคเจฟเจนเจพเจธ เจจเฉ‚เฉฐ เจญเจฐเจจเจพ

เจตเจฟเจŠ เจธเจจเฉˆเจชเจธเจผเจพเจŸ เจจเฉ‚เฉฐ เจธเจฟเฉฑเจงเจพ เจ‡เจ•เฉฑเจ เจพ เจ•เจฐเจจ เจฒเจˆ, เจ‡เฉฑเจ• 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;

เจฆเฉเจฐเจฟเจธเจผ เจธเจจเฉˆเจชเจธเจผเจพเจŸ เจ‡เจ•เฉฑเจ เฉ‡ เจ•เจฐเจจ เจฒเจˆ, 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 เจฆเฉเจ†เจฐเจพ เจ•เฉ€เจคเฉ€ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆเฅค เจ•เฉฐเจฎ เจฆเจพ เจเจฒเจ—เฉ‹เจฐเจฟเจฆเจฎ เจฌเจนเฉเจค เจธเจฐเจฒ เจนเฉˆ (เจชเฉเจฐเจพเจฒเฉ‡เจ–_เจชเฉ€เจœเฉ€_เจธเจŸเฉˆเจŸ_เจเจ•เจŸเฉ€เจตเจฟเจŸเฉ€ เจŸเฉ‡เจฌเจฒ เจฒเจˆ เจญเจพเจ— เจฆเฉ€ เจ‰เจฆเจพเจนเจฐเจจ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ)เฅค

เจ‡เฉฑเจ• เจจเจตเจพเจ‚ เจญเจพเจ— เจฌเจฃเจพเจ“ เจ…เจคเฉ‡ เจญเจฐเฉ‹

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;

เจฌเฉ‡เจธเจผเฉฑเจ•, เจธเจฎเฉ‡เจ‚-เจธเจฎเฉ‡เจ‚ 'เจคเฉ‡, เจชเฉเจฐเจพเจฃเฉ‡ เจญเจพเจ—เจพเจ‚ เจจเฉ‚เฉฐ เจฌเฉ‡เจฒเฉ‹เฉœเฉ‡ เจตเจœเฉ‹เจ‚ เจฎเจฟเจŸเจพเจ‡เจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆ.

เจฌเฉเจจเจฟเจ†เจฆเฉ€ เจฐเจฟเจชเฉ‹เจฐเจŸเจพเจ‚

เจ…เจธเจฒ เจตเจฟเฉฑเจš เจ‡เจน เจธเจญ เจ•เจฟเจ‰เจ‚ เจ•เฉ€เจคเจพ เจœเจพ เจฐเจฟเจนเจพ เจนเฉˆ? Oracle เจฆเฉ‡ 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? .

เจธเจตเจพเจฒเจพเจ‚ เจฒเจˆ เจ•เฉเฉฑเจฒ 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| เจฐเจฟเจธเจผเจคเจพ | เจฎเฉ‹เจก| เจฒเฉŒเจ• เจŸเจพเจˆเจช +---------+---------+------+---------- +--------- -----------+------------+---------------------+------ -------------- | 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| เจเจ•เจธเฉˆเจธ เจเจ•เจธเจ•เจฒเฉ‚เจธเจฟเจต เจฒเฉŒเจ•| เจฐเจฟเจธเจผเจคเจพ | 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| เจเจ•เจธเฉˆเจธ เจเจ•เจธเจ•เจฒเฉ‚เจธเจฟเจต เจฒเฉŒเจ•| เจฐเจฟเจธเจผเจคเจพ | | | | | 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| tuser| psql| tdb1| 2019-09-02 19:31:54 | 00:00:04| เจตเจฟเจนเจฒเจพ | | 2| 26211| tuser| psql| tdb1| 2019-09-02 19:31:58 | 00:00:06| เจฒเฉˆเจฃ-เจฆเฉ‡เจฃ เจตเจฟเฉฑเจš เจตเจฟเจนเจฒเฉ‡| เจธเจผเฉเจฐเฉ‚; | 3| 26211| tuser| psql| tdb1| 2019-09-02 19:32:16 | 00:01:45| เจฒเฉˆเจฃ-เจฆเฉ‡เจฃ เจตเจฟเฉฑเจš เจตเจฟเจนเจฒเฉ‡| เจฒเจพเจ• เจŸเฉ‡เจฌเจฒ เจตเฉ‡เจซเจฐ_เจกเจพเจŸเจพ; | 4| 26211| tuser| psql| tdb1| 2019-09-02 19:35:54 | 00:01:23| เจตเจฟเจนเจฒเจพ | เจตเจšเจจเจฌเฉฑเจง; | 5| 26211| tuser| psql| tdb1| 2019-09-02 19:38:46 | 00:00:02 | เจฒเฉˆเจฃ-เจฆเฉ‡เจฃ เจตเจฟเฉฑเจš เจตเจฟเจนเจฒเฉ‡| เจธเจผเฉเจฐเฉ‚; | 6| 26211| tuser| psql| tdb1| 2019-09-02 19:38:54 | 00:00:08| เจฒเฉˆเจฃ-เจฆเฉ‡เจฃ เจตเจฟเฉฑเจš เจตเจฟเจนเจฒเฉ‡| เจฒเจพเจ• เจŸเฉ‡เจฌเจฒ เจตเฉ‡เจซเจฐ_เจกเจพเจŸเจพ; | 7| 26211| tuser| psql| tdb1| 2019-09-02 19:39:08 | 00:42:42| เจตเจฟเจนเจฒเจพ | เจตเจšเจจเจฌเฉฑเจง; | 8| 26211| tuser| psql| tdb1| 2019-09-03 07:12:07 | 00:00:52| เจธเจฐเจ—เจฐเจฎ| test_del();

เจตเจฟเจ•เจพเจธ.

เจชเฉเจฐเจฆเจฐเจธเจผเจจ เจฆเฉ€เจ†เจ‚ เจ˜เจŸเจจเจพเจตเจพเจ‚ เจฆเจพ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ เจ•เจฐเจจ เจตเฉ‡เจฒเฉ‡ เจฆเจฟเจ–เจพเจˆเจ†เจ‚ เจ—เจˆเจ†เจ‚ เจฌเฉเจจเจฟเจ†เจฆเฉ€ เจชเฉเฉฑเจ›เจ—เจฟเฉฑเจ›เจพเจ‚ เจ…เจคเฉ‡ เจจเจคเฉ€เจœเฉ‡ เจตเจœเฉ‹เจ‚ เจฐเจฟเจชเฉ‹เจฐเจŸเจพเจ‚ เจชเจนเจฟเจฒเจพเจ‚ เจนเฉ€ เจœเฉ€เจตเจจ เจจเฉ‚เฉฐ เจฌเจนเฉเจค เจ†เจธเจพเจจ เจฌเจฃเจพเจ‰เจ‚เจฆเฉ€เจ†เจ‚ เจนเจจเฅค
เจฎเฉ‚เจฒ เจธเจตเจพเจฒเจพเจ‚ เจฆเฉ‡ เจ†เจงเจพเจฐ 'เจคเฉ‡, เจคเฉเจธเฉ€เจ‚ เจ‡เฉฑเจ• เจฐเจฟเจชเฉ‹เจฐเจŸ เจชเฉเจฐเจพเจชเจค เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹ เจœเฉ‹ เจ…เจธเจชเจธเจผเจŸ เจคเฉŒเจฐ 'เจคเฉ‡ Oracle เจฆเฉ‡ AWR เจจเจพเจฒ เจฎเจฟเจฒเจฆเฉ€-เจœเฉเจฒเจฆเฉ€ เจนเฉˆเฅค
เจธเฉฐเจ–เฉ‡เจช เจฐเจฟเจชเฉ‹เจฐเจŸ เจ‰เจฆเจพเจนเจฐเจจ

+------------------------------------------------ ----------------------------------- | เจ—เจคเฉ€เจตเจฟเจงเฉ€ เจ…เจคเฉ‡ เจ‰เจกเฉ€เจ•เจพเจ‚ เจฒเจˆ เจ‡เจ•เจธเจพเจฐ เจฐเจฟเจชเฉ‹เจฐเจŸเฅค 

เจจเฉ‚เฉฐ เจœเจพเจฐเฉ€ เจฐเฉฑเจ–เจฟเจ† เจœเจพเจตเฉ‡เจ—เจพ. เจ…เจ—เจฒเฉ€ เจฒเจพเจˆเจจ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจฒเจพเจ• เจ‡เจคเจฟเจนเจพเจธ (pg_stat_locks) เจฆเฉ€ เจฐเจšเจจเจพ เจนเฉˆ, เจŸเฉ‡เจฌเจฒเจพเจ‚ เจจเฉ‚เฉฐ เจญเจฐเจจ เจฆเฉ€ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจฆเจพ เจตเจงเฉ‡เจฐเฉ‡ เจตเจฟเจธเจคเฉเจฐเจฟเจค เจตเฉ‡เจฐเจตเจพเฅค

เจธเจฐเฉ‹เจค: www.habr.com

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹