ΠœΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ запросов PostgreSQL. Π§Π°ΡΡ‚ΡŒ 1 β€” Ρ€Π΅ΠΏΠΎΡ€Ρ‚ΠΈΠ½Π³

Π˜Π½ΠΆΠ΅Π½Π΅Ρ€ β€” Π² ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π΅ с Π»Π°Ρ‚Ρ‹Π½ΠΈ β€” Π²Π΄ΠΎΡ…Π½ΠΎΠ²Π΅Π½Π½Ρ‹ΠΉ.
Π˜Π½ΠΆΠ΅Π½Π΅Ρ€ ΠΌΠΎΠΆΠ΅Ρ‚ всё. (с) Π .Π”ΠΈΠ·Π΅Π»ΡŒ.
Π­ΠΏΠΈΠ³Ρ€Π°Ρ„Ρ‹.
ΠœΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ запросов PostgreSQL. Π§Π°ΡΡ‚ΡŒ 1 — Ρ€Π΅ΠΏΠΎΡ€Ρ‚ΠΈΠ½Π³
Или история ΠΎ Ρ‚ΠΎΠΌ, Π·Π°Ρ‡Π΅ΠΌ администратору Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ… Π²ΡΠΏΠΎΠΌΠΈΠ½Π°Ρ‚ΡŒ своС программистскоС ΠΏΡ€ΠΎΡˆΠ»ΠΎΠ΅.

ΠŸΡ€Π΅Π΄ΠΈΡΠ»ΠΎΠ²ΠΈΠ΅

ВсС ΠΈΠΌΠ΅Π½Π° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Ρ‹. БовпадСния случайны. ΠœΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π» прСдставляСт собой ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π»ΠΈΡ‡Π½ΠΎΠ΅ ΠΌΠ½Π΅Π½ΠΈΠ΅ Π°Π²Ρ‚ΠΎΡ€Π°.

Disclaimer of warranties: Π² ΠΏΠ»Π°Π½ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠΌ Ρ†ΠΈΠΊΠ»Π΅ статСй Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠ³ΠΎ ΠΈ Ρ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ описания ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Ρ‚Π°Π±Π»ΠΈΡ† ΠΈ скриптов. ΠœΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Ρ‹ Π½Π΅ получится сразу ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Β«AS ISΒ».
Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, ΠΏΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ большого объСма ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Π°,
Π²ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ… ΠΏΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ заточСнности с ΠΏΡ€ΠΎΠ΄Π°ΠΊΡˆΠ½ Π±Π°Π·ΠΎΠΉ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π·Π°ΠΊΠ°Π·Ρ‡ΠΈΠΊΠ°.
ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π² ΡΡ‚Π°Ρ‚ΡŒΡΡ… Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ΄Π΅ΠΈ ΠΈ описания Π² самом ΠΎΠ±Ρ‰Π΅ΠΌ Π²ΠΈΠ΄Π΅.
ΠœΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ систСма дорастСт Π΄ΠΎ уровня выкладывания Π½Π° GitHub, Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈ Π½Π΅Ρ‚. ВрСмя β€” ΠΏΠΎΠΊΠ°ΠΆΠ΅Ρ‚.

Начало истории- Β«Π’Ρ‹ помнишь, ΠΊΠ°ΠΊ всС Π½Π°Ρ‡ΠΈΠ½Π°Π»ΠΎΡΡŒΒ».
Π§Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅, Π² самых ΠΎΠ±Ρ‰ΠΈΡ… Ρ‡Π΅Ρ€Ρ‚Π°Ρ…- Β«Π‘ΠΈΠ½Ρ‚Π΅Π· ΠΊΠ°ΠΊ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ PostgreSQLΒ»

Π—Π°Ρ‡Π΅ΠΌ всё это ΠΌΠ½Π΅?

Ну, Π²ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, Ρ‡Ρ‚ΠΎΠ±Ρ‹ самому Π½Π΅ Π·Π°Π±Ρ‹Ρ‚ΡŒ, вспоминая Π½Π° пСнсии славныС Π΄Π΅Π½Π΅Ρ‡ΠΊΠΈ.
Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΈΡΡ‚Π΅ΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ написанноС. Ибо ΡƒΠΆΠ΅ сам, ΠΈΠ½ΠΎΠ³Π΄Π° Π½Π°Ρ‡ΠΈΠ½Π°ΡŽ ΠΏΡƒΡ‚Π°Ρ‚ΡŒΡΡ ΠΈ Π·Π°Π±Ρ‹Π²Π°Ρ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ части.

Ну ΠΈ самоС Π³Π»Π°Π²Π½ΠΎΠ΅ β€” Π²Π΄Ρ€ΡƒΠ³ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΊΠΎΠΌΡƒ-Ρ‚ΠΎ пригодится ΠΈ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ ΠΈΠ·ΠΎΠ±Ρ€Π΅Ρ‚Π°Ρ‚ΡŒ вСлосипСд ΠΈ Π½Π΅ ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ Π³Ρ€Π°Π±Π»ΠΈ. Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ свою ΠΊΠ°Ρ€ΠΌΡƒ (Π½Π΅ Ρ…Π°Π±Ρ€ΠΎΠ²ΡΠΊΡƒΡŽ). Ибо, самоС Ρ†Π΅Π½Π½ΠΎΠ΅ Π² этом ΠΌΠΈΡ€Π΅ это ΠΈΠ΄Π΅ΠΈ. Π“Π»Π°Π²Π½ΠΎΠ΅ Π½Π°ΠΉΡ‚ΠΈ идСю. А Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ идСю Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ это ΡƒΠΆΠ΅ вопрос чисто тСхничСский.

Π˜Ρ‚Π°ΠΊ, Π½Π°Ρ‡Π½Π΅ΠΌ, ΠΏΠΎΡ‚ΠΈΡ…ΠΎΠ½ΡŒΠΊΡƒβ€¦

ΠŸΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΊΠ° Π·Π°Π΄Π°Ρ‡ΠΈ.

Π˜ΠΌΠ΅Π΅Ρ‚ΡΡ:

Π‘Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ… PostgreSQL(10.5), смСшанного Ρ‚ΠΈΠΏΠ° Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ (OLTP+DSS), срСднСй-ΠΌΠ°Π»ΠΎΠΉ загруТСнности, располоТСнной Π² ΠΎΠ±Π»Π°ΠΊΠ΅ AWS.
ΠœΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… отсутствуСт, ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ инфраструктуры прСдставлСн Π² Π²ΠΈΠ΄Π΅ ΡˆΡ‚Π°Ρ‚Π½Ρ‹Π΅ срСдства AWS Π² минимальной ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ.

ВрСбуСтся:

ΠœΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΈ состояниС Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…, Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΈ ΠΈΠΌΠ΅Ρ‚ΡŒ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ для ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ тяТСлых запросы ΠΊ Π‘Π”.

ΠšΡ€Π°Ρ‚ΠΊΠΎΠ΅ прСдисловиС ΠΈΠ»ΠΈ Π°Π½Π°Π»ΠΈΠ· Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ

Для Π½Π°Ρ‡Π°Π»Π° ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π·Π°Π΄Π°Ρ‡ΠΈ с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния ΡΡ€Π°Π²Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π° Π²Ρ‹Π³ΠΎΠ΄ ΠΈ нСприятностСй для ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€Π°, Π° пользой ΠΈ ΡƒΠ±Ρ‹Ρ‚ΠΊΠ°ΠΌΠΈ ΠΌΠ΅Π½Π΅Π΄ΠΆΠΌΠ΅Π½Ρ‚Π° ΠΏΡƒΡΡ‚ΡŒ Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‚ΡΡ Ρ‚Π΅, ΠΊΠΎΠΌΡƒ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΎ ΠΏΠΎ ΡˆΡ‚Π°Ρ‚Π½ΠΎΠΌΡƒ Ρ€Π°ΡΠΏΠΈΡΠ°Π½ΠΈΡŽ.

Π’Π°Ρ€ΠΈΠ°Π½Ρ‚ 1- Β«Working on demandΒ»

ΠžΡΡ‚Π°Π²Π»ΡΠ΅ΠΌ всС ΠΊΠ°ΠΊ Π΅ΡΡ‚ΡŒ. Если Π·Π°ΠΊΠ°Π·Ρ‡ΠΈΠΊΠ° Π½Π΅ устраиваСт Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π² работоспособности, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ»ΠΈ прилоТСния ΠΎΠ½ извСстит ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€ΠΎΠ² DBA ΠΏΠΎ e-mail ΠΈΠ»ΠΈ создав ΠΈΠ½Ρ†ΠΈΠ΄Π΅Π½Ρ‚ Π² Ρ‚ΠΈΠΊΠ΅Ρ‚Π½ΠΈΡ†Π΅.
Π˜Π½ΠΆΠ΅Π½Π΅Ρ€, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ² ΠΎΠΏΠΎΠ²Π΅Ρ‰Π΅Π½ΠΈΠ΅, разбСрСтся Π² ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ΅, ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΡ‚ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ ΠΎΡ‚Π»ΠΎΠΆΠΈΡ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ Π² Π΄ΠΎΠ»Π³ΠΈΠΉ ящик, надСясь, Ρ‡Ρ‚ΠΎ всС само собой рассосСтся, Π΄Π° ΠΈ всС Ρ€Π°Π²Π½ΠΎ, скоро всё забудСтся.
ΠŸΡ€ΡΠ½ΠΈΠΊΠΈ ΠΈ ΠΏΡ‹ΡˆΠΊΠΈ , синяки ΠΈ ΡˆΠΈΡˆΠΊΠΈΠŸΡ€ΡΠ½ΠΈΠΊΠΈ ΠΈ ΠΏΡ‹ΡˆΠΊΠΈ:
1. НичСго лишнСго Π΄Π΅Π»Π°Ρ‚ΡŒ Π½Π΅ Π½Π°Π΄ΠΎ
2. ВсСгда Π΅ΡΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΎΡ‚ΠΌΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΈ ΡΠ°Ρ‡ΠΊΠ°Π½ΡƒΡ‚ΡŒ.
3. ΠšΡƒΡ‡Π° Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡ‚Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ ΠΏΠΎ собствСнному ΡƒΡΠΌΠΎΡ‚Ρ€Π΅Π½ΠΈΡŽ.
Биняки и шишки:
1. Π Π°Π½ΠΎ ΠΈΠ»ΠΈ ΠΏΠΎΠ·Π΄Π½ΠΎ Π·Π°ΠΊΠ°Π·Ρ‡ΠΈΠΊ задумаСтся ΠΎ сущности бытия ΠΈ всСлСнской справСдливости Π² этом ΠΌΠΈΡ€Π΅ ΠΈ Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠΉ Ρ€Π°Π· задаст сСбС вопрос β€” Π·Π°, Ρ‡Ρ‚ΠΎ я ΠΈΠΌ ΠΏΠ»Π°Ρ‡Ρƒ свои дСньги? ΠŸΠΎΡΠ»Π΅Π΄ΡΡ‚Π²ΠΈΠ΅ всСгда ΠΎΠ΄Π½ΠΎ β€” вопрос Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΎΠ³Π΄Π° Π·Π°ΠΊΠ°Π·Ρ‡ΠΈΠΊ поскучнССт ΠΈ ΠΌΠ°Ρ…Π½Π΅Ρ‚ Ρ€ΡƒΠΊΠΎΠΉ Π½Π° ΠΏΡ€ΠΎΡ‰Π°Π½ΡŒΠ΅. И ΠΊΠΎΡ€ΠΌΡƒΡˆΠΊΠ° опустССт. Π­Ρ‚ΠΎ ΠΏΠ΅Ρ‡Π°Π»ΡŒΠ½ΠΎ.
2. Π Π°Π·Π²ΠΈΡ‚ΠΈΠ΅ ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€Π° β€” ноль.
3. БлоТности планирования Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ

Π’Π°Ρ€ΠΈΠ°Π½Ρ‚ 2- Β«Π’Π°Π½Ρ†ΡƒΠ΅ΠΌ с Π±ΡƒΠ±Π½Π°ΠΌΠΈ, Π²ΠΏΠ°Ρ€ΠΈΠ²Π°Π΅ΠΌ ΠΈ ΠΎΠ±ΡƒΠ²Π°Π΅ΠΌΒ»

ΠŸΡƒΠ½ΠΊΡ‚1-Π—Π°Ρ‡Π΅ΠΌ Π½Π°ΠΌ систСма ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π°, ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ всС ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ запросами. Запускам ΠΊΡƒΡ‡Ρƒ всяких запросов ΠΊ ΡΠ»ΠΎΠ²Π°Ρ€ΡŽ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ динамичСским прСдставлСниям, Π²ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ всякиС счСтчики, сводим всС Π² Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹, пСриодичСски ΠΊΠ°ΠΊ-Π±Ρ‹ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ списки ΠΈ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΈΠΌΠ΅Π΅ΠΌ красивыС ΠΈΠ»ΠΈ Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ, Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹, ΠΎΡ‚Ρ‡Π΅Ρ‚Ρ‹. Π“Π»Π°Π²Π½ΠΎΠ΅ β€” Ρ‡Ρ‚ΠΎ Π±Ρ‹ побольшС, побольшС.
ΠŸΡƒΠ½ΠΊΡ‚2-Π“Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ-запускаСм Π°Π½Π°Π»ΠΈΠ· всСго этого.
ΠŸΡƒΠ½ΠΊΡ‚3-Π“ΠΎΡ‚ΠΎΠ²ΠΈΠΌ Π½Π΅ΠΊΠΈΠΉ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌ сСй Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚, просто β€” Β«ΠΊΠ°ΠΊ Π½Π°ΠΌ ΠΎΠ±ΡƒΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ…Β».
ΠŸΡƒΠ½ΠΊΡ‚4-Π—Π°ΠΊΠ°Π·Ρ‡ΠΈΠΊ, видя всС это Π²Π΅Π»ΠΈΠΊΠΎΠ»Π΅ΠΏΠΈΠ΅ Π³Ρ€Π°Ρ„ΠΈΠΊΠΎΠ² ΠΈ Ρ†ΠΈΡ„Ρ€ ΠΏΡ€Π΅Π±Ρ‹Π²Π°Π΅Ρ‚ Π² дСтской Π½Π°ΠΈΠ²Π½ΠΎΠΉ увСрСнности β€” Π²ΠΎΡ‚ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Ρ‚ΠΎ Ρƒ нас всС Π·Π°Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, скоро. И, Π»Π΅Π³ΠΊΠΎ ΠΈ Π±Π΅Π·Π±ΠΎΠ»Π΅Π·Π½Π΅Π½Π½ΠΎ расстаСтся со своими Π΄Π΅Π½Π΅ΠΆΠ½Ρ‹ΠΌΠΈ рСсурсами. ΠœΠ΅Π½Π΅Π΄ΠΆΠΌΠ΅Π½Ρ‚ Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΠ²Π΅Ρ€Π΅Π½ β€” ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€Ρ‹ Ρƒ нас Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΠΎΠ³ΠΎ-Π³ΠΎ. Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ° Π½Π° максимумС.
ΠŸΡƒΠ½ΠΊΡ‚5-РСгулярно ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΈΡ‚ΡŒ ΠŸΡƒΠ½ΠΊΡ‚ 1.
ΠŸΡ€ΡΠ½ΠΈΠΊΠΈ ΠΈ ΠΏΡ‹ΡˆΠΊΠΈ , синяки ΠΈ ΡˆΠΈΡˆΠΊΠΈΠŸΡ€ΡΠ½ΠΈΠΊΠΈ ΠΈ ΠΏΡ‹ΡˆΠΊΠΈ:
1. Π–ΠΈΠ·Π½ΡŒ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ΠΎΠ² ΠΈ ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€ΠΎΠ² β€” проста, прСдсказуСма ΠΈ Π½Π°ΠΏΠΎΠ»Π½Π΅Π½Π° Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒΡŽ. Всё ΠΆΡƒΠΆΠΆΠΈΡ‚, всС заняты.
2. Π–ΠΈΠ·Π½ΡŒ Π·Π°ΠΊΠ°Π·Ρ‡ΠΈΠΊΠ° Ρ‚ΠΎΠΆΠ΅ Π½Π΅ΠΏΠ»ΠΎΡ…Π° β€” ΠΎΠ½ всСгда ΡƒΠ²Π΅Ρ€Π΅Π½, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ Π²ΠΎΡ‚ Ρ‡ΡƒΡ‚ΡŒ-Ρ‡ΡƒΡ‚ΡŒ ΠΏΠΎΡ‚Π΅Ρ€ΠΏΠ΅Ρ‚ΡŒ ΠΈ всё наладится. НС налаТиваСтся, Π½Ρƒ, Ρ‡Ρ‚ΠΎ ΠΆ β€” это ΠΌΠΈΡ€ нСсправСдлив, Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΆΠΈΠ·Π½ΠΈ β€” ΠΏΠΎΠ²Π΅Π·Π΅Ρ‚.
Биняки и шишки:
1. Π Π°Π½ΠΎ ΠΈΠ»ΠΈ ΠΏΠΎΠ·Π΄Π½ΠΎ, Π½ΠΎ найдСтся Π±ΠΎΠ»Π΅Π΅ ΡˆΡƒΡΡ‚Ρ€Ρ‹ΠΉ поставщик Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎΠΉ услуги, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚ΠΎΠΆΠ΅ самоС, Π½ΠΎ Ρ‡ΡƒΡ‚ΡŒ дСшСвлС. А Ссли Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ‚ΠΎΡ‚ ΠΆΠ΅ самый, Π·Π°Ρ‡Π΅ΠΌ ΠΏΠ»Π°Ρ‚ΠΈΡ‚ΡŒ большС. Π§Ρ‚ΠΎ ΠΎΠΏΡΡ‚ΡŒ-Ρ‚Π°ΠΊΠΈ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ ΠΈΡΡ‡Π΅Π·Π½ΠΎΠ²Π΅Π½ΠΈΡŽ ΠΊΠΎΡ€ΠΌΡƒΡˆΠΊΠΈ.
2. Π­Ρ‚ΠΎ скучно. Как скучна любая малоосмыслСнная Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ.
3. Как ΠΈ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π΅ β€” развития Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ. Но для ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€Π° минус Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠΈ ΠΎΡ‚ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° Ρ‚ΡƒΡ‚ Π½ΡƒΠΆΠ½ΠΎ постоянно Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π˜Π‘Π”. А это ΠΎΡ‚Π½ΠΈΠΌΠ°Π΅Ρ‚ врСмя. ΠšΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡ‚Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ с пользой для сСбя любимого. Ибо сам ΠΎ сСбС Π½Π΅ ΠΏΠΎΠ·Π°Π±ΠΎΡ‚ΠΈΡˆΡŒΡΡ, всСм Π½Π° тСбя ΠΏΠΎ Π±Π°Ρ€Π°Π±Π°Π½Ρƒ.

Π’Π°Ρ€ΠΈΠ°Π½Ρ‚ 3-НС Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠ΄ΡƒΠΌΡ‹Π²Π°Ρ‚ΡŒ вСлосипСд, Π½ΡƒΠΆΠ½ΠΎ Π΅Π³ΠΎ ΠΊΡƒΠΏΠΈΡ‚ ΠΈ ΠΊΠ°Ρ‚Π°Ρ‚ΡŒΡΡ.

Π˜Π½ΠΆΠ΅Π½Π΅Ρ€Ρ‹ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΉ Π½Π΅ зря Сдят ΠΏΠΈΡ†Ρ†Ρƒ запивая ΠΏΠΈΠ²ΠΎΠΌ (эх, славныС Π²Ρ€Π΅ΠΌΠ΅Π½Π° ΠŸΠΈΡ‚Π΅Ρ€ 90-Ρ…). Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ΠΎΠ²Ρ‹Π΅ систСмы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ сдСланы, ΠΎΡ‚Π»Π°ΠΆΠ΅Π½Ρ‹ ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚, ΠΈ приносят Π²ΠΎΠΎΠ±Ρ‰Π΅ говоря ΠΏΠΎΠ»ΡŒΠ·Ρƒ (Π½Ρƒ ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ ΠΈΡ… создатСлям).
ΠŸΡ€ΡΠ½ΠΈΠΊΠΈ ΠΈ ΠΏΡ‹ΡˆΠΊΠΈ , синяки ΠΈ ΡˆΠΈΡˆΠΊΠΈΠŸΡ€ΡΠ½ΠΈΠΊΠΈ ΠΈ ΠΏΡ‹ΡˆΠΊΠΈ:
1. НС Π½ΡƒΠΆΠ½ΠΎ Ρ‚Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ врСмя Π½Π° ΠΏΡ€ΠΈΠ΄ΡƒΠΌΡ‹Π²Π°Π½ΠΈΠ΅ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΈ Ρ‚Π°ΠΊ ΠΏΡ€ΠΈΠ΄ΡƒΠΌΠ°Π½ΠΎ. Π‘Π΅Ρ€ΠΈ ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡΡ.
2. БистСмы ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° ΠΏΠΈΡˆΡƒΡ‚ Π½Π΅ Π΄ΡƒΡ€Π°ΠΊΠΈ ΠΈ ΠΎΠ½ΠΈ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ ΠΆΠ΅ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹.
3. Π Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠ΅ систСмы ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ Π΄Π°ΡŽΡ‚ ΠΏΠΎΠ»Π΅Π·Π½ΡƒΡŽ ΠΎΡ‚Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ.
Биняки и шишки:
1. Π˜Π½ΠΆΠ΅Π½Π΅Ρ€ Π² Π΄Π°Π½Π½ΠΎΠΌ случаС Π½Π΅ ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€, Π° всСго лишь ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Ρ‡ΡƒΠΆΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π°.Или ΡŽΠ·Π΅Ρ€.
2. Π—Π°ΠΊΠ°Π·Ρ‡ΠΈΠΊΠ° Π½Π°Π΄ΠΎ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒ Π² нСобходимости ΠΊΡƒΠΏΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π² Ρ‡Π΅ΠΌ ΠΎΠ½ Ρ€Π°Π·Π±ΠΈΡ€Π°Ρ‚ΡŒΡΡ Π²ΠΎΠΎΠ±Ρ‰Π΅ говоря Π½Π΅ Ρ…ΠΎΡ‡Π΅Ρ‚, Π΄Π° ΠΈ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈ Π²ΠΎΠΎΠ±Ρ‰Π΅ Π±ΡŽΠ΄ΠΆΠ΅Ρ‚ Π½Π° Π³ΠΎΠ΄ ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ ΠΈ ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚. ΠŸΠΎΡ‚ΠΎΠΌ Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ рСсурс, Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΏΠΎΠ΄ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΡƒΡŽ систСму. Π’.Π΅. сначала Π½ΡƒΠΆΠ½ΠΎ ΠΏΠ»Π°Ρ‚ΠΈΡ‚, ΠΏΠ»Π°Ρ‚ΠΈΡ‚ΡŒ ΠΈ Π΅Ρ‰Π΅ Ρ€Π°Π· Π·Π°ΠΏΠ»Π°Ρ‚ΠΈΡ‚ΡŒ. А Π·Π°ΠΊΠ°Π·Ρ‡ΠΈΠΊ скуп. Π­Ρ‚ΠΎ Π½ΠΎΡ€ΠΌΠ° этой ΠΆΠΈΠ·Π½ΠΈ.

Π§Ρ‚ΠΎ ΠΆΠ΅ Π΄Π΅Π»Π°Ρ‚ΡŒ- Π§Π΅Ρ€Π½Ρ‹ΡˆΠ΅Π²ΡΠΊΠΈΠΉ? Π’Π²ΠΎΠΉ вопрос вСсьма умСстСн. (с)

Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΌ случаС ΠΈ слоТившСйся ситуации ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΡ‚ΡƒΠΏΠΈΡ‚ΡŒ Ρ‡ΡƒΡ‚ΡŒ-Ρ‡ΡƒΡ‚ΡŒ ΠΏΠΎ-Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ β€” Π° Π΄Π°Π²Π°ΠΉΡ‚Π΅ сдСлаСм свою ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ систСму ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π°.
ΠœΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ запросов PostgreSQL. Π§Π°ΡΡ‚ΡŒ 1 — Ρ€Π΅ΠΏΠΎΡ€Ρ‚ΠΈΠ½Π³
Ну Π½Π΅ систСму ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π² ΠΏΠΎΠ»Π½ΠΎΠΌ смыслС слова, это слишком Π³Ρ€ΠΎΠΌΠΊΠΎ сказано ΠΈ самонадСянно, Π½ΠΎ Ρ…ΠΎΡ‚ΡŒ ΠΊΠ°ΠΊ-Ρ‚ΠΎ ΠΎΠ±Π»Π΅Π³Ρ‡ΠΈΡ‚ΡŒ сСбС Π·Π°Π΄Π°Ρ‡Ρƒ ΠΈ ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ побольшС ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΈΠ½Ρ†ΠΈΠ΄Π΅Π½Ρ‚ΠΎΠ² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. Π§Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ ΠΎΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ Π² ситуации β€” Β«ΠΏΠΎΠΉΠ΄ΠΈ Ρ‚ΡƒΠ΄Π° Π½Π΅ знаю ΠΊΡƒΠ΄Π°, Π½Π°ΠΉΠ΄ΠΈ Ρ‚ΠΎ, Π½Π΅ знаю Ρ‡Ρ‚ΠΎΒ».

КакиС ΠΆΠ΅ ΠΏΠ»ΡŽΡΡ‹ ΠΈ минусы этого Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°:

ΠŸΠ»ΡŽΡΡ‹:
1. Π­Ρ‚ΠΎ интСрСсно. Ну ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ интСрСснСС, Ρ‡Π΅ΠΌ постоянныС Β«shrink datafile, alter tablespace, etc.Β»
2. Π­Ρ‚ΠΎ Π½ΠΎΠ²Ρ‹Π΅ скилы ΠΈ Π½ΠΎΠ²ΠΎΠ΅ Ρ€Π°Π·Π²ΠΈΡ‚ΠΈΠ΅. Π§Ρ‚ΠΎ Π² пСрспСктивС Ρ€Π°Π½ΠΎ ΠΈΠ»ΠΈ ΠΏΠΎΠ·Π΄Π½ΠΎ даст заслуТСнныС пряники ΠΈ ΠΏΡ‹ΡˆΠΊΠΈ.
ΠœΠΈΠ½ΡƒΡΡ‹:
1. ΠŸΡ€ΠΈΠ΄Π΅Ρ‚ΡΡ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ. Π Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ.
2. ΠŸΡ€ΠΈΠ΄Π΅Ρ‚ΡΡ рСгулярно ΠΎΠ±ΡŠΡΡΠ½ΡΡ‚ΡŒ смысл ΠΈ пСрспСктивы всСй активности.
3. Π§Π΅ΠΌ-Ρ‚ΠΎ придСтся ΠΏΠΎΠΆΠ΅Ρ€Ρ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ, ΠΈΠ±ΠΎ СдинствСнный доступный ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€Ρƒ рСсурс-врСмя β€” ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ ВсСлСнной.
4. Π‘Π°ΠΌΠΎΠ΅ ΡΡ‚Ρ€Π°ΡˆΠ½ΠΎΠ΅ ΠΈ самоС нСприятноС β€” Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ получится фигня Ρ‚ΠΈΠΏΠ° «НС ΠΌΡ‹ΡˆΠΎΠ½ΠΎΠΊ, Π½Π΅ Π»ΡΠ³ΡƒΡˆΠΊΠ°, Π° Π½Π΅Π²Π΅Π΄ΠΎΠΌΠ° Π·Π²Π΅Ρ€ΡƒΡˆΠΊΠ°Β».

ΠšΡ‚ΠΎ Π½Π΅ рискуСт-Ρ‚ΠΎ Π½Π΅ ΠΏΡŒΠ΅Ρ‚ шампанскоС.
Π˜Ρ‚Π°ΠΊ β€” начинаСтся самоС интСрСсноС.

ΠžΠ±Ρ‰Π°Ρ идСя β€” схСматичСски

ΠœΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ запросов PostgreSQL. Π§Π°ΡΡ‚ΡŒ 1 — Ρ€Π΅ΠΏΠΎΡ€Ρ‚ΠΈΠ½Π³
(Π˜Π»Π»ΡŽΡΡ‚Ρ€Π°Ρ†ΠΈΡ взята ΠΈΠ· ΡΡ‚Π°Ρ‚ΡŒΠΈ Β«Π‘ΠΈΠ½Ρ‚Π΅Π· ΠΊΠ°ΠΊ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ PostgreSQLΒ»)

ПояснСниС:

  • Π’ Ρ†Π΅Π»Π΅Π²ΠΎΠΉ Π±Π°Π·Π΅ устанавливаСтся стандартноС Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ PostgreSQL β€” β€œpg_stat_statements”.
  • Π’ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° создаСм Π½Π°Π±ΠΎΡ€ сСрвисных Ρ‚Π°Π±Π»ΠΈΡ† для хранСния истории pg_stat_statements Π½Π° Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΌ этапС ΠΈ для настройки ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊ ΠΈ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° Π² дальнСйшСм
  • На хостС ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° создаСм Π½Π°Π±ΠΎΡ€ bash-скриптов, Π² Ρ‚ΠΎΠΌ, числС для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΈΠ½Ρ†ΠΈΠ΄Π΅Π½Ρ‚ΠΎΠ² Π² Ρ‚ΠΈΠΊΠ΅Ρ‚Π½ΠΎΠΉ систСмС.

БСрвисныС Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹

Для Π½Π°Ρ‡Π°Π»Π° схСматично-упрощСнная ERD, Ρ‡Ρ‚ΠΎ ΠΆΠ΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ Π² ΠΈΡ‚ΠΎΠ³Π΅:
ΠœΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ запросов PostgreSQL. Π§Π°ΡΡ‚ΡŒ 1 — Ρ€Π΅ΠΏΠΎΡ€Ρ‚ΠΈΠ½Π³
ΠšΡ€Π°Ρ‚ΠΊΠΎΠ΅ описаниС Ρ‚Π°Π±Π»ΠΈΡ†endpoint β€” хост, Ρ‚ΠΎΡ‡ΠΊΠ° ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊ инстансу
database β€” ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…
pg_stat_history β€” историчСская Ρ‚Π°Π±Π»ΠΈΡ†Π° для хранСния Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… снимков прСдставлСния pg_stat_statements Ρ†Π΅Π»Π΅Π²ΠΎΠΉ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…
metric_glossary β€” ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ
metric_config β€” конфигурация ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊ
metric β€” конкрСтная ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠ° для запроса ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ мониторится
metric_alert_history β€” история ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠΉ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ
log_query β€” слуТСбная Ρ‚Π°Π±Π»ΠΈΡ†Π° для хранСния Ρ€Π°Π·ΠΎΠ±Ρ€Π°Π½Π½Ρ‹Ρ… записСй ΠΈΠ· log Ρ„Π°ΠΉΠ»Π° PostgreSQL Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌΠΌΠΎΠ³ΠΎ с AWS
baseline β€” ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ Π² качСствС Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ
checkpoint β€” конфигурация ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ состояния Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…
checkpoint_alert_history β€” история ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠΉ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ состояния Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…
pg_stat_db_queries β€” слуТСбная Ρ‚Π°Π±Π»ΠΈΡ†Π° Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Ρ… запросов
activity_log β€” слуТСбная Ρ‚Π°Π±Π»ΠΈΡ†Π° ΠΆΡƒΡ€Π½Π°Π»Π° активности
trap_oid β€” слуТСбная Ρ‚Π°Π±Π»ΠΈΡ†Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ trap

Π­Ρ‚Π°ΠΏ 1 β€” собираСм ΡΡ‚Π°Ρ‚ΠΈΡΡ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΎΡ‚Ρ‡Π΅Ρ‚Ρ‹

Для хранСния статистичСской ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ слуТит Ρ‚Π°Π±Π»ΠΈΡ†Π° pg_stat_history
Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ pg_stat_history

                                          Table "public.pg_stat_history"
       Column        |            Type             |                          Modifiers
---------------------+-----------------------------+-------------------------------------------
 id                  | integer                     | not null default nextval('pg_stat_history_id_seq'::regclass)
 snapshot_timestamp  | timestamp without time zone |
 database_id         | integer                     |
 dbid                | oid                         |
 userid              | oid                         |
 queryid             | bigint                      |
 query               | text                        |
 calls               | bigint                      |
 total_time          | double precision            |
 min_time            | double precision            |
 max_time            | double precision            |
 mean_time           | double precision            |
 stddev_time         | double precision            |
 rows                | bigint                      |
 shared_blks_hit     | bigint                      |
 shared_blks_read    | bigint                      |
 shared_blks_dirtied | bigint                      |
 shared_blks_written | bigint                      |
 local_blks_hit      | bigint                      |
 local_blks_read     | bigint                      |
 local_blks_dirtied  | bigint                      |
 local_blks_written  | bigint                      |
 temp_blks_read      | bigint                      |
 temp_blks_written   | bigint                      |
 blk_read_time       | double precision            |
 blk_write_time      | double precision            |
 baseline_id         | integer                     |
Indexes:
    "pg_stat_history_pkey" PRIMARY KEY, btree (id)
    "database_idx" btree (database_id)
    "queryid_idx" btree (queryid)
    "snapshot_timestamp_idx" btree (snapshot_timestamp)
Foreign-key constraints:
    "database_id_fk" FOREIGN KEY (database_id) REFERENCES database(id) ON DELETE CASCADE

Как Π²ΠΈΠ΄Π½ΠΎ, Ρ‚Π°Π±Π»ΠΈΡ†Π° прСдставляСт собой всСго лишь кумулятивныС Π΄Π°Π½Π½Ρ‹Π΅ прСдставлСния pg_stat_statements Π² Ρ†Π΅Π»Π΅Π²ΠΎΠΉ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ….

ИспользованиС этой Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΎΡ‡Π΅Π½ΡŒ простоС

pg_stat_history Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ собой Π½Π°ΠΊΠΎΠΏΠ»Π΅Π½Π½ΡƒΡŽ статистику выполнСния запросов Π·Π° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ час. Π’ Π½Π°Ρ‡Π°Π»Π΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ часа, послС заполнСния Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹, статистика pg_stat_statements сбрасываСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ pg_stat_statements_reset().
ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: cтатистика собираСтся для запросов, с Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ выполнСния Π±ΠΎΠ»Π΅Π΅ 1 сСкунды.
Π—Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ pg_stat_history

--pg_stat_history.sql
CREATE OR REPLACE FUNCTION pg_stat_history( ) RETURNS boolean AS $$
DECLARE
  endpoint_rec record ;
  database_rec record ;
  pg_stat_snapshot record ;
  current_snapshot_timestamp timestamp without time zone;
BEGIN
  current_snapshot_timestamp = date_trunc('minute',now());  
  
  FOR endpoint_rec IN SELECT * FROM endpoint 
  LOOP
    FOR database_rec IN SELECT * FROM database WHERE endpoint_id = endpoint_rec.id 
	  LOOP
	    
		RAISE NOTICE 'NEW SHAPSHOT IS CREATING';
		
		--Connect to the target DB	  
	    EXECUTE 'SELECT dblink_connect(''LINK1'',''host='||endpoint_rec.host||' dbname='||database_rec.name||' user=USER password=PASSWORD '')';
 
        RAISE NOTICE 'host % and dbname % ',endpoint_rec.host,database_rec.name;
		RAISE NOTICE 'Creating snapshot of pg_stat_statements for database %',database_rec.name;
		
		SELECT 
	      *
		INTO 
		  pg_stat_snapshot
	    FROM dblink('LINK1',
	      'SELECT 
	       dbid , SUM(calls),SUM(total_time),SUM(rows) ,SUM(shared_blks_hit) ,SUM(shared_blks_read) ,SUM(shared_blks_dirtied) ,SUM(shared_blks_written) , 
           SUM(local_blks_hit) , SUM(local_blks_read) , SUM(local_blks_dirtied) , SUM(local_blks_written) , SUM(temp_blks_read) , SUM(temp_blks_written) , SUM(blk_read_time) , SUM(blk_write_time)
	       FROM pg_stat_statements WHERE dbid=(SELECT oid from pg_database where datname=current_database() ) 
		   GROUP BY dbid
  	      '
	               )
	      AS t
	       ( dbid oid , calls bigint , 
  	         total_time double precision , 
	         rows bigint , shared_blks_hit bigint , shared_blks_read bigint ,shared_blks_dirtied bigint ,shared_blks_written	 bigint ,
             local_blks_hit	 bigint ,local_blks_read bigint , local_blks_dirtied bigint ,local_blks_written bigint ,
             temp_blks_read	 bigint ,temp_blks_written bigint ,
             blk_read_time double precision , blk_write_time double precision	  
	       );
		 
		INSERT INTO pg_stat_history
          ( 
		    snapshot_timestamp  ,database_id  ,
			dbid , calls  ,total_time ,
            rows ,shared_blks_hit  ,shared_blks_read  ,shared_blks_dirtied  ,shared_blks_written ,local_blks_hit , 	 	
            local_blks_read,local_blks_dirtied,local_blks_written,temp_blks_read,temp_blks_written, 	
            blk_read_time, blk_write_time 
		  )		  
	    VALUES
	      (
	       current_snapshot_timestamp ,
		   database_rec.id ,
	       pg_stat_snapshot.dbid ,pg_stat_snapshot.calls,
	       pg_stat_snapshot.total_time,
	       pg_stat_snapshot.rows ,pg_stat_snapshot.shared_blks_hit ,pg_stat_snapshot.shared_blks_read ,pg_stat_snapshot.shared_blks_dirtied ,pg_stat_snapshot.shared_blks_written , 
           pg_stat_snapshot.local_blks_hit , pg_stat_snapshot.local_blks_read , pg_stat_snapshot.local_blks_dirtied , pg_stat_snapshot.local_blks_written , 
	       pg_stat_snapshot.temp_blks_read , pg_stat_snapshot.temp_blks_written , pg_stat_snapshot.blk_read_time , pg_stat_snapshot.blk_write_time 	   
	      );		   
		  
        RAISE NOTICE 'Creating snapshot of pg_stat_statements for queries with min_time more than 1000ms';
	
        FOR pg_stat_snapshot IN
          --All queries with max_time greater than 1000 ms
	      SELECT 
	        *
	      FROM dblink('LINK1',
	        'SELECT 
	         dbid , userid ,queryid,query,calls,total_time,min_time ,max_time,mean_time, stddev_time ,rows ,shared_blks_hit ,
			 shared_blks_read ,shared_blks_dirtied ,shared_blks_written , 
             local_blks_hit , local_blks_read , local_blks_dirtied , 
			 local_blks_written , temp_blks_read , temp_blks_written , blk_read_time , 
			 blk_write_time
	         FROM pg_stat_statements 
			 WHERE dbid=(SELECT oid from pg_database where datname=current_database() AND min_time >= 1000 ) 
  	        '

	                  )
	        AS t
	         ( dbid oid , userid oid , queryid bigint ,query text , calls bigint , 
  	           total_time double precision ,min_time double precision	 ,max_time double precision	 , mean_time double precision	 ,  stddev_time double precision	 , 
	           rows bigint , shared_blks_hit bigint , shared_blks_read bigint ,shared_blks_dirtied bigint ,shared_blks_written	 bigint ,
               local_blks_hit	 bigint ,local_blks_read bigint , local_blks_dirtied bigint ,local_blks_written bigint ,
               temp_blks_read	 bigint ,temp_blks_written bigint ,
               blk_read_time double precision , blk_write_time double precision	  
	         )
	    LOOP
		  INSERT INTO pg_stat_history
          ( 
		    snapshot_timestamp  ,database_id  ,
			dbid ,userid  , queryid  , query  , calls  ,total_time ,min_time ,max_time ,mean_time ,stddev_time ,
            rows ,shared_blks_hit  ,shared_blks_read  ,shared_blks_dirtied  ,shared_blks_written ,local_blks_hit , 	 	
            local_blks_read,local_blks_dirtied,local_blks_written,temp_blks_read,temp_blks_written, 	
            blk_read_time, blk_write_time 
		  )		  
	      VALUES
	      (
	       current_snapshot_timestamp ,
		   database_rec.id ,
	       pg_stat_snapshot.dbid ,pg_stat_snapshot.userid ,pg_stat_snapshot.queryid,pg_stat_snapshot.query,pg_stat_snapshot.calls,
	       pg_stat_snapshot.total_time,pg_stat_snapshot.min_time ,pg_stat_snapshot.max_time,pg_stat_snapshot.mean_time, pg_stat_snapshot.stddev_time ,
	       pg_stat_snapshot.rows ,pg_stat_snapshot.shared_blks_hit ,pg_stat_snapshot.shared_blks_read ,pg_stat_snapshot.shared_blks_dirtied ,pg_stat_snapshot.shared_blks_written , 
           pg_stat_snapshot.local_blks_hit , pg_stat_snapshot.local_blks_read , pg_stat_snapshot.local_blks_dirtied , pg_stat_snapshot.local_blks_written , 
	       pg_stat_snapshot.temp_blks_read , pg_stat_snapshot.temp_blks_written , pg_stat_snapshot.blk_read_time , pg_stat_snapshot.blk_write_time 	   
	      );
		  
        END LOOP;

        PERFORM dblink_disconnect('LINK1');  
				
	  END LOOP ;--FOR database_rec IN SELECT * FROM database WHERE endpoint_id = endpoint_rec.id 
    
  END LOOP;

RETURN TRUE;  
END
$$ LANGUAGE plpgsql;

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅, послС Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄Π° Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ pg_stat_history Ρƒ нас Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°Π±ΠΎΡ€ снимков содСрТимого Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ pg_stat_statements Ρ†Π΅Π»Π΅Π²ΠΎΠΉ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ….

БобствСнно Ρ€Π΅ΠΏΠΎΡ€Ρ‚ΠΈΠ½Π³

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ простыС запросы, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π²ΠΏΠΎΠ»Π½Π΅ сСбС ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Π΅ ΠΈ интСрСсныС ΠΎΡ‚Ρ‡Π΅Ρ‚Ρ‹.

АгрСгированныС Π΄Π°Π½Π½Ρ‹Π΅ Π·Π° Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΠΊ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ

Запрос

SELECT 
  database_id , 
  SUM(calls) AS calls ,SUM(total_time)  AS total_time ,
  SUM(rows) AS rows , SUM(shared_blks_hit)  AS shared_blks_hit,
  SUM(shared_blks_read) AS shared_blks_read ,
  SUM(shared_blks_dirtied) AS shared_blks_dirtied,
  SUM(shared_blks_written) AS shared_blks_written , 
  SUM(local_blks_hit) AS local_blks_hit , 
  SUM(local_blks_read) AS local_blks_read , 
  SUM(local_blks_dirtied) AS local_blks_dirtied , 
  SUM(local_blks_written)  AS local_blks_written,
  SUM(temp_blks_read) AS temp_blks_read, 
  SUM(temp_blks_written) temp_blks_written , 
  SUM(blk_read_time) AS blk_read_time , 
  SUM(blk_write_time) AS blk_write_time
FROM 
  pg_stat_history
WHERE 
  queryid IS NULL AND
  database_id = DATABASE_ID  AND
  snapshot_timestamp BETWEEN BEGIN_TIMEPOINT AND END_TIMEPOINT
GROUP BY database_id ;

DB Time

to_char(interval ‘1 millisecond’ * pg_total_stat_history_rec.total_time, ‘HH24:MI:SS.MS’)

I/O Time

to_char(interval ‘1 millisecond’ * ( pg_total_stat_history_rec.blk_read_time + pg_total_stat_history_rec.blk_write_time ), ‘HH24:MI:SS.MS’)

TOP10 SQL by total_time

Запрос

SELECT 
  queryid , 
  SUM(calls) AS calls ,
  SUM(total_time)  AS total_time  	
FROM 
  pg_stat_history
WHERE 
  queryid IS NOT NULL AND 
  database_id = DATABASE_ID AND
  snapshot_timestamp BETWEEN BEGIN_TIMEPOINT AND END_TIMEPOINT 
GROUP BY queryid 
ORDER BY 3 DESC 
LIMIT 10
-------------------------------------------------------------------------------------
| TOP10 SQL BY TOTAL EXECUTION TIME
|   #|    queryid|      calls|    calls %|                total_time (ms) |  dbtime %
+----+-----------+-----------+-----------+--------------------------------+----------
|   1|  821760255|          2|     .00001|00:03:23.141(    203141.681 ms.)|      5.42
|   2| 4152624390|          2|     .00001|00:03:13.929(    193929.215 ms.)|      5.17
|   3| 1484454471|          4|     .00001|00:02:09.129(    129129.057 ms.)|      3.44
|   4|  655729273|          1|     .00000|00:02:01.869(    121869.981 ms.)|      3.25
|   5| 2460318461|          1|     .00000|00:01:33.113(     93113.835 ms.)|      2.48
|   6| 2194493487|          4|     .00001|00:00:17.377(     17377.868 ms.)|       .46
|   7| 1053044345|          1|     .00000|00:00:06.156(      6156.352 ms.)|       .16
|   8| 3644780286|          1|     .00000|00:00:01.063(      1063.830 ms.)|       .03

TOP10 SQL by total I/O time

Запрос

SELECT 
  queryid , 
  SUM(calls) AS calls ,
  SUM(blk_read_time + blk_write_time)  AS io_time
FROM 
  pg_stat_history
WHERE 
  queryid IS NOT NULL AND 
  database_id = DATABASE_ID  AND
  snapshot_timestamp BETWEEN BEGIN_TIMEPOINT AND END_TIMEPOINT
GROUP BY  queryid 
ORDER BY 3 DESC 
LIMIT 10
----------------------------------------------------------------------------------------
| TOP10 SQL BY TOTAL I/O TIME
|   #|    queryid|      calls|    calls %|                   I/O time (ms)|db I/O time %
+----+-----------+-----------+-----------+--------------------------------+-------------
|   1| 4152624390|          2|     .00001|00:08:31.616(    511616.592 ms.)|        31.06
|   2|  821760255|          2|     .00001|00:08:27.099(    507099.036 ms.)|        30.78
|   3|  655729273|          1|     .00000|00:05:02.209(    302209.137 ms.)|        18.35
|   4| 2460318461|          1|     .00000|00:04:05.981(    245981.117 ms.)|        14.93
|   5| 1484454471|          4|     .00001|00:00:39.144(     39144.221 ms.)|         2.38
|   6| 2194493487|          4|     .00001|00:00:18.182(     18182.816 ms.)|         1.10
|   7| 1053044345|          1|     .00000|00:00:16.611(     16611.722 ms.)|         1.01
|   8| 3644780286|          1|     .00000|00:00:00.436(       436.205 ms.)|          .03

TOP10 SQL by max time of execution

Запрос

SELECT 
  id AS snapshotid , 
  queryid , 
  snapshot_timestamp ,  
  max_time 
FROM 
  pg_stat_history 
WHERE 
  queryid IS NOT NULL AND 
  database_id = DATABASE_ID  AND
  snapshot_timestamp BETWEEN BEGIN_TIMEPOINT AND END_TIMEPOINT
ORDER BY 4 DESC 
LIMIT 10

-----------------------------------------------------------------------------------------
| TOP10 SQL BY MAX EXECUTION TIME
|   #|          snapshot| snapshotID|    queryid|                           max_time (ms)
+----+------------------+-----------+-----------+----------------------------------------
|   1|  05.04.2019 01:03|       4169|  655729273|        00:02:01.869(    121869.981 ms.)
|   2|  04.04.2019 17:00|       4153|  821760255|        00:01:41.570(    101570.841 ms.)
|   3|  04.04.2019 16:00|       4146|  821760255|        00:01:41.570(    101570.841 ms.)
|   4|  04.04.2019 16:00|       4144| 4152624390|        00:01:36.964(     96964.607 ms.)
|   5|  04.04.2019 17:00|       4151| 4152624390|        00:01:36.964(     96964.607 ms.)
|   6|  05.04.2019 10:00|       4188| 1484454471|        00:01:33.452(     93452.150 ms.)
|   7|  04.04.2019 17:00|       4150| 2460318461|        00:01:33.113(     93113.835 ms.)
|   8|  04.04.2019 15:00|       4140| 1484454471|        00:00:11.892(     11892.302 ms.)
|   9|  04.04.2019 16:00|       4145| 1484454471|        00:00:11.892(     11892.302 ms.)
|  10|  04.04.2019 17:00|       4152| 1484454471|        00:00:11.892(     11892.302 ms.)

TOP10 SQL by SHARED buffer read/write

Запрос

SELECT 
  id AS snapshotid , 
  queryid ,
  snapshot_timestamp , 
  shared_blks_read , 
  shared_blks_written 
FROM 
  pg_stat_history
WHERE 
  queryid IS NOT NULL AND 
  database_id = DATABASE_ID  AND
  snapshot_timestamp BETWEEN BEGIN_TIMEPOINT AND END_TIMEPOINT AND
  ( shared_blks_read > 0 OR shared_blks_written > 0 )
ORDER BY 4 DESC  , 5 DESC 
LIMIT 10
--------------------------------------------------------------------------------------------
| TOP10 SQL BY SHARED BUFFER READ/WRITE
|   #|          snapshot| snapshotID|    queryid|   shared blocks read|  shared blocks write
+----+------------------+-----------+-----------+---------------------+---------------------
|   1|  04.04.2019 17:00|       4153|  821760255|               797308|                    0
|   2|  04.04.2019 16:00|       4146|  821760255|               797308|                    0
|   3|  05.04.2019 01:03|       4169|  655729273|               797158|                    0
|   4|  04.04.2019 16:00|       4144| 4152624390|               756514|                    0
|   5|  04.04.2019 17:00|       4151| 4152624390|               756514|                    0
|   6|  04.04.2019 17:00|       4150| 2460318461|               734117|                    0
|   7|  04.04.2019 17:00|       4155| 3644780286|                52973|                    0
|   8|  05.04.2019 01:03|       4168| 1053044345|                52818|                    0
|   9|  04.04.2019 15:00|       4141| 2194493487|                52813|                    0
|  10|  04.04.2019 16:00|       4147| 2194493487|                52813|                    0
--------------------------------------------------------------------------------------------

Гистограмма распрСдСлСния запросов ΠΏΠΎ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠΌΡƒ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния

Запросы

SELECT  
  MIN(max_time) AS hist_min  , 
  MAX(max_time) AS hist_max , 
  (( MAX(max_time) - MIN(min_time) ) / hist_columns ) as hist_width
FROM 
  pg_stat_history 
WHERE 
  queryid IS NOT NULL AND
  database_id = DATABASE_ID  AND
  snapshot_timestamp BETWEEN BEGIN_TIMEPOINT AND END_TIMEPOINT ;

SELECT 
  SUM(calls) AS calls
FROM 
  pg_stat_history 
WHERE 
  queryid IS NOT NULL AND
  database_id =DATABASE_ID  AND
  snapshot_timestamp BETWEEN BEGIN_TIMEPOINT AND END_TIMEPOINT AND 
  ( max_time >= hist_current_min AND  max_time < hist_current_max ) ;
|-----------------------------------------------------------------------------------------------
| MAX_TIME HISTOGRAM
| TOTAL CALLS : 33851920
| MIN TIME  : 00:00:01.063
| MAX TIME  : 00:02:01.869
---------------------------------------------------------------------------------
|                      min duration|                      max duration|     calls
+----------------------------------+----------------------------------+----------
| 00:00:01.063(      1063.830 ms.) | 00:00:13.144(     13144.445 ms.) | 9
| 00:00:13.144(     13144.445 ms.) | 00:00:25.225(     25225.060 ms.) | 0
| 00:00:25.225(     25225.060 ms.) | 00:00:37.305(     37305.675 ms.) | 0
| 00:00:37.305(     37305.675 ms.) | 00:00:49.386(     49386.290 ms.) | 0
| 00:00:49.386(     49386.290 ms.) | 00:01:01.466(     61466.906 ms.) | 0
| 00:01:01.466(     61466.906 ms.) | 00:01:13.547(     73547.521 ms.) | 0
| 00:01:13.547(     73547.521 ms.) | 00:01:25.628(     85628.136 ms.) | 0
| 00:01:25.628(     85628.136 ms.) | 00:01:37.708(     97708.751 ms.) | 4
| 00:01:37.708(     97708.751 ms.) | 00:01:49.789(    109789.366 ms.) | 2
| 00:01:49.789(    109789.366 ms.) | 00:02:01.869(    121869.981 ms.) | 0

TOP10 Snapshots by Query per Second

Запросы

--pg_qps.sql
--Calculate Query Per Second 
CREATE OR REPLACE FUNCTION pg_qps( pg_stat_history_id integer ) RETURNS double precision AS $$
DECLARE
 pg_stat_history_rec record ;
 prev_pg_stat_history_id integer ;
 prev_pg_stat_history_rec record;
 total_seconds double precision ;
 result double precision;
BEGIN 
  result = 0 ;
  
  SELECT *
  INTO pg_stat_history_rec
  FROM 
    pg_stat_history
  WHERE id = pg_stat_history_id ;

  IF pg_stat_history_rec.snapshot_timestamp IS NULL 
  THEN
    RAISE EXCEPTION 'ERROR - Not found pg_stat_history for id = %',pg_stat_history_id;
  END IF ;  
  
 --RAISE NOTICE 'pg_stat_history_id = % , snapshot_timestamp = %', pg_stat_history_id , 
 pg_stat_history_rec.snapshot_timestamp ;
  
  SELECT 
    MAX(id)   
  INTO
    prev_pg_stat_history_id
  FROM
    pg_stat_history
  WHERE 
    database_id = pg_stat_history_rec.database_id AND
	queryid IS NULL AND
	id < pg_stat_history_rec.id ;

  IF prev_pg_stat_history_id IS NULL 
  THEN
    RAISE NOTICE 'Not found previous pg_stat_history shapshot for id = %',pg_stat_history_id;
	RETURN NULL ;
  END IF;
  
  SELECT *
  INTO prev_pg_stat_history_rec
  FROM 
    pg_stat_history
  WHERE id = prev_pg_stat_history_id ;
  
  --RAISE NOTICE 'prev_pg_stat_history_id = % , prev_snapshot_timestamp = %', prev_pg_stat_history_id , prev_pg_stat_history_rec.snapshot_timestamp ;    

  total_seconds = extract(epoch from ( pg_stat_history_rec.snapshot_timestamp - prev_pg_stat_history_rec.snapshot_timestamp ));
  
  --RAISE NOTICE 'total_seconds = % ', total_seconds ;    
  
  --RAISE NOTICE 'calls = % ', pg_stat_history_rec.calls ;      
  
  IF total_seconds > 0 
  THEN
    result = pg_stat_history_rec.calls / total_seconds ;
  ELSE
   result = 0 ; 
  END IF;
   
 RETURN result ;
END
$$ LANGUAGE plpgsql;


SELECT 
  id , 
  snapshot_timestamp ,
  calls , 	
  total_time , 
  ( select pg_qps( id )) AS QPS ,
  blk_read_time ,
  blk_write_time
FROM 
  pg_stat_history
WHERE 
  queryid IS NULL AND 
  database_id = DATABASE_ID  AND
  snapshot_timestamp BETWEEN BEGIN_TIMEPOINT AND END_TIMEPOINT AND
  ( select pg_qps( id )) IS NOT NULL 
ORDER BY 5 DESC 
LIMIT 10
|-----------------------------------------------------------------------------------------------
| TOP10 Snapshots ordered by QueryPerSeconds numbers
-----------------------------------------------------------------------------------------------------------------------------------------------
|    #|          snapshot| snapshotID|      calls|                      total dbtime|        QPS|                          I/O time| I/O time %
+-----+------------------+-----------+-----------+----------------------------------+-----------+----------------------------------+-----------
|    1|  04.04.2019 20:04|       4161|    5758631|  00:06:30.513(    390513.926 ms.)|   1573.396|  00:00:01.470(      1470.110 ms.)|       .376
|    2|  04.04.2019 17:00|       4149|    3529197|  00:11:48.830(    708830.618 ms.)|    980.332|  00:12:47.834(    767834.052 ms.)|    108.324
|    3|  04.04.2019 16:00|       4143|    3525360|  00:10:13.492(    613492.351 ms.)|    979.267|  00:08:41.396(    521396.555 ms.)|     84.988
|    4|  04.04.2019 21:03|       4163|    2781536|  00:03:06.470(    186470.979 ms.)|    785.745|  00:00:00.249(       249.865 ms.)|       .134
|    5|  04.04.2019 19:03|       4159|    2890362|  00:03:16.784(    196784.755 ms.)|    776.979|  00:00:01.441(      1441.386 ms.)|       .732
|    6|  04.04.2019 14:00|       4137|    2397326|  00:04:43.033(    283033.854 ms.)|    665.924|  00:00:00.024(        24.505 ms.)|       .009
|    7|  04.04.2019 15:00|       4139|    2394416|  00:04:51.435(    291435.010 ms.)|    665.116|  00:00:12.025(     12025.895 ms.)|      4.126
|    8|  04.04.2019 13:00|       4135|    2373043|  00:04:26.791(    266791.988 ms.)|    659.179|  00:00:00.064(        64.261 ms.)|       .024
|    9|  05.04.2019 01:03|       4167|    4387191|  00:06:51.380(    411380.293 ms.)|    609.332|  00:05:18.847(    318847.407 ms.)|     77.507
|   10|  04.04.2019 18:01|       4157|    1145596|  00:01:19.217(     79217.372 ms.)|    313.004|  00:00:01.319(      1319.676 ms.)|      1.666

Hourly Execution History with QueryPerSeconds and I/O Time

Запрос

SELECT 
  id , 
  snapshot_timestamp ,
  calls , 	
  total_time , 
  ( select pg_qps( id )) AS QPS ,
  blk_read_time ,
  blk_write_time
FROM 
  pg_stat_history
WHERE 
  queryid IS NULL AND 
  database_id = DATABASE_ID  AND
  snapshot_timestamp BETWEEN BEGIN_TIMEPOINT AND END_TIMEPOINT
ORDER BY 2
|-----------------------------------------------------------------------------------------------
| HOURLY EXECUTION HISTORY  WITH QueryPerSeconds and I/O Time
-----------------------------------------------------------------------------------------------------------------------------------------------
| QUERY PER SECOND HISTORY
|    #|          snapshot| snapshotID|      calls|                      total dbtime|        QPS|                          I/O time| I/O time %
+-----+------------------+-----------+-----------+----------------------------------+-----------+----------------------------------+-----------
|    1|  04.04.2019 11:00|       4131|       3747|  00:00:00.835(       835.374 ms.)|      1.041|  00:00:00.000(          .000 ms.)|       .000
|    2|  04.04.2019 12:00|       4133|    1002722|  00:01:52.419(    112419.376 ms.)|    278.534|  00:00:00.149(       149.105 ms.)|       .133
|    3|  04.04.2019 13:00|       4135|    2373043|  00:04:26.791(    266791.988 ms.)|    659.179|  00:00:00.064(        64.261 ms.)|       .024
|    4|  04.04.2019 14:00|       4137|    2397326|  00:04:43.033(    283033.854 ms.)|    665.924|  00:00:00.024(        24.505 ms.)|       .009
|    5|  04.04.2019 15:00|       4139|    2394416|  00:04:51.435(    291435.010 ms.)|    665.116|  00:00:12.025(     12025.895 ms.)|      4.126
|    6|  04.04.2019 16:00|       4143|    3525360|  00:10:13.492(    613492.351 ms.)|    979.267|  00:08:41.396(    521396.555 ms.)|     84.988
|    7|  04.04.2019 17:00|       4149|    3529197|  00:11:48.830(    708830.618 ms.)|    980.332|  00:12:47.834(    767834.052 ms.)|    108.324
|    8|  04.04.2019 18:01|       4157|    1145596|  00:01:19.217(     79217.372 ms.)|    313.004|  00:00:01.319(      1319.676 ms.)|      1.666
|    9|  04.04.2019 19:03|       4159|    2890362|  00:03:16.784(    196784.755 ms.)|    776.979|  00:00:01.441(      1441.386 ms.)|       .732
|   10|  04.04.2019 20:04|       4161|    5758631|  00:06:30.513(    390513.926 ms.)|   1573.396|  00:00:01.470(      1470.110 ms.)|       .376
|   11|  04.04.2019 21:03|       4163|    2781536|  00:03:06.470(    186470.979 ms.)|    785.745|  00:00:00.249(       249.865 ms.)|       .134
|   12|  04.04.2019 23:03|       4165|    1443155|  00:01:34.467(     94467.539 ms.)|    200.438|  00:00:00.015(        15.287 ms.)|       .016
|   13|  05.04.2019 01:03|       4167|    4387191|  00:06:51.380(    411380.293 ms.)|    609.332|  00:05:18.847(    318847.407 ms.)|     77.507
|   14|  05.04.2019 02:03|       4171|     189852|  00:00:10.989(     10989.899 ms.)|     52.737|  00:00:00.539(       539.110 ms.)|      4.906
|   15|  05.04.2019 03:01|       4173|       3627|  00:00:00.103(       103.000 ms.)|      1.042|  00:00:00.004(         4.131 ms.)|      4.010
|   16|  05.04.2019 04:00|       4175|       3627|  00:00:00.085(        85.235 ms.)|      1.025|  00:00:00.003(         3.811 ms.)|      4.471
|   17|  05.04.2019 05:00|       4177|       3747|  00:00:00.849(       849.454 ms.)|      1.041|  00:00:00.006(         6.124 ms.)|       .721
|   18|  05.04.2019 06:00|       4179|       3747|  00:00:00.849(       849.561 ms.)|      1.041|  00:00:00.000(          .051 ms.)|       .006
|   19|  05.04.2019 07:00|       4181|       3747|  00:00:00.839(       839.416 ms.)|      1.041|  00:00:00.000(          .062 ms.)|       .007
|   20|  05.04.2019 08:00|       4183|       3747|  00:00:00.846(       846.382 ms.)|      1.041|  00:00:00.000(          .007 ms.)|       .001
|   21|  05.04.2019 09:00|       4185|       3747|  00:00:00.855(       855.426 ms.)|      1.041|  00:00:00.000(          .065 ms.)|       .008
|   22|  05.04.2019 10:00|       4187|       3797|  00:01:40.150(    100150.165 ms.)|      1.055|  00:00:21.845(     21845.217 ms.)|     21.812

Text of all SQL-selects

Запрос

SELECT 
  queryid , 
  query 
FROM 
  pg_stat_history
WHERE 
  queryid IS NOT NULL AND 
  database_id = DATABASE_ID  AND
  snapshot_timestamp BETWEEN BEGIN_TIMEPOINT AND END_TIMEPOINT
GROUP BY queryid , query

Π˜Ρ‚ΠΎΠ³

Как Π²ΠΈΠ΄Π½ΠΎ, довольно простыми срСдствами, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ достаточно ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ загруТСнности ΠΈ состоянии Π±Π°Π·Ρ‹.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π΅Π½ΠΈΠ΅:Если Π² запросах Ρ„ΠΈΠΊΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ queryid Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ ΠΏΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌΡƒ запросу(с Ρ†Π΅Π»ΡŒΡŽ экономии мСста ΠΎΡ‚Ρ‡Π΅Ρ‚Ρ‹ ΠΏΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌΡƒ запросу ΠΎΠΏΡƒΡ‰Π΅Π½Ρ‹).

Π˜Ρ‚Π°ΠΊ, статистичСскиС Π΄Π°Π½Π½Ρ‹Π΅ ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ запросов β€” ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ ΠΈ ΡΠΎΠ±ΠΈΡ€Π°ΡŽΡ‚ΡΡ.
ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ этап «сбор статистичСских Π΄Π°Π½Π½Ρ‹Ρ…Β» β€” Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½.

МоТно ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌΡƒ этапу-«настройка ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈΒ».
ΠœΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ запросов PostgreSQL. Π§Π°ΡΡ‚ΡŒ 1 — Ρ€Π΅ΠΏΠΎΡ€Ρ‚ΠΈΠ½Π³

Но это ΡƒΠΆΠ΅ совсСм другая история.

ΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅ слСдуСт…

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com