αž€αžΆαžšαž”αŸ‰αž»αž“αž”αŸ‰αž„αž”αž„αŸ’αž€αžΎαžαž’αžΆαžŽαžΆαž‘αžΌαž€ ASH αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ PostgreSQL

αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαž”αž‰αŸ’αž αžΆ

αžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž€αžΎαž“αž”αŸ’αžšαžŸαž·αž‘αŸ’αž’αž—αžΆαž–αžŸαŸ†αžŽαž½αžš PostgreSQL αžŸαž˜αžαŸ’αžαž—αžΆαž–αž€αŸ’αž“αž»αž„αž€αžΆαžšαžœαž·αž—αžΆαž‚αž”αŸ’αžšαžœαžαŸ’αžαž·αžŸαž€αž˜αŸ’αž˜αž—αžΆαž– αž‡αžΆαž–αž·αžŸαŸαžŸ αž€αžΆαžšαžšαž„αŸ‹αž…αžΆαŸ† αž€αžΆαžšαž…αžΆαž€αŸ‹αžŸαŸ„ αž“αž·αž„αžŸαŸ’αžαž·αžαž·αžαžΆαžšαžΆαž„αž‚αžΊαžαŸ’αžšαžΌαžœαž”αžΆαž“αž‘αžΆαž˜αž‘αžΆαžšαž™αŸ‰αžΆαž„αžαŸ’αž›αžΆαŸ†αž„αŸ”

αž±αž€αžΆαžŸαžŠαŸ‚αž›αž˜αžΆαž“

αž§αž”αž€αžšαžŽαŸαžœαž·αž—αžΆαž‚αž”αž“αŸ’αž‘αž»αž€αž”αŸ’αžšαžœαžαŸ’αžαž·αžŸαžΆαžŸαŸ’αžαŸ’αžš ឬ "AWR αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ Postgres"αŸ– αž‡αžΆαžŠαŸ†αžŽαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž‚αž½αžšαž±αŸ’αž™αž…αžΆαž”αŸ‹αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž˜αž·αž“αž˜αžΆαž“αž”αŸ’αžšαžœαžαŸ’αžαž·αž“αŸƒ pg_stat_activity αž“αž·αž„ pg_locks αž‘αŸαŸ”

αž•αŸ’αž“αŸ‚αž€αž”αž“αŸ’αžαŸ‚αž˜ pgsentinel :
Β«αž–αŸαžαŸŒαž˜αžΆαž“αžŠαŸ‚αž›αž”αŸ’αžšαž˜αžΌαž›αž”αžΆαž“αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αžαŸ‚αž“αŸ…αž€αŸ’αž“αž»αž„ RAM αž αžΎαž™αž”αžšαž·αž˜αžΆαžŽαž“αŸƒαž’αž„αŸ’αž‚αž…αž„αž…αžΆαŸ†αžŠαŸ‚αž›αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αžŠαŸ„αž™αž…αŸ†αž“αž½αž“αž€αŸ†αžŽαžαŸ‹αžαŸ’αžšαžΆαžŠαŸ‚αž›αž”αžΆαž“αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž…αž»αž„αž€αŸ’αžšαŸ„αž™αŸ”

αžœαžΆαž›αžŸαŸ†αžŽαž½αžšαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž“αŸ’αžαŸ‚αž˜ - αžŸαŸ†αžŽαž½αžšαžŠαžΌαž…αž‚αŸ’αž“αžΆαž–αžΈαž•αŸ’αž“αŸ‚αž€αž”αž“αŸ’αžαŸ‚αž˜ pg_stat_statements (αžαž˜αŸ’αžšαžΌαžœαž±αŸ’αž™αžŠαŸ†αž‘αžΎαž„αž‡αžΆαž˜αž»αž“)αŸ”Β«

αž“αŸαŸ‡β€‹αž‡αžΆβ€‹αž€αžΆαžšβ€‹αž–αž·αžβ€‹αžŽαžΆαžŸαŸ‹ αžœαžΆβ€‹αž“αžΉαž„β€‹αž‡αž½αž™β€‹αž”αžΆαž“β€‹αž…αŸ’αžšαžΎαž“ αž”αŸ‰αž»αž“αŸ’αžαŸ‚β€‹αž”αž‰αŸ’αž αžΆβ€‹αžŠαŸ‚αž›β€‹αž–αž·αž”αžΆαž€β€‹αž”αŸ†αž•αž»αžβ€‹αž‚αžΊβ€‹αž…αŸ†αžŽαž»αž…β€‹αž‘αžΈβ€‹αž˜αž½αž™Β»αŸ”αž–αŸαžαŸŒαž˜αžΆαž“αžŠαŸ‚αž›αž”αŸ’αžšαž˜αžΌαž›αž”αžΆαž“αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αžαŸ‚αž€αŸ’αž“αž»αž„ RAM αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αŸ” ”, i.e. αž˜αžΆαž“αž•αž›αž”αŸ‰αŸ‡αž–αžΆαž›αŸ‹αž›αžΎαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‚αŸ„αž›αžŠαŸ…αŸ” αž›αžΎαžŸαž–αžΈαž“αŸαŸ‡αž‘αŸ€αžαž˜αž·αž“αž˜αžΆαž“αž”αŸ’αžšαžœαžαŸ’αžαž·αž…αžΆαž€αŸ‹αžŸαŸ„αž“αž·αž„αžŸαŸ’αžαž·αžαž·αžαžΆαžšαžΆαž„αž‘αŸαŸ” αž‘αžΆαŸ†αž„αž“αŸ„αŸ‡αŸ” αžŠαŸ†αžŽαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž‡αžΆαž‘αžΌαž‘αŸ…αž“αž·αž™αžΆαž™αž˜αž·αž“αž–αŸαž‰αž›αŸαž‰αŸ– "αž˜αž·αž“αž‘αžΆαž“αŸ‹αž˜αžΆαž“αž€αž‰αŸ’αž…αž”αŸ‹αžŠαŸ‚αž›αžαŸ’αžšαŸ€αž˜αžšαž½αž…αž‡αžΆαžŸαŸ’αžšαŸαž…αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžŠαŸ†αž‘αžΎαž„αž“αŸ…αž‘αžΎαž™αž‘αŸαŸ” αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαŸ’αž“αžΎαž±αŸ’αž™αž‘αžΆαž‰αž™αž€αž”αŸ’αžšαž—αž– αž“αž·αž„αž”αŸ’αžšαž˜αžΌαž›αž•αŸ’αžαž»αŸ†αž”αžŽαŸ’αžŽαžΆαž›αŸαž™αžŠαŸ„αž™αžαŸ’αž›αž½αž“αž―αž„αŸ” αžŠαŸ†αž”αžΌαž„αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαžŠαŸ†αž‘αžΎαž„αž€αž‰αŸ’αž…αž”αŸ‹ "devel" αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€ αž αžΎαž™αž€αŸ†αžŽαžαŸ‹αž•αŸ’αž›αžΌαžœαž‘αŸ… pg_config αž“αŸ…αž€αŸ’αž“αž»αž„αž’αžαŸαžš PATH αŸ”"αŸ”

αž‡αžΆαž‘αžΌαž‘αŸ…αž˜αžΆαž“αž—αžΆαž–αž…αŸ’αžšαž”αžΌαž€αž…αŸ’αžšαž”αž›αŸ‹αž…αŸ’αžšαžΎαž“ αž αžΎαž™αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž•αž›αž·αžαž€αž˜αŸ’αž˜αž’αŸ’αž„αž“αŸ‹αž’αŸ’αž„αžš αžœαžΆαž”αŸ’αžšαž αŸ‚αž›αž‡αžΆαž˜αž·αž“αž’αžΆαž…αž’αŸ’αžœαžΎαž’αŸ’αžœαžΈαž‡αžΆαž˜αž½αž™αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž”αžΆαž“αž‘αŸαŸ” αž™αžΎαž„β€‹αžαŸ’αžšαžΌαžœβ€‹αž”αž„αŸ’αž€αžΎαžβ€‹αž’αŸ’αžœαžΈβ€‹αž˜αž½αž™β€‹αž‡αžΆβ€‹αžšαž”αžŸαŸ‹β€‹αžαŸ’αž›αž½αž“β€‹αž™αžΎαž„β€‹αž˜αŸ’αžŠαž„β€‹αž‘αŸ€αžαŸ”

αž–αŸ’αžšαž˜αžΆαž“

αžŠαŸ„αž™αžŸαžΆαžšαž”αžšαž·αž˜αžΆαžŽαž…αŸ’αžšαžΎαž“ αž“αž·αž„αžŠαŸ„αž™αžŸαžΆαžšαžšαž™αŸˆαž–αŸαž›αžŸαžΆαž€αž›αŸ’αž”αž„αž˜αž·αž“αž–αŸαž‰αž›αŸαž‰ αž’αžαŸ’αžαž”αž‘αž‚αžΊαž˜αžΆαž“αž›αž€αŸ’αžαžŽαŸˆαž‡αžΆαž–αŸαžαŸŒαž˜αžΆαž“αž‡αžΆαž…αž˜αŸ’αž”αž„ αž‡αžΆαž‡αžΆαž„αž‡αžΆαžŸαŸ†αžŽαž»αŸ†αž“αŸƒαž’αžαŸ’αžαž”αž‘ αž“αž·αž„αž›αž‘αŸ’αž’αž•αž›αž€αž˜αŸ’αžšαž·αžαž˜αž’αŸ’αž™αž˜αŸ”
αžŸαž˜αŸ’αž—αžΆαžšαŸˆαž›αž˜αŸ’αž’αž·αžαž”αž“αŸ’αžαŸ‚αž˜αž‘αŸ€αžαž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαŸ€αž”αž…αŸ†αž“αŸ…αž–αŸαž›αž€αŸ’αžšαŸ„αž™αž“αŸ…αž€αŸ’αž“αž»αž„αž•αŸ’αž“αŸ‚αž€

αžŸαŸαž…αž€αŸ’αžαžΈαž–αŸ’αžšαžΆαž„αžαž˜αŸ’αžšαžΌαžœαž€αžΆαžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŠαŸ†αžŽαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™

αžœαžΆαž…αžΆαŸ†αž”αžΆαž…αŸ‹αž€αŸ’αž“αž»αž„αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαž§αž”αž€αžšαžŽαŸαžŠαŸ‚αž›αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αžšαž€αŸ’αžŸαžΆαž‘αž»αž€:

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;

αžŠαžΎαž˜αŸ’αž”αžΈαž”αŸ’αžšαž˜αžΌαž›αžšαžΌαž”αž—αžΆαž–αž˜αžΎαž› αžŸαŸαžœαžΆαž”αŸ’αžšαž–αŸαž“αŸ’αž’ αž“αž·αž„αžŸαŸ’αž‚αŸ’αžšαžΈαž”αž–αžΈαžšαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαŸ–

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

αžŠαžΌαž…αŸ’αž“αŸαŸ‡ αž”αŸ’αžšαžœαžαŸ’αžαž·αž“αŸƒαž‘αžŸαŸ’αžŸαž“αŸˆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαž˜αžΌαž›αž€αŸ’αž“αž»αž„αž‘αž˜αŸ’αžšαž„αŸ‹αž“αŸƒαž€αžΆαžšαžαžαžšαžΌαž”αž—αžΆαž–αž‘αžΈαž–αžΈαžšαžŠαŸ„αž™αžœαž·αž“αžΆαž‘αžΈαŸ” αž‡αžΆαž€αžΆαžšαž–αž·αžαžŽαžΆαžŸαŸ‹ αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αžœαžΈαŸ—αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‘αž»αž€αž…αŸ„αž›αžŠαžΌαž…αžŠαžΎαž˜ αžαž»αž“αžΉαž„αž€αžΎαž“αž‘αžΎαž„αž™αŸ‰αžΆαž„αž†αžΆαž”αŸ‹αžšαž αŸαžŸ αž αžΎαž™αž€αžΆαžšαž„αžΆαžšαžŠαŸ‚αž›αž•αž›αž·αžαž”αžΆαž“αž…αŸ’αžšαžΎαž“ αž¬αžαž·αž…αž“αžΉαž„αž€αŸ’αž›αžΆαž™αž‘αŸ…αž‡αžΆαž˜αž·αž“αž’αžΆαž…αž‘αŸ…αžšαž½αž…αŸ”

αžœαžΆαž…αžΆαŸ†αž”αžΆαž…αŸ‹αž€αŸ’αž“αž»αž„αž€αžΆαžšαžšαŸ€αž”αž…αŸ†αž€αžΆαžšαžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž‘αž·αž“αŸ’αž“αž“αŸαž™αŸ”

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 αžšαž”αžŸαŸ‹ Oracle αŸ”

αžœαžΆαž‡αžΆαž€αžΆαžšαžŸαŸ†αžαžΆαž“αŸ‹αž€αŸ’αž“αž»αž„αž€αžΆαžšαž”αž“αŸ’αžαŸ‚αž˜αžαžΆαžŠαžΎαž˜αŸ’αž”αžΈαž‘αž‘αž½αž›αž”αžΆαž“αžšαž”αžΆαž™αž€αžΆαžšαžŽαŸ αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž”αž„αŸ’αž€αžΎαžαž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αžšαžœαžΆαž„αž‘αž·αžŠαŸ’αž‹αž—αžΆαž– pg_stat_activity αž“αž·αž„ pg_stat_statements αŸ” αžαžΆαžšαžΆαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž—αŸ’αž‡αžΆαž”αŸ‹αžŠαŸ„αž™αž”αž“αŸ’αžαŸ‚αž˜αž‡αž½αžšαžˆαžš '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| αž‘αŸ†αž“αžΆαž€αŸ‹αž‘αŸ†αž“αž„ | αžšαž”αŸ€αž”| αž”αŸ’αžšαž—αŸαž‘αž…αžΆαž€αŸ‹αžŸαŸ„ ----------+----------+-----+---------- +--------- ----------+-----------+------ -------------+----- -------------- | ៑| ្៦្្ៀ| 1-26224-2019 09:02:19| 32:16:00| {01}| ៑៦αŸ₯ៀ៑| AccessShareLock| αž‘αŸ†αž“αžΆαž€αŸ‹αž‘αŸ†αž“αž„ | ្| ្៦៣៩០| 45-26211-16541 2:26390:2019| 09:02:19| {34}| ៑៦αŸ₯ៀ៑| AccessShareLock| αž‘αŸ†αž“αžΆαž€αŸ‹αž‘αŸ†αž“αž„ | ៣| ្៦៣៩៑| 03-00-00 53:26211:16541| 3:26391:2019| {09}| ៑៦αŸ₯ៀ៑| AccessShareLock| αž‘αŸ†αž“αžΆαž€αŸ‹αž‘αŸ†αž“αž„ | ៀ| 02| 19-34-03 00:00:53| 26211:16541:4| {26531}| ៑៦αŸ₯ៀ៑| AccessShareLock| αž‘αŸ†αž“αžΆαž€αŸ‹αž‘αŸ†αž“αž„ | αŸ₯| ្៧្៨ៀ| 2019-09-02 19:35:27| 00:00:12| {26211}| ៑៦αŸ₯ៀ៑| AccessShareLock| αž‘αŸ†αž“αžΆαž€αŸ‹αž‘αŸ†αž“αž„ | ៦| ្៧្៨៣| 16541-5-27284 2019:09:02| 19:44:02| {00}| ៑៦αŸ₯ៀ៑| AccessShareLock| αž‘αŸ†αž“αžΆαž€αŸ‹αž‘αŸ†αž“αž„ | ៧| ្៧្៨៦| 00-19-27276 16541:6:27283| 2019:09:02| {19}| ៑៦αŸ₯ៀ៑| AccessShareLock| αž‘αŸ†αž“αžΆαž€αŸ‹αž‘αŸ†αž“αž„ | ៨| ្៧ៀ្៣| 44-02-00 00:19:27276| 16541:7:27286| {2019}| ៑៦αŸ₯ៀ៑| AccessShareLock| αž‘αŸ†αž“αžΆαž€αŸ‹αž‘αŸ†αž“αž„ | ៩| ្៧៦ៀ៨| 09-02-19 44:02:00| 00:19:27276| {16541}| ៑៦αŸ₯ៀ៑| AccessShareLock| αž‘αŸ†αž“αžΆαž€αŸ‹αž‘αŸ†αž“αž„ | ៑០| ្៧៦αŸ₯០| 8-27423-2019 09:02:19| 45:24:00| {00}| ៑៦αŸ₯ៀ៑| AccessShareLock| αž‘αŸ†αž“αžΆαž€αŸ‹αž‘αŸ†αž“αž„ | ៑៑| ្៧៧៣αŸ₯| 12-27394-16541 9:27648:2019| 09:02:19| {48}| ៑៦αŸ₯ៀ៑| AccessExclusiveLock| αž‘αŸ†αž“αžΆαž€αŸ‹αž‘αŸ†αž“αž„ | ៑្| ្៨៣៨០| 06-00-00 20:27647:16541| 10:27650:2019| {09}| ៑៦αŸ₯ៀ៑| AccessShareLock| αž‘αŸ†αž“αžΆαž€αŸ‹αž‘αŸ†αž“αž„ | ៑៣| ្៨៣៧៩| 02-19-48 06:00:00| 20:27647:16541| ្៨៣៧៧| ៑៦αŸ₯ៀ៑| AccessExclusiveLock| αž‘αŸ†αž“αžΆαž€αŸ‹αž‘αŸ†αž“αž„ | | | | | ្៨៣៧៦| | 

αž€αžΆαžšαž‘αž”αŸ‹αžŸαŸ’αž€αžΆαžαŸ‹αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž”αŸ’αžšαžœαžαŸ’αžαž·αžŸαžΆαžŸαŸ’αžαŸ’αžš

αžŸαŸ†αžŽαžΎαŸ–

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| αžˆαŸ’αž˜αŸ„αŸ‡αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ | αžˆαŸ’αž˜αŸ„αŸ‡αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ | αžˆαŸ’αž˜αŸ„αŸ‡αž‘αž·αž“αŸ’αž“αž“αŸαž™ | αž”αžΆαž“αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜| αžšαž™αŸˆαž–αŸαž› | αžšαžŠαŸ’αž‹ | αžŸαŸ†αžŽαž½αžš +----------+----------+----------+-----+ --------- ------------------------+---------------------+------ --------------------------+-------------------------------- ----------------- | ៑| 1| តអសឺរ| psql| tdb26211| 1-2019-09 02:19:31| 54:00:00| αž‘αŸ†αž“αŸαžš| | ្| 04| តអសឺរ| psql| tdb2| 26211-1-2019 09:02:19| 31:58:00| αž‘αŸ†αž“αŸαžšαž€αŸ’αž“αž»αž„αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžš| αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜; | ៣| 00| តអសឺរ| psql| tdb06| 3-26211-1 2019:09:02| 19:32:16| αž‘αŸ†αž“αŸαžšαž€αŸ’αž“αž»αž„αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžš| αž…αžΆαž€αŸ‹αžŸαŸ„αžαžΆαžšαžΆαž„ wafer_data; | ៀ| 00| តអសឺរ| psql| tdb01| 45-4-26211 1:2019:09| 02:19:35| αž‘αŸ†αž“αŸαžš| αž”αŸ’αžαŸαž‡αŸ’αž‰αžΆαž…αž·αžαŸ’αž; | αŸ₯| 54| តអសឺរ| psql| tdb00| 01-23-5 26211:1:2019| 09:02:19| αž‘αŸ†αž“αŸαžšαž€αŸ’αž“αž»αž„αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžš| αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜; | ៦| 38| តអសឺរ| psql| tdb46| 00-00-02 6:26211:1| 2019:09:02| αž‘αŸ†αž“αŸαžšαž€αŸ’αž“αž»αž„αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžš| αž…αžΆαž€αŸ‹αžŸαŸ„αžαžΆαžšαžΆαž„ wafer_data; | ៧| 19| តអសឺរ| psql| tdb38| 54-00-00 08:7:26211| 1:2019:09| αž‘αŸ†αž“αŸαžš| αž”αŸ’αžαŸαž‡αŸ’αž‰αžΆαž…αž·αžαŸ’αž; | ៨| 02| តអសឺរ| psql| tdb19| 39-08-00 42:42:8| 26211:1:2019| αžŸαž€αž˜αŸ’αž˜ | αž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸ test_del();

αž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸαŸ”

αžŸαŸ†αžŽαž½αžšαž‡αžΆαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αžŠαŸ‚αž›αž”αžΆαž“αž”αž„αŸ’αž αžΆαž‰ αž“αž·αž„αžšαž”αžΆαž™αž€αžΆαžšαžŽαŸαž›αž‘αŸ’αž’αž•αž›αž”αžΆαž“αž’αŸ’αžœαžΎαž±αŸ’αž™αž‡αžΈαžœαž·αžαž€αžΆαž“αŸ‹αžαŸ‚αž„αžΆαž™αžŸαŸ’αžšαž½αž›αž“αŸ…αž–αŸαž›αžœαž·αž—αžΆαž‚αž§αž”αŸ’αž”αžαŸ’αžαž·αž αŸαžαž»αž“αŸƒαž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαŸ”
αžŠαŸ„αž™αž•αŸ’αž’αŸ‚αž€αž›αžΎαžŸαŸ†αžŽαž½αžšαž‡αžΆαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“ αž’αŸ’αž“αž€αž’αžΆαž…αž‘αž‘αž½αž›αž”αžΆαž“αžšαž”αžΆαž™αž€αžΆαžšαžŽαŸαžŠαŸ‚αž›αžŸαŸ’αžšαžŠαŸ€αž„αž“αžΉαž„ AWR αžšαž”αžŸαŸ‹ Oracle αŸ”
αž§αž‘αžΆαž αžšαžŽαŸαžšαž”αžΆαž™αž€αžΆαžšαžŽαŸαžŸαž„αŸ’αžαŸαž”

+------------------------------------------------ ----------------------------------- | αžšαž”αžΆαž™αž€αžΆαžšαžŽαŸαžšαž½αž˜αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŸαž€αž˜αŸ’αž˜αž—αžΆαž– αž“αž·αž„αž€αžΆαžšαžšαž„αŸ‹αž…αžΆαŸ†αŸ” 

αž“αŸ…β€‹αž˜αžΆαž“β€‹αž‡αžΆβ€‹αž”αž“αŸ’αžβ€‹αž‘αŸ€αžαŸ” αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αž‡αž½αžšαž‚αžΊαž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαž”αŸ’αžšαžœαžαŸ’αžαž·αž…αžΆαž€αŸ‹αžŸαŸ„ (pg_stat_locks) αžŠαŸ‚αž›αž‡αžΆαž€αžΆαžšαž–αž·αž–αžŽαŸŒαž“αžΆαž›αž˜αŸ’αž’αž·αžαž”αž“αŸ’αžαŸ‚αž˜αž‘αŸ€αžαž’αŸ†αž–αžΈαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸƒαž€αžΆαžšαž”αŸ†αž–αŸαž‰αžαžΆαžšαžΆαž„αŸ”

αž”αŸ’αžšαž—αž–: www.habr.com

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹