Π Π°ΡΡΠΈΡΡΠΎΠ²ΠΊΠ° Π΄ΠΎΠΊΠ»Π°Π΄Π° 2015 Π³ΠΎΠ΄Π° ΠΠ»Π΅ΠΊΡΠ΅Ρ ΠΠ΅ΡΠΎΠ²ΡΠΊΠΎΠ³ΠΎ "Deep dive into PostgreSQL internal statistics"
Disclaimer ΠΎΡ Π°Π²ΡΠΎΡΠ° Π΄ΠΎΠΊΠ»Π°Π΄Π°: ΠΠ°ΠΌΠ΅ΡΡ ΡΡΠΎ Π΄ΠΎΠΊΠ»Π°Π΄ ΡΡΠΎΡ Π΄Π°ΡΠΈΡΠΎΠ²Π°Π½ Π½ΠΎΡΠ±ΡΠ΅ΠΌ 2015 Π³ΠΎΠ΄Π° β ΠΏΡΠΎΡΠ»ΠΎ Π±ΠΎΠ»ΡΡΠ΅ 4 Π»Π΅Ρ ΠΈ ΠΏΡΠΎΡΠ»ΠΎ ΠΌΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ. Π Π°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅ΠΌΠ°Ρ Π² Π΄ΠΎΠΊΠ»Π°Π΄Π΅ Π²Π΅ΡΡΠΈΡ 9.4 ΡΠΆΠ΅ Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΡΡΡ. ΠΠ° ΠΏΡΠΎΡΠ΅Π΄ΡΠΈΠ΅ 4 Π³ΠΎΠ΄Π° Π²ΡΡΠ»ΠΎ 5 Π½ΠΎΠ²ΡΡ ΡΠ΅Π»ΠΈΠ·ΠΎΠ² Π² ΠΊΠΎΡΠΎΡΡΡ ΠΏΠΎΡΠ²ΠΈΠ»Π°ΡΡ ΠΌΠ°ΡΡΠ° Π½ΠΎΠ²ΡΠ΅ΡΡΠ², ΡΠ»ΡΡΡΠ΅Π½ΠΈΠΉ ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠΈ ΠΈ ΡΠ°ΡΡΡ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»Π° ΡΡΡΠ°ΡΠ΅Π»Π° ΠΈ Π½Π΅ Π°ΠΊΡΡΠ°Π»ΡΠ½Π°. ΠΠΎ ΠΌΠ΅ΡΠ΅ ΡΠ΅Π²ΡΡ Ρ ΠΏΠΎΡΡΠ°ΡΠ°Π»ΡΡ ΠΎΡΠΌΠ΅ΡΠΈΡΡ ΡΡΠΈ ΠΌΠ΅ΡΡΠ° ΡΡΠΎΠ±Ρ Π½Π΅ Π²Π²ΠΎΠ΄ΠΈΡΡ ΡΠ΅Π±Ρ ΡΠΈΡΠ°ΡΠ΅Π»Ρ Π² Π·Π°Π±Π»ΡΠΆΠ΄Π΅Π½ΠΈΡ. ΠΠ΅ΡΠ΅ΠΏΠΈΡΡΠ²Π°ΡΡ ΠΆΠ΅ ΡΡΠΈ ΠΌΠ΅ΡΡΠ° Ρ Π½Π΅ ΡΡΠ°Π», ΠΈΡ ΠΎΡΠ΅Π½Ρ ΠΌΠ½ΠΎΠ³ΠΎ ΠΈ ΠΏΠΎΠ»ΡΡΠΈΡΡΡ Π² ΠΈΡΠΎΠ³Π΅ ΡΠΎΠ²ΡΠ΅ΠΌ Π΄ΡΡΠ³ΠΎΠΉ Π΄ΠΎΠΊΠ»Π°Π΄.
Π‘Π£ΠΠ PostgreSQL β ΡΡΠΎ ΠΎΠ³ΡΠΎΠΌΠ½ΡΠΉ ΠΌΠ΅Ρ
Π°Π½ΠΈΠ·ΠΌ, ΠΏΡΠΈ ΡΡΠΎΠΌ ΡΠΎΡΡΠΎΠΈΡ ΡΡΠΎΡ ΠΌΠ΅Ρ
Π°Π½ΠΈΠ·ΠΌ ΠΈΠ· ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π° ΠΏΠΎΠ΄ΡΠΈΡΡΠ΅ΠΌ, ΠΎΡ ΡΠ»Π°ΠΆΠ΅Π½Π½ΠΎΠΉ ΡΠ°Π±ΠΎΡΡ ΠΊΠΎΡΠΎΡΡΡ
Π½Π°ΠΏΡΡΠΌΡΡ Π·Π°Π²ΠΈΡΠΈΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ Π‘Π£ΠΠ. Π ΠΏΡΠΎΡΠ΅ΡΡΠ΅ ΡΠΊΡΠΏΠ»ΡΠ°ΡΠ°ΡΠΈΠΈ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅ΡΡΡ ΡΠ±ΠΎΡ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠΈ ΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎ ΡΠ°Π±ΠΎΡΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ², ΡΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΎΡΠ΅Π½ΠΈΡΡ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΡΡΡ PostgreSQL ΠΈ ΠΏΡΠΈΠ½ΡΡΡ ΠΌΠ΅ΡΡ Π΄Π»Ρ ΠΏΠΎΠ²ΡΡΠ΅Π½ΠΈΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ. ΠΠ΄Π½Π°ΠΊΠΎ, ΡΡΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎΡΠ΅Π½Ρ ΠΌΠ½ΠΎΠ³ΠΎ ΠΈ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Π° ΠΎΠ½Π° Π² Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΡΠΏΡΠΎΡΠ΅Π½Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅. ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΡΡΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΈ Π΅Π΅ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΈΡ ΠΏΠΎΡΠΎΠΉ ΡΠΎΠ²ΡΠ΅ΠΌ Π½Π΅ΡΡΠΈΠ²ΠΈΠ°Π»ΡΠ½Π°Ρ Π·Π°Π΄Π°ΡΠ°, Π° "Π·ΠΎΠΎΠΏΠ°ΡΠΊ" ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠ² ΠΈ ΡΡΠΈΠ»ΠΈΡ Π·Π°ΠΏΡΠΎΡΡΠΎ ΠΏΠΎΡΡΠ°Π²ΠΈΡ Π² ΡΡΠΏΠΈΠΊ Π΄Π°ΠΆΠ΅ ΠΏΡΠΎΠ΄Π²ΠΈΠ½ΡΡΠΎΠ³ΠΎ DBA.
ΠΠΎΠ±ΡΡΠΉ Π΄Π΅Π½Ρ! ΠΠ΅Π½Ρ Π·ΠΎΠ²ΡΡ ΠΠ»Π΅ΠΊΡΠ΅ΠΉ. ΠΠ°ΠΊ ΠΠ»ΡΡ ΡΠΊΠ°Π·Π°Π», Ρ Π±ΡΠ΄Ρ ΡΠ°ΡΡΠΊΠ°Π·ΡΠ²Π°ΡΡ ΠΏΡΠΎ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΡ PostgreSQL.
Π‘ΡΠ°ΡΠΈΡΡΠΈΠΊΠ° Π°ΠΊΡΠΈΠ²Π½ΠΎΡΡΠΈ PostgreSQL. Π£ PostgreSQL Π΅ΡΡΡ Π΄Π²Π΅ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠΈ. Π‘ΡΠ°ΡΠΈΡΡΠΈΠΊΠ° Π°ΠΊΡΠΈΠ²Π½ΠΎΡΡΠΈ, ΠΏΡΠΎ ΠΊΠΎΡΠΎΡΡΡ Π±ΡΠ΄Π΅Ρ ΡΠ΅ΡΡ. Π ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠ° ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²ΡΠΈΠΊΠ° ΠΎ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ Π΄Π°Π½Π½ΡΡ . Π― Π±ΡΠ΄Ρ ΡΠ°ΡΡΠΊΠ°Π·ΡΠ²Π°ΡΡ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΎ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠ΅ Π°ΠΊΡΠΈΠ²Π½ΠΎΡΡΠΈ PostgreSQL, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π½Π°ΠΌ ΡΡΠ΄ΠΈΡΡ ΠΎ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ ΠΈ ΠΊΠ°ΠΊ-ΡΠΎ Π΅Π΅ ΡΠ»ΡΡΡΠ°ΡΡ.
Π Π°ΡΡΠΊΠ°ΠΆΡ, ΠΊΠ°ΠΊ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΡ Π΄Π»Ρ ΡΠ΅ΡΠ΅Π½ΠΈΡ ΡΠ°ΠΌΡΡ ΡΠ°Π·Π½ΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ, ΠΊΠΎΡΠΎΡΡΠ΅ Ρ Π²Π°Ρ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡΡ ΠΈΠ»ΠΈ ΠΌΠΎΠ³ΡΡ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡΡΡ.
Π§Π΅Π³ΠΎ Π½Π΅ Π±ΡΠ΄Π΅Ρ Π² Π΄ΠΎΠΊΠ»Π°Π΄Π΅? Π Π΄ΠΎΠΊΠ»Π°Π΄Π΅ Ρ Π½Π΅ Π±ΡΠ΄Ρ ΠΊΠ°ΡΠ°ΡΡΡΡ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠΈ ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²ΡΠΈΠΊΠ°, Ρ.ΠΊ. ΡΡΠΎ ΠΎΡΠ΄Π΅Π»ΡΠ½Π°Ρ ΡΠ΅ΠΌΠ° Π½Π° ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ Π΄ΠΎΠΊΠ»Π°Π΄ ΠΎ ΡΠΎΠΌ, ΠΊΠ°ΠΊ Π΄Π°Π½Π½ΡΠ΅ Ρ ΡΠ°Π½ΡΡΡΡ Π² Π±Π°Π·Π΅ ΠΈ ΠΎ ΡΠΎΠΌ ΠΊΠ°ΠΊ ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²ΡΠΈΠΊ Π·Π°ΠΏΡΠΎΡΠΎΠ² ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΎ ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅Π½Π½ΡΡ ΠΈ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π΅Π½Π½ΡΡ Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΠΈΡΠΊΠ°Ρ ΡΡΠΈΡ Π΄Π°Π½Π½ΡΡ .
Π Π½Π΅ Π±ΡΠ΄Π΅Ρ ΠΎΠ±Π·ΠΎΡΠΎΠ² ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠ², Ρ Π½Π΅ Π±ΡΠ΄Ρ ΡΡΠ°Π²Π½ΠΈΠ²Π°ΡΡ ΠΎΠ΄ΠΈΠ½ ΠΏΡΠΎΠ΄ΡΠΊΡ Ρ Π΄ΡΡΠ³ΠΈΠΌ. ΠΠΈΠΊΠ°ΠΊΠΎΠΉ ΡΠ΅ΠΊΠ»Π°ΠΌΡ Π½Π΅ Π±ΡΠ΄Π΅Ρ. ΠΡΠ±ΡΠΎΡΠΈΠΌ ΡΡΠΎ.
Π― Ρ ΠΎΡΡ Π²Π°ΠΌ ΠΏΠΎΠΊΠ°Π·Π°ΡΡ, ΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΡ β ΡΡΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ. ΠΡΠΎ Π½ΡΠΆΠ½ΠΎ. ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΅Π΅ Π½Π΅ΡΡΡΠ°ΡΠ½ΠΎ. ΠΠ°ΠΌ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡΡΡ Π²ΡΠ΅Π³ΠΎ Π»ΠΈΡΡ ΠΎΠ±ΡΡΠ½ΡΠΉ SQL ΠΈ Π±Π°Π·ΠΎΠ²ΡΠ΅ Π·Π½Π°Π½ΠΈΡ ΠΎ SQL.
Π ΠΏΠΎΠ³ΠΎΠ²ΠΎΡΠΈΠΌ, ΠΊΠ°ΠΊΡΡ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΡ Π²ΡΠ±ΠΈΡΠ°ΡΡ Π΄Π»Ρ ΡΠ΅ΡΠ΅Π½ΠΈΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ.
ΠΡΠ»ΠΈ ΠΌΡ ΠΏΠΎΡΠΌΠΎΡΡΠΈΠΌ Π½Π° PostgreSQL ΠΈ Π² ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠ΅ Π·Π°ΠΏΡΡΡΠΈΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρ Π΄Π»Ρ ΠΏΡΠΎΡΠΌΠΎΡΡΠ° ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ², ΡΠΎ ΡΠ²ΠΈΠ΄ΠΈΠΌ "ΡΠ΅ΡΠ½ΡΠΉ ΡΡΠΈΠΊ". ΠΡ ΡΠ²ΠΈΠ΄ΠΈΠΌ ΠΊΠ°ΠΊΠΈΠ΅-ΡΠΎ ΠΏΡΠΎΡΠ΅ΡΡΡ, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΡΠΎ-ΡΠΎ Π΄Π΅Π»Π°ΡΡ, ΠΈ ΠΌΡ ΠΏΠΎ Π½Π°Π·Π²Π°Π½ΠΈΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΡΡ, ΡΡΠΎ ΠΎΠ½ΠΈ ΡΠ°ΠΌ Π΄Π΅Π»Π°ΡΡ, ΡΠ΅ΠΌ Π·Π°Π½ΠΈΠΌΠ°ΡΡΡΡ. ΠΠΎ, ΠΏΠΎ ΡΡΡΠΈ, ΡΡΠΎ ΡΠ΅ΡΠ½ΡΠΉ ΡΡΠΈΠΊ, Π²ΠΎΠ²Π½ΡΡΡΡ ΠΌΡ Π·Π°Π³Π»ΡΠ½ΡΡΡ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ.
ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ Π½Π°Π³ΡΡΠ·ΠΊΡ Π½Π° ΠΏΡΠΎΡΠ΅ΡΡΠΎΡ Π² top
, ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ ΡΡΠΈΠ»ΠΈΠ·Π°ΡΠΈΡ ΠΏΠ°ΠΌΡΡΠΈ ΠΊΠ°ΠΊΠΈΠΌΠΈ-ΡΠΎ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠΌΠΈ ΡΡΠΈΠ»ΠΈΡΠ°ΠΌΠΈ, Π½ΠΎ Π·Π°Π³Π»ΡΠ½ΡΡΡ Π²ΠΎΠ²Π½ΡΡΡΡ PostgreSQL ΠΌΡ Π½Π΅ ΡΠΌΠΎΠΆΠ΅ΠΌ. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ Π½Π°ΠΌ Π½ΡΠΆΠ½Ρ Π΄ΡΡΠ³ΠΈΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ.
Π ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ Π΄Π°Π»ΡΡΠ΅ Ρ ΡΠ°ΡΡΠΊΠ°ΠΆΡ, ΠΊΡΠ΄Π° ΡΡΠ°ΡΠΈΡΡΡ Π²ΡΠ΅ΠΌΡ. ΠΡΠ»ΠΈ ΠΌΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΠΌ PostgreSQL Π² Π²ΠΈΠ΄Π΅ ΡΠ°ΠΊΠΎΠΉ ΡΡ Π΅ΠΌΡ, ΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ΄Π΅Ρ ΠΎΡΠ²Π΅ΡΠΈΡΡ, ΠΊΡΠ΄Π° ΡΡΠ°ΡΠΈΡΡΡ Π²ΡΠ΅ΠΌΡ. ΠΡΠΎ Π΄Π²Π΅ Π²Π΅ΡΠΈ: ΡΡΠΎ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΈΡ Π·Π°ΠΏΡΠΎΡΠΎΠ² ΠΎΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΈ ΡΠΎΠ½ΠΎΠ²ΡΠ΅ Π·Π°Π΄Π°ΡΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ PostgreSQL Π΄Π»Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠ°Π½ΠΈΡ ΡΠ²ΠΎΠ΅ΠΉ ΡΠ°Π±ΠΎΡΠΎΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΠΈ.
ΠΡΠ»ΠΈ ΠΌΡ Π½Π°ΡΠ½Π΅ΠΌ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡ Ρ Π»Π΅Π²ΠΎΠ³ΠΎ Π²Π΅ΡΡ Π½Π΅Π³ΠΎ ΡΠ³Π»Π°, ΡΠΎ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡΠΎΡΠ»Π΅Π΄ΠΈΡΡ, ΠΊΠ°ΠΊ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅ΡΡΡ ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΈΠ΅ Π·Π°ΠΏΡΠΎΡΡ. ΠΠ°ΠΏΡΠΎΡ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡ ΠΎΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΈ Π΄Π»Ρ Π΄Π°Π»ΡΠ½Π΅ΠΉΡΠ΅ΠΉ ΡΠ°Π±ΠΎΡΡ ΠΎΡΠΊΡΡΠ²Π°Π΅ΡΡΡ ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠ°Ρ ΡΠ΅ΡΡΠΈΡ. ΠΠ°ΠΏΡΠΎΡ ΠΏΠ΅ΡΠ΅Π΄Π°Π΅ΡΡΡ Π² ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²ΡΠΈΠΊ. ΠΠ»Π°Π½ΠΈΡΠΎΠ²ΡΠΈΠΊ ΡΡΡΠΎΠΈΡ ΠΏΠ»Π°Π½ Π·Π°ΠΏΡΠΎΡΠ°. ΠΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ Π΅Π³ΠΎ Π΄Π°Π»ΡΡΠ΅ Π½Π° Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅. ΠΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΠΊΠ°ΠΊΠΎΠΉ-ΡΠΎ Π±Π»ΠΎΡΠ½ΡΠΉ Π²Π²ΠΎΠ΄-Π²ΡΠ²ΠΎΠ΄ Π΄Π°Π½Π½ΡΡ ΡΠ²ΡΠ·Π°Π½Π½ΡΠΉ Ρ ΡΠ°Π±Π»ΠΈΡΠ°ΠΌΠΈ ΠΈ ΠΈΠ½Π΄Π΅ΠΊΡΠ°ΠΌΠΈ. ΠΠ΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ ΡΠΈΡΠ°ΡΡΡΡ Ρ Π΄ΠΈΡΠΊΠΎΠ² Π² ΠΏΠ°ΠΌΡΡΡ Π² ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΡ ΠΎΠ±Π»Π°ΡΡΡ "shared buffers". Π Π΅Π·ΡΠ»ΡΡΠ°ΡΡ Π·Π°ΠΏΡΠΎΡΠ°, Π΅ΡΠ»ΠΈ ΡΡΠΎ updates, deletes, ΡΠΈΠΊΡΠΈΡΡΡΡΡΡ Π² ΠΆΡΡΠ½Π°Π»Π΅ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ Π² WAL. ΠΠ΅ΠΊΠΎΡΠΎΡΠ°Ρ ΡΡΠ°ΡΠΈΡΡΠΈΡΠ΅ΡΠΊΠ°Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ Π² Π»ΠΎΠ³ ΠΈΠ»ΠΈ Π² ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΎΡ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠΈ. Π ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ Π·Π°ΠΏΡΠΎΡΠ° ΠΎΡΠ΄Π°Π΅ΡΡΡ ΡΠΆΠ΅ ΠΊΠ»ΠΈΠ΅Π½ΡΡ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ. ΠΠΎΡΠ»Π΅ ΡΠ΅Π³ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠ²ΡΠΎΡΠΈΡΡ Π²ΡΠ΅ Π·Π°Π½ΠΎΠ³ΠΎ Ρ Π½ΠΎΠ²ΡΠΌ Π·Π°ΠΏΡΠΎΡΠΎΠΌ.
Π§ΡΠΎ Ρ Π½Π°Ρ Ρ ΡΠΎΠ½ΠΎΠ²ΡΠΌΠΈ Π·Π°Π΄Π°ΡΠ°ΠΌΠΈ ΠΈ Ρ ΡΠΎΠ½ΠΎΠ²ΡΠΌΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠ°ΠΌΠΈ? Π£ Π½Π°Ρ Π΅ΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°ΡΡ ΡΠ°Π±ΠΎΡΠΎΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΡ ΠΈ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ Π² Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎΠΌ ΡΠ°Π±ΠΎΡΠ΅ΠΌ ΡΠ΅ΠΆΠΈΠΌΠ΅. ΠΡΠΈ ΠΏΡΠΎΡΠ΅ΡΡΡ ΡΠ°ΠΊΠΆΠ΅ Π±ΡΠ΄ΡΡ Π·Π°ΡΡΠ°Π³ΠΈΠ²Π°ΡΡΡΡ Π² Π΄ΠΎΠΊΠ»Π°Π΄Π΅: ΡΡΠΎ autovacuum, checkpointer, ΠΏΡΠΎΡΠ΅ΡΡΡ, ΡΠ²ΡΠ·Π°Π½Π½ΡΠ΅ Ρ ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠ΅ΠΉ, background writer. ΠΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· Π½ΠΈΡ Ρ Π±ΡΠ΄Ρ Π·Π°ΡΡΠ°Π³ΠΈΠ²Π°ΡΡ ΠΏΠΎ ΠΌΠ΅ΡΠ΅ Π΄ΠΎΠΊΠ»Π°Π΄Π°.
ΠΠ°ΠΊΠΈΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Π΅ΡΡΡ ΡΠΎ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠΎΠΉ?
- ΠΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΌΠ½ΠΎΠ³ΠΎ. PostgreSQL 9.4 ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ 109 ΠΌΠ΅ΡΡΠΈΠΊ Π΄Π»Ρ ΠΏΡΠΎΡΠΌΠΎΡΡΠ° Π΄Π°Π½Π½ΡΡ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠΈ. ΠΠ΄Π½Π°ΠΊΠΎ, Π΅ΡΠ»ΠΈ Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½ΡΡ Ρ ΡΠ°Π½ΡΡΡΡ ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ°Π±Π»ΠΈΡ, ΡΡ Π΅ΠΌ, Π±Π°Π·, ΡΠΎ Π²ΡΠ΅ ΡΡΠΈ ΠΌΠ΅ΡΡΠΈΠΊΠΈ ΠΏΡΠΈΠ΄Π΅ΡΡΡ ΡΠΌΠ½ΠΎΠΆΠΈΡΡ Π½Π° ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅Π΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠ°Π±Π»ΠΈΡ, Π±Π°Π·. Π’. Π΅. ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ Π΅ΡΠ΅ Π±ΠΎΠ»ΡΡΠ΅. Π ΡΡΠΎΠ½ΡΡΡ Π² Π½Π΅ΠΉ ΠΎΡΠ΅Π½Ρ Π»Π΅Π³ΠΊΠΎ.
- Π‘Π»Π΅Π΄ΡΡΡΠ°Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° β ΡΡΠΎ ΡΠΎ, ΡΡΠΎ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠ° ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Π° ΡΡΠ΅ΡΡΠΈΠΊΠ°ΠΌΠΈ. ΠΡΠ»ΠΈ ΠΌΡ ΠΏΠΎΡΠΌΠΎΡΡΠΈΠΌ ΡΡΡ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΡ, ΡΠΎ ΠΌΡ ΡΠ²ΠΈΠ΄ΠΈΠΌ ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎ ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°ΡΡΠΈΠ΅ΡΡ ΡΡΠ΅ΡΡΠΈΠΊΠΈ. Π Π΅ΡΠ»ΠΈ Ρ ΠΌΠΎΠΌΠ΅Π½ΡΠ° ΡΠ±ΡΠΎΡΠ° ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠΈ ΠΏΡΠΎΡΠ»ΠΎ ΠΎΡΠ΅Π½Ρ ΠΌΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ, ΠΌΡ ΡΠ²ΠΈΠ΄ΠΈΠΌ ΠΌΠΈΠ»Π»ΠΈΠ°ΡΠ΄Π½ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ. Π ΠΎΠ½ΠΈ Π½Π°ΠΌ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ Π³ΠΎΠ²ΠΎΡΡΡ.
- ΠΠ΅Ρ ΠΈΡΡΠΎΡΠΈΠΈ. ΠΡΠ»ΠΈ Ρ Π²Π°Ρ ΠΏΡΠΎΠΈΠ·ΠΎΡΠ΅Π» ΠΊΠ°ΠΊΠΎΠΉ-ΡΠΎ ΡΠ±ΠΎΠΉ, ΡΡΠΎ-ΡΠΎ ΡΠΏΠ°Π»ΠΎ 15-30 ΠΌΠΈΠ½ΡΡ Π½Π°Π·Π°Π΄, Π½Π΅ ΠΏΠΎΠ»ΡΡΠΈΡΡΡ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠΎΠΉ ΠΈ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ, ΡΡΠΎ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΠ»ΠΎ 15-30 ΠΌΠΈΠ½ΡΡ Π½Π°Π·Π°Π΄. ΠΡΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°.
- ΠΡΡΡΡΡΡΠ²ΠΈΠ΅ Π²ΡΡΡΠΎΠ΅Π½Π½ΠΎΠ³ΠΎ Π² PostgreSQL ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ° β ΡΡΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°. Π Π°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ ΡΠ΄ΡΠ° Π½Π΅ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΡΡ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ ΡΡΠΈΠ»ΠΈΡΡ. Π£ Π½ΠΈΡ Π½Π΅Ρ Π½ΠΈΡΠ΅Π³ΠΎ ΡΠ°ΠΊΠΎΠ³ΠΎ. ΠΠ½ΠΈ ΠΏΡΠΎΡΡΠΎ Π΄Π°ΡΡ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΡ Π² Π±Π°Π·Π΅. ΠΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ΡΡ, Π΄Π΅Π»Π°ΠΉΡΠ΅ ΠΊ Π½Π΅ΠΉ Π·Π°ΠΏΡΠΎΡ, ΡΡΠΎ Ρ ΠΎΡΠΈΡΠ΅, ΡΠΎ ΠΈ Π΄Π΅Π»Π°ΠΉΡΠ΅.
- Π’Π°ΠΊ ΠΊΠ°ΠΊ Π²ΡΡΡΠΎΠ΅Π½Π½ΠΎΠ³ΠΎ Π² PostgreSQL ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ° Π½Π΅Ρ, ΡΠΎ ΡΡΠΎ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΡΠΈΡΠΈΠ½ΠΎΠΉ Π΄ΡΡΠ³ΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ. ΠΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΡΡΠΎΡΠΎΠ½Π½ΠΈΡ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠ². ΠΠ°ΠΆΠ΄Π°Ρ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΡ, Ρ ΠΊΠΎΡΠΎΡΠΎΠΉ Π΅ΡΡΡ Π±ΠΎΠ»Π΅Π΅-ΠΌΠ΅Π½Π΅Π΅ ΠΏΡΡΠΌΡΠ΅ ΡΡΠΊΠΈ, ΠΏΡΡΠ°Π΅ΡΡΡ Π½Π°ΠΏΠΈΡΠ°ΡΡ ΡΠ²ΠΎΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ. Π Π² ΠΈΡΠΎΠ³Π΅ Π² community ΠΎΡΠ΅Π½Ρ ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠΌΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ ΡΠΎ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠΎΠΉ. Π Π² ΠΎΠ΄Π½ΠΈΡ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ°Ρ Π΅ΡΡΡ ΠΎΠ΄Π½ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ, Π² Π΄ΡΡΠ³ΠΈΡ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ°Ρ Π½Π΅Ρ Π΄ΡΡΠ³ΠΈΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠ΅ΠΉ, Π»ΠΈΠ±ΠΎ Π΅ΡΡΡ ΠΊΠ°ΠΊΠΈΠ΅-ΡΠΎ Π½ΠΎΠ²ΡΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ. Π Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ ΡΠΈΡΡΠ°ΡΠΈΡ, ΡΡΠΎ Π½ΡΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄Π²Π°-ΡΡΠΈ-ΡΠ΅ΡΡΡΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ°, ΠΊΠΎΡΠΎΡΡΠ΅ Π΄ΡΡΠ³ Π΄ΡΡΠ³Π° ΠΏΠ΅ΡΠ΅ΠΊΡΡΠ²Π°ΡΡ ΠΈ ΠΎΠ±Π»Π°Π΄Π°ΡΡ ΡΠ°Π·Π½ΡΠΌΠΈ ΡΡΠ½ΠΊΡΠΈΡΠΌΠΈ. ΠΡΠΎ ΠΎΡΠ΅Π½Ρ Π½Π΅ΠΏΡΠΈΡΡΠ½ΠΎ.
Π§ΡΠΎ ΠΈΠ· ΡΡΠΎΠ³ΠΎ ΡΠ»Π΅Π΄ΡΠ΅Ρ? ΠΠ°ΠΆΠ½ΠΎ ΡΠΌΠ΅ΡΡ Π±ΡΠ°ΡΡ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΡ Π½Π°ΠΏΡΡΠΌΡΡ, ΡΡΠΎΠ±Ρ Π½Π΅ Π·Π°Π²ΠΈΡΠ΅ΡΡ ΠΎΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ, Π»ΠΈΠ±ΠΎ ΠΊΠ°ΠΊ-ΡΠΎ ΡΠ°ΠΌΠΎΠΌΡ ΡΠ»ΡΡΡΠΈΡΡ ΡΡΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ: Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΠΊΠ°ΠΊΠΈΠ΅-ΡΠΎ ΡΡΠ½ΠΊΡΠΈΠΈ, ΡΡΠΎΠ±Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΡΠ²ΠΎΡ Π²ΡΠ³ΠΎΠ΄Ρ.
Π Π½ΡΠΆΠ½Ρ Π±Π°Π·ΠΎΠ²ΡΠ΅ Π·Π½Π°Π½ΠΈΡ SQL. Π§ΡΠΎΠ±Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΊΠ°ΠΊΠΈΠ΅-ΡΠΎ Π΄Π°Π½Π½ΡΠ΅ ΠΈΠ· ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠΈ, Π½ΡΠΆΠ½ΠΎ ΡΠΎΡΡΠ°Π²ΠΈΡΡ Π·Π°ΠΏΡΠΎΡΡ SQL, Ρ. Π΅. Π²Π°ΠΌ Π½ΡΠΆΠ½ΠΎ Π·Π½Π°ΡΡ, ΠΊΠ°ΠΊ ΡΠΎΡΡΠ°Π²Π»ΡΡΡΡΡ select, join.
Π‘ΡΠ°ΡΠΈΡΡΠΈΠΊΠ° ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π΅Ρ Π½Π°ΠΌ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π²Π΅ΡΠ΅ΠΉ. ΠΡ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ°Π·Π΄Π΅Π»ΠΈΡΡ Π½Π° ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΠΈ.
- ΠΠ΅ΡΠ²Π°Ρ ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΡ β ΡΡΠΎ ΡΠΎΠ±ΡΡΠΈΡ, ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΡΡΠΈΠ΅ Π² Π±Π°Π·Π΅. ΠΡΠΎ ΠΊΠΎΠ³Π΄Π° Π² Π±Π°Π·Π΅ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΠΊΠ°ΠΊΠΎΠ΅-ΡΠΎ ΡΠΎΠ±ΡΡΠΈΠ΅: Π·Π°ΠΏΡΠΎΡ, ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΠ΅ ΠΊ ΡΠ°Π±Π»ΠΈΡΠ΅, Π°Π²ΡΠΎΠ²Π°ΠΊΡΡΠΌ, ΠΊΠΎΠΌΠΌΠΈΡΡ, ΡΠΎ ΡΡΠΎ Π²ΡΠ΅ ΡΠΎΠ±ΡΡΠΈΡ. Π‘ΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠ΅ ΡΡΠΈΠΌ ΡΠΎΠ±ΡΡΠΈΡ ΡΡΠ΅ΡΡΠΈΠΊΠΈ ΠΈΠ½ΠΊΡΠ΅ΠΌΠ΅Π½ΡΠΈΡΡΡΡΡΡ. Π ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΡΡΠ»Π΅Π΄ΠΈΡΡ ΡΡΠΈ ΡΠΎΠ±ΡΡΠΈΡ.
- ΠΡΠΎΡΠ°Ρ ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΡ β ΡΡΠΎ ΡΠ²ΠΎΠΉΡΡΠ²Π° ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² ΡΠ°ΠΊΠΈΠ΅, ΠΊΠ°ΠΊ ΡΠ°Π±Π»ΠΈΡΡ, Π±Π°Π·Ρ. Π£ Π½ΠΈΡ Π΅ΡΡΡ ΡΠ²ΠΎΠΉΡΡΠ²Π°. ΠΡΠΎ ΡΠ°Π·ΠΌΠ΅Ρ ΡΠ°Π±Π»ΠΈΡ. ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΡΡΠ»Π΅Π΄ΠΈΡΡ ΡΠΎΡΡ ΡΠ°Π±Π»ΠΈΡ, ΡΠΎΡΡ ΠΈΠ½Π΄Π΅ΠΊΡΠΎΠ². ΠΠΎΠΆΠ΅ΠΌ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π² Π΄ΠΈΠ½Π°ΠΌΠΈΠΊΠ΅.
- Π ΡΡΠ΅ΡΡΡ ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΡ β ΡΡΠΎ Π²ΡΠ΅ΠΌΡ, Π·Π°ΡΡΠ°ΡΠ΅Π½Π½ΠΎΠ΅ Π½Π° ΡΠΎΠ±ΡΡΠΈΠ΅. ΠΠ°ΠΏΡΠΎΡ β ΡΡΠΎ ΡΠΎΠ±ΡΡΠΈΠ΅. Π£ Π½Π΅Π³ΠΎ Π΅ΡΡΡ ΡΠ²ΠΎΡ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½Π°Ρ ΠΌΠ΅ΡΠ° Π΄Π»ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ. ΠΠ΄Π΅ΡΡ Π·Π°ΠΏΡΡΡΠΈΠ»ΡΡ, ΡΡΡ Π·Π°ΠΊΠΎΠ½ΡΠΈΠ»ΡΡ. ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΡΠΎ ΠΎΡΡΠ»Π΅Π΄ΠΈΡΡ. ΠΠΈΠ±ΠΎ Π²ΡΠ΅ΠΌΡ ΡΡΠ΅Π½ΠΈΡ Π±Π»ΠΎΠΊΠ° Ρ Π΄ΠΈΡΠΊΠ° ΠΈΠ»ΠΈ Π·Π°ΠΏΠΈΡΠΈ. Π’Π°ΠΊΠΈΠ΅ Π²Π΅ΡΠΈ ΡΠΎΠΆΠ΅ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°ΡΡΡΡ.
ΠΡΡΠΎΡΠ½ΠΈΠΊΠΈ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠΈ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Ρ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
- Π ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ (shared buffers) Π΅ΡΡΡ ΡΠ΅Π³ΠΌΠ΅Π½Ρ Π΄Π»Ρ ΡΠ°Π·ΠΌΠ΅ΡΠ΅Π½ΠΈΡ ΡΠ°ΠΌ ΡΡΠ°ΡΠΈΡΡΠΈΡΠ΅ΡΠΊΠΈΡ Π΄Π°Π½Π½ΡΡ , ΡΠ°ΠΌ Π΅ΡΡΡ ΠΈ ΡΠ΅ ΡΠ°ΠΌΡΠ΅ ΡΡΠ΅ΡΡΠΈΠΊΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎ ΠΈΠ½ΠΊΡΠ΅ΠΌΠ΅Π½ΡΠΈΡΡΡΡΡΡ, ΠΊΠΎΠ³Π΄Π° ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΡΠ΅ ΠΈΠ»ΠΈ ΠΈΠ½ΡΠ΅ ΡΠΎΠ±ΡΡΠΈΡ, Π»ΠΈΠ±ΠΎ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡΡ ΠΊΠ°ΠΊΠΈΠ΅-ΡΠΎ ΠΌΠΎΠΌΠ΅Π½ΡΡ Π² ΡΠ°Π±ΠΎΡΠ΅ Π±Π°Π·Ρ.
- ΠΡΠ΅ ΡΡΠΈ ΡΡΠ΅ΡΡΠΈΠΊΠΈ Π½Π΅ Π΄ΠΎΡΡΡΠΏΠ½Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΈ Π΄Π°ΠΆΠ΅ Π½Π΅ Π΄ΠΎΡΡΡΠΏΠ½Ρ Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠ°ΡΠΎΡΡ. ΠΡΠΎ Π½ΠΈΠ·ΠΊΠΎΡΡΠΎΠ²Π½Π΅Π²ΡΠ΅ Π²Π΅ΡΠΈ. Π§ΡΠΎΠ±Ρ ΠΊ Π½ΠΈΠΌ ΠΎΠ±ΡΠ°ΡΠΈΡΡΡΡ PostgreSQL ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Π² Π²ΠΈΠ΄Π΅ SQL ΡΡΠ½ΠΊΡΠΈΠΉ. ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ΄Π΅Π»Π°ΡΡ select Π²ΡΠ±ΡΠΎΠΊΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΉ ΠΈ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΊΠ°ΠΊΡΡ-ΡΠΎ ΠΌΠ΅ΡΡΠΈΠΊΡ (ΠΈΠ»ΠΈ Π½Π°Π±ΠΎΡ ΠΌΠ΅ΡΡΠΈΠΊ).
- ΠΠ΄Π½Π°ΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ Π½Π΅ Π²ΡΠ΅Π³Π΄Π° ΡΠ΄ΠΎΠ±Π½ΠΎ, ΠΏΠΎΡΡΠΎΠΌΡ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠ²Π»ΡΡΡΡΡ Π±Π°Π·ΠΎΠΉ Π΄Π»Ρ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠΉ (VIEWs). ΠΡΠΎ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΠ΅ ΡΠ°Π±Π»ΠΈΡΡ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΡΡ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΡ ΠΏΠΎ ΠΊΠ°ΠΊΠΎΠΉ-ΡΠΎ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠΉ ΠΏΠΎΠ΄ΡΠΈΡΡΠ΅ΠΌΠ΅, Π»ΠΈΠ±ΠΎ ΠΏΠΎ ΠΊΠ°ΠΊΠΎΠΌΡ-ΡΠΎ Π½Π°Π±ΠΎΡΡ ΡΠΎΠ±ΡΡΠΈΠΉ Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½ΡΡ .
- ΠΡΠΈ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ (VIEWs) ΡΠ²Π»ΡΡΡΡΡ ΠΎΡΠ½ΠΎΠ²Π½ΡΠΌ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠΌ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ ΡΠΎ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠΎΠΉ. ΠΠ½ΠΈ Π΄ΠΎΡΡΡΠΏΠ½Ρ ΠΏΠΎ-ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π±Π΅Π· ΠΊΠ°ΠΊΠΎΠΉ Π»ΠΈΠ±ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ, ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΡΠ°Π·Ρ ΠΈΠΌΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ, ΡΠΌΠΎΡΡΠ΅ΡΡ, Π±ΡΠ°ΡΡ ΠΎΡΡΡΠ΄Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ. Π Π΅ΡΠ΅ Π΅ΡΡΡ contrib’Ρ. Contrib’Ρ Π΅ΡΡΡ ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΡΠ΅. ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΠΏΠ°ΠΊΠ΅Ρ postgresql-contrib (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, postgresql94-contrib), ΠΏΠΎΠ΄Π³ΡΡΠ·ΠΈΠ»ΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠΉ ΠΌΠΎΠ΄ΡΠ»Ρ Π² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ, ΡΠΊΠ°Π·Π°ΡΡ Π΄Π»Ρ Π½Π΅Π³ΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ, ΠΏΠ΅ΡΠ΅Π·Π°ΠΏΡΡΡΠΈΡΡ PostgreSQL ΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ. (ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅. Π Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ Π΄ΠΈΡΡΡΠΈΠ±ΡΡΠΈΠ²Π°, Π² ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΡ Π²Π΅ΡΡΠΈΡΡ contrib ΠΏΠ°ΠΊΠ΅Ρ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ°ΡΡΡΡ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠ³ΠΎ ΠΏΠ°ΠΊΠ΅ΡΠ°).
- Π Π΅ΡΡΡ Π½Π΅ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΡΠ΅ contrib. ΠΠ½ΠΈ Π½Π΅ ΠΏΠΎΡΡΠ°Π²Π»ΡΡΡΡΡ Π² ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠΉ ΠΏΠΎΡΡΠ°Π²ΠΊΠ΅ PostgreSQL. ΠΡ Π½ΡΠΆΠ½ΠΎ Π»ΠΈΠ±ΠΎ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°ΡΡ, Π»ΠΈΠ±ΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΠΊΠ°ΠΊ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ. ΠΠ°ΡΠΈΠ°Π½ΡΡ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΡΠ°ΠΌΡΠ΅ ΡΠ°Π·Π½ΡΠ΅, Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΡΠΎΠ³ΠΎ, ΡΡΠΎ ΠΏΡΠΈΠ΄ΡΠΌΠ°Π» ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΡΡΠΎΠ³ΠΎ Π½Π΅ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΠΎΠ³ΠΎ contribβΠ°.
ΠΠ° ΡΡΠΎΠΌ ΡΠ»Π°ΠΉΠ΄Π΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Ρ Π²ΡΠ΅ ΡΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ (VIEWs) ΠΈ ΡΠ°ΡΡΡ ΡΠ΅Ρ ΡΡΠ½ΠΊΡΠΈΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ Π΄ΠΎΡΡΡΠΏΠ½Ρ Π² PostgreSQL 9.4. ΠΠ°ΠΊ ΠΌΡ Π²ΠΈΠ΄ΠΈΠΌ, ΠΈΡ ΠΎΡΠ΅Π½Ρ ΠΌΠ½ΠΎΠ³ΠΎ. Π Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ Π·Π°ΠΏΡΡΠ°ΡΡΡΡ, Π΅ΡΠ»ΠΈ Π²Ρ ΡΡΠΎΠ»ΠΊΠ½ΡΠ»ΠΈΡΡ Ρ ΡΡΠΈΠΌ Π² ΠΏΠ΅ΡΠ²ΡΠΉ ΡΠ°Π·.
ΠΠ΄Π½Π°ΠΊΠΎ, Π΅ΡΠ»ΠΈ ΠΌΡ Π²ΠΎΠ·ΡΠΌΠ΅ΠΌ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΡΡ ΠΊΠ°ΡΡΠΈΠ½ΠΊΡ ΠΠ°ΠΊ ΡΡΠ°ΡΠΈΡΡΡ Π²ΡΠ΅ΠΌΡ Π½Π° PostgreSQL
ΠΈ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌ Ρ ΡΡΠΈΠΌ ΡΠΏΠΈΡΠΊΠΎΠΌ, ΡΠΎ ΠΏΠΎΠ»ΡΡΠΈΠΌ Π²ΠΎΡ ΡΠ°ΠΊΡΡ ΠΊΠ°ΡΡΠΈΠ½ΠΊΡ. ΠΠ°ΠΆΠ΄ΠΎΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ (VIEWs), Π»ΠΈΠ±ΠΎ ΠΊΠ°ΠΆΠ΄ΡΡ ΡΡΠ½ΠΊΡΠΈΡ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π² ΡΠ΅Ρ
ΠΈΠ»ΠΈ ΠΈΠ½ΡΡ
ΡΠ΅Π»ΡΡ
Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅ΠΉ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠΈ, ΠΊΠΎΠ³Π΄Π° Ρ Π½Π°Ρ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ PostgreSQL. Π ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΡΠΆΠ΅ ΠΊΠ°ΠΊΡΡ-ΡΠΎ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΡΠ°Π±ΠΎΡΠ΅ ΠΏΠΎΠ΄ΡΠΈΡΡΠ΅ΠΌΡ.
ΠΠ΅ΡΠ²ΠΎΠ΅, ΡΡΠΎ ΠΌΡ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ, ΡΡΠΎ pg_stat_database
. ΠΠ°ΠΊ ΠΌΡ Π²ΠΈΠ΄ΠΈΠΌ, ΡΡΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅. Π Π½Π΅ΠΉ ΠΎΡΠ΅Π½Ρ ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ. Π‘Π°ΠΌΠ°Ρ ΡΠ°Π·Π½ΠΎΠΎΠ±ΡΠ°Π·Π½Π°Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ. Π ΠΎΠ½Π° Π΄Π°Π΅Ρ ΠΎΡΠ΅Π½Ρ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠ΅ Π·Π½Π°Π½ΠΈΠ΅, ΡΡΠΎ Ρ Π½Π°Ρ ΠΏΡΠΎΠΈΡΡ
ΠΎΠ΄ΠΈΡ Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½ΡΡ
.
Π§ΡΠΎ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠ΅ ΠΎΡΡΡΠ΄Π° Π²Π·ΡΡΡ? ΠΠ°ΡΠ½Π΅ΠΌ c ΡΠ°ΠΌΡΡ ΠΏΡΠΎΡΡΡΡ Π²Π΅ΡΠ΅ΠΉ.
select
sum(blks_hit)*100/sum(blks_hit+blks_read) as hit_ratio
from pg_stat_database;
ΠΠ΅ΡΠ²ΠΎΠ΅, ΡΡΠΎ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ β ΡΡΠΎ ΠΏΡΠΎΡΠ΅Π½Ρ ΠΏΠΎΠΏΠ°Π΄Π°Π½ΠΈΡ Π² ΠΊΡΡ. ΠΡΠΎΡΠ΅Π½Ρ ΠΏΠΎΠΏΠ°Π΄Π°Π½ΠΈΡ Π² ΠΊΡΡ β ΡΡΠΎ ΠΏΠΎΠ»Π΅Π·Π½Π°Ρ ΠΌΠ΅ΡΡΠΈΠΊΠ°. ΠΠ½Π° ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΎΡΠ΅Π½ΠΈΡΡ, ΠΊΠ°ΠΊΠΎΠΉ ΠΎΠ±ΡΠ΅ΠΌ Π΄Π°Π½Π½ΡΡ Π±Π΅ΡΠ΅ΡΡΡ ΠΈΠ· ΠΊΡΡΠ° shared buffers, Π° ΠΊΠ°ΠΊΠΎΠΉ ΠΎΠ±ΡΠ΅ΠΌ ΡΠΈΡΠ°Π΅ΡΡΡ Ρ Π΄ΠΈΡΠΊΠ°.
ΠΠΎΠ½ΡΡΠ½ΠΎΠ΅ Π΄Π΅Π»ΠΎ, ΡΡΠΎ ΡΠ΅ΠΌ Π±ΠΎΠ»ΡΡΠ΅Π΅ Ρ Π½Π°Ρ ΠΏΠΎΠΏΠ°Π΄Π°Π½ΠΈΠ΅ Π² ΠΊΡΡ, ΡΠΎ ΡΠ΅ΠΌ Π»ΡΡΡΠ΅. ΠΡ ΠΎΡΠ΅Π½ΠΈΠ²Π°Π΅ΠΌ ΡΡΡ ΠΌΠ΅ΡΡΠΈΠΊΡ ΠΊΠ°ΠΊ ΠΏΡΠΎΡΠ΅Π½Ρ. Π, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π΅ΡΠ»ΠΈ Ρ Π½Π°Ρ ΠΏΡΠΎΡΠ΅Π½ΡΠ½ΠΎΠ΅ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠ΅ ΡΡΠΈΡ ΠΏΠΎΠΏΠ°Π΄Π°Π½ΠΈΠΉ Π² ΠΊΡΡ Π±ΠΎΠ»ΡΡΠ΅ 90 %, ΡΠΎ ΡΡΠΎ Ρ ΠΎΡΠΎΡΠΎ. ΠΡΠ»ΠΈ ΠΎΠ½ΠΎ ΠΎΠΏΡΡΠΊΠ°Π΅ΡΡΡ Π½ΠΈΠΆΠ΅ 90 %, Π·Π½Π°ΡΠΈΡ, Ρ Π½Π°Ρ ΠΏΠ°ΠΌΡΡΠΈ Π½Π΅Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π΄Π»Ρ ΡΠ΄Π΅ΡΠΆΠ°Π½ΠΈΡ Π³ΠΎΡΡΡΠ΅ΠΉ "Π³ΠΎΠ»ΠΎΠ²Ρ" Π΄Π°Π½Π½ΡΡ Π² ΠΏΠ°ΠΌΡΡΠΈ. Π ΡΡΠΎΠ±Ρ ΡΡΠΈ Π΄Π°Π½Π½ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ, PostgreSQL Π²ΡΠ½ΡΠΆΠ΄Π΅Π½ ΠΎΠ±ΡΠ°ΡΠ°ΡΡΡΡ ΠΊ Π΄ΠΈΡΠΊΡ ΠΈ ΡΡΠΎ ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅ ΡΠ΅ΠΌ Π΅ΡΠ»ΠΈ Π±Ρ Π΄Π°Π½Π½ΡΠ΅ ΡΠΈΡΠ°Π»ΠΈΡΡ ΠΈΠ· ΠΏΠ°ΠΌΡΡΠΈ. Π Π½ΡΠΆΠ½ΠΎ ΡΠΆΠ΅ Π΄ΡΠΌΠ°ΡΡ Π½Π°Π΄ ΡΠ²Π΅Π»ΠΈΡΠ΅Π½ΠΈΠ΅ΠΌ ΠΏΠ°ΠΌΡΡΠΈ: Π»ΠΈΠ±ΠΎ shared buffers ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°ΡΡ, Π»ΠΈΠ±ΠΎ Π½Π°ΡΠ°ΡΠΈΠ²Π°ΡΡ ΠΆΠ΅Π»Π΅Π·Π½ΡΡ ΠΏΠ°ΠΌΡΡΡ (RAM).
select
datname,
(xact_commit*100)/(xact_commit+xact_rollback) as c_ratio,
deadlocks, conflicts,
temp_file, pg_size_pretty(temp_bytes) as temp_size
from pg_stat_database;
Π§ΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π΅ΡΠ΅ Π²Π·ΡΡΡ ΠΈΠ· ΡΡΠΎΠ³ΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ? ΠΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ Π°Π½ΠΎΠΌΠ°Π»ΠΈΠΈ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΡΡΠΈΠ΅ Π² Π±Π°Π·Π΅. Π§ΡΠΎ Π·Π΄Π΅ΡΡ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ? ΠΠ΄Π΅ΡΡ Π΅ΡΡΡ commits, rollbacks, ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΡΠ°ΠΉΠ»ΠΎΠ², ΠΈΡ ΠΎΠ±ΡΠ΅ΠΌ, deadlocks ΠΈ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΡ.
ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΡΡΠΈΠΌ Π·Π°ΠΏΡΠΎΡΠΎΠΌ. ΠΡΠΎΡ SQL Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΠΏΡΠΎΡΡΠΎΠΉ. Π ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ Π²ΠΎΡ ΡΡΠΈ Π΄Π°Π½Π½ΡΠ΅ Ρ ΡΠ΅Π±Ρ.
Π Π·Π΄Π΅ΡΡ ΡΡΠ°Π·Ρ ΠΏΠΎΡΠΎΠ³ΠΎΠ²ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ. ΠΡ ΡΠΌΠΎΡΡΠΈΠΌ ΡΠΎΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠ΅ commits ΠΈ rollbacks. Commits β ΡΡΠΎ ΡΡΠΏΠ΅ΡΠ½ΠΎΠ΅ ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠΆΠ΄Π΅Π½ΠΈΠ΅ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ. Rollbacks β ΡΡΠΎ ΠΎΡΠΊΠ°Ρ, Ρ. Π΅. ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ Π΄Π΅Π»Π°Π»Π° ΠΊΠ°ΠΊΡΡ-ΡΠΎ ΡΠ°Π±ΠΎΡΡ, Π½Π°ΠΏΡΡΠ³Π°Π»Π° Π±Π°Π·Ρ, ΡΡΠΎ-ΡΠΎ ΡΡΠΈΡΠ°Π»Π°, Π° ΠΏΠΎΡΠΎΠΌ ΠΏΡΠΎΠΈΠ·ΠΎΡΠ΅Π» ΡΠ±ΠΎΠΉ, ΠΈ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ ΠΎΡΠ±ΡΠ°ΡΡΠ²Π°ΡΡΡΡ. Π’. Π΅. ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ rollbacks, ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎ ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°ΡΡΠΈΡ ΡΡ, ΡΡΠΎ ΠΏΠ»ΠΎΡ ΠΎ. Π ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΊΠ°ΠΊ-ΡΠΎ ΠΈΠ·Π±Π΅Π³Π°ΡΡ ΠΈΡ , ΠΈ ΠΏΡΠ°Π²ΠΈΡΡ ΠΊΠΎΠ΄, ΡΡΠΎΠ±Ρ ΡΠ°ΠΊΠΎΠ³ΠΎ Π½Π΅ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΠ»ΠΎ.
ΠΠΎΠ½ΡΠ»ΠΈΠΊΡΡ (conflicts) ΡΠ²ΡΠ·Π°Π½Ρ Ρ ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠ΅ΠΉ. Π ΠΈΡ ΡΠΎΠΆΠ΅ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΈΠ·Π±Π΅Π³Π°ΡΡ. ΠΡΠ»ΠΈ Ρ Π²Π°Ρ ΠΊΠ°ΠΊΠΈΠ΅-ΡΠΎ Π·Π°ΠΏΡΠΎΡΡ, ΠΊΠΎΡΠΎΡΡΠ΅ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ Π½Π° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ΅ ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡΡ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΡ, ΡΠΎ Π½ΡΠΆΠ½ΠΎ ΡΡΠΈ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΡ ΡΠ°Π·Π±ΠΈΡΠ°ΡΡ, ΡΠΌΠΎΡΡΠ΅ΡΡ, ΡΡΠΎ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ. ΠΠ΅ΡΠ°Π»ΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡΠΈ Π² Π»ΠΎΠ³Π°Ρ . Π ΡΡΡΡΠ°Π½ΡΡΡ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΠ½ΡΠ΅ ΡΠΈΡΡΠ°ΡΠΈΠΈ, ΡΡΠΎΠ±Ρ Π·Π°ΠΏΡΠΎΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΡΠ°Π±ΠΎΡΠ°Π»ΠΈ Π±Π΅Π· ΠΎΡΠΈΠ±ΠΎΠΊ.
Deadlocks β ΡΡΠΎ ΡΠΎΠΆΠ΅ ΠΏΠ»ΠΎΡ Π°Ρ ΡΠΈΡΡΠ°ΡΠΈΡ. ΠΠΎΠ³Π΄Π° Π·Π°ΠΏΡΠΎΡΡ Π±ΠΎΡΡΡΡΡ Π·Π° ΡΠ΅ΡΡΡΡΡ, ΠΎΠ΄ΠΈΠ½ Π·Π°ΠΏΡΠΎΡ ΠΎΠ±ΡΠ°ΡΠΈΠ»ΡΡ ΠΊ ΠΎΠ΄Π½ΠΎΠΌΡ ΡΠ΅ΡΡΡΡΡ ΠΈ Π²Π·ΡΠ» Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ, Π²ΡΠΎΡΠΎΠΉ Π·Π°ΠΏΡΠΎΡ ΠΎΠ±ΡΠ°ΡΠΈΠ»ΡΡ ΠΊΠΎ Π²ΡΠΎΡΠΎΠΌΡ ΡΠ΅ΡΡΡΡΡ ΠΈ ΡΠ°ΠΊΠΆΠ΅ Π²Π·ΡΠ» Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ, Π° ΠΏΠΎΡΠΎΠΌ ΠΎΠ±Π° Π·Π°ΠΏΡΠΎΡΠ° ΠΎΠ±ΡΠ°ΡΠΈΠ»ΠΈΡΡ ΠΊ ΡΠ΅ΡΡΡΡΠ°ΠΌ Π΄ΡΡΠ³ Π΄ΡΡΠ³Π° ΠΈ Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π»ΠΈΡΡ Π² ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΈ ΠΊΠΎΠ³Π΄Π° ΡΠΎΡΠ΅Π΄ ΠΎΡΠΏΡΡΡΠΈΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ. ΠΡΠΎ ΡΠΎΠΆΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ½Π°Ρ ΡΠΈΡΡΠ°ΡΠΈΡ. ΠΡ Π½ΡΠΆΠ½ΠΎ ΡΠ΅ΡΠ°ΡΡ Π½Π° ΡΡΠΎΠ²Π½Π΅ ΠΏΠ΅ΡΠ΅ΠΏΠΈΡΡΠ²Π°Π½ΠΈΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΈ ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ ΡΠ΅ΡΡΡΡΠ°ΠΌ. Π Π΅ΡΠ»ΠΈ Π²Ρ Π²ΠΈΠ΄ΠΈΡΠ΅, ΡΡΠΎ Ρ Π²Π°Ρ deadlocks ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°ΡΡΡΡ ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎ, Π½ΡΠΆΠ½ΠΎ ΡΠΌΠΎΡΡΠ΅ΡΡ Π΄Π΅ΡΠ°Π»ΠΈ Π² Π»ΠΎΠ³Π°Ρ , ΡΠ°Π·Π±ΠΈΡΠ°ΡΡ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡΠΈΠ΅ ΡΠΈΡΡΠ°ΡΠΈΠΈ ΠΈ ΡΠΌΠΎΡΡΠ΅ΡΡ Π² ΡΠ΅ΠΌ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°.
ΠΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΡΠ°ΠΉΠ»Ρ (temp_files) β ΡΡΠΎ ΡΠΎΠΆΠ΅ ΠΏΠ»ΠΎΡ ΠΎ. ΠΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠΌΡ Π·Π°ΠΏΡΠΎΡΡ Π½Π΅ Ρ Π²Π°ΡΠ°Π΅Ρ ΠΏΠ°ΠΌΡΡΠΈ Π΄Π»Ρ ΡΠ°Π·ΠΌΠ΅ΡΠ΅Π½ΠΈΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠ²Π½ΡΡ , Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ Π΄Π°Π½Π½ΡΡ , ΠΎΠ½ ΡΠΎΠ·Π΄Π°Π΅Ρ Π½Π° Π΄ΠΈΡΠΊΠ΅ ΡΠ°ΠΉΠ». Π Π²ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΊΠΎΡΠΎΡΡΠ΅ Π±Ρ ΠΎΠ½ ΠΌΠΎΠ³ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ Π²ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΌ Π±ΡΡΠ΅ΡΠ΅ Π² ΠΏΠ°ΠΌΡΡΠΈ, Π½Π°ΡΠΈΠ½Π°Π΅Ρ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ ΡΠΆΠ΅ Π½Π° Π΄ΠΈΡΠΊΠ΅. ΠΡΠΎ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ. ΠΡΠΎ ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°Π΅Ρ Π²ΡΠ΅ΠΌΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π·Π°ΠΏΡΠΎΡΠ°. Π ΠΊΠ»ΠΈΠ΅Π½Ρ, ΠΎΡΠΏΡΠ°Π²ΠΈΠ²ΡΠΈΠΉ Π·Π°ΠΏΡΠΎΡ ΠΊ PostgreSQL ΠΏΠΎΠ»ΡΡΠΈΡ ΠΎΡΠ²Π΅Ρ ΡΡΡΡ ΠΏΠΎΠ·ΠΆΠ΅. ΠΡΠ»ΠΈ ΡΡΠΈ Π²ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π±ΡΠ΄ΡΡ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ Π² ΠΏΠ°ΠΌΡΡΠΈ, Postgres ΠΎΡΠ²Π΅ΡΠΈΡ Π³ΠΎΡΠ°Π·Π΄ΠΎ Π±ΡΡΡΡΠ΅Π΅ ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ Π±ΡΠ΄Π΅Ρ ΠΌΠ΅Π½ΡΡΠ΅ ΠΆΠ΄Π°ΡΡ.
Pg_stat_bgwriter β ΡΡΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΎΠΏΠΈΡΡΠ²Π°Π΅Ρ ΡΠ°Π±ΠΎΡΡ Π΄Π²ΡΡ
ΡΠΎΠ½ΠΎΠ²ΡΡ
ΠΏΠΎΠ΄ΡΠΈΡΡΠ΅ΠΌ PostgreSQL: ΡΡΠΎ checkpointer
ΠΈ background writer
.
ΠΠ»Ρ Π½Π°ΡΠ°Π»Π° ΡΠ°Π·Π±Π΅ΡΠ΅ΠΌ ΠΊΠΎΠ½ΡΡΠΎΠ»ΡΠ½ΡΠ΅ ΡΠΎΡΠΊΠΈ, Ρ.Π½. checkpoints
. Π§ΡΠΎ ΡΠ°ΠΊΠΎΠ΅ ΠΊΠΎΠ½ΡΡΠΎΠ»ΡΠ½ΡΠ΅ ΡΠΎΡΠΊΠΈ? ΠΠΎΠ½ΡΡΠΎΠ»ΡΠ½Π°Ρ ΡΠΎΡΠΊΠ° ΡΡΠΎ ΠΏΠΎΠ·ΠΈΡΠΈΡ Π² ΠΆΡΡΠ½Π°Π»Π΅ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ ΡΠΎΠΎΠ±ΡΠ°ΡΡΠ°Ρ ΡΡΠΎ Π²ΡΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π΄Π°Π½Π½ΡΡ
Π·Π°ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ Π² ΠΆΡΡΠ½Π°Π»Π° ΡΡΠΏΠ΅ΡΠ½ΠΎ ΡΠΈΠ½Ρ
ΡΠΎΠ½ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½Ρ Ρ Π΄Π°Π½Π½ΡΠΌΠΈ Π½Π° Π΄ΠΈΡΠΊΠ΅. ΠΡΠΎΡΠ΅ΡΡ Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΡΠ°Π±ΠΎΡΠ΅ΠΉ Π½Π°Π³ΡΡΠ·ΠΊΠΈ ΠΈ Π½Π°ΡΡΡΠΎΠ΅ΠΊ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π΄Π»ΠΈΡΠ΅Π»ΡΠ½ΡΠΌΠΈ ΠΈ ΠΏΠΎ Π±ΠΎΠ»ΡΡΠ΅ΠΉ ΡΠ°ΡΡΠΈ Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΡΠΈΠ½Ρ
ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ Π³ΡΡΠ·Π½ΡΡ
ΡΡΡΠ°Π½ΠΈΡ Π² shared buffers Ρ Π΄Π°ΡΡΠ°ΠΉΠ»Π°ΠΌΠΈ Π½Π° Π΄ΠΈΡΠΊΠ΅. ΠΠ»Ρ ΡΠ΅Π³ΠΎ ΡΡΠΎ Π½ΡΠΆΠ½ΠΎ? ΠΡΠ»ΠΈ Π±Ρ PostgreSQL Π²ΡΠ΅ Π²ΡΠ΅ΠΌΡ ΠΎΠ±ΡΠ°ΡΠ°Π»ΡΡ ΠΊ Π΄ΠΈΡΠΊΡ ΠΈ Π±ΡΠ°Π» ΠΎΡΡΡΠ΄Π° Π΄Π°Π½Π½ΡΠ΅, ΠΈ Π·Π°ΠΏΠΈΡΡΠ²Π°Π» Π΄Π°Π½Π½ΡΠ΅ ΠΏΡΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΠΈ, ΡΡΠΎ Π±ΡΠ»ΠΎ Π±Ρ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ. ΠΠΎΡΡΠΎΠΌΡ Ρ PostgreSQL Π΅ΡΡΡ ΡΠ΅Π³ΠΌΠ΅Π½Ρ ΠΏΠ°ΠΌΡΡΠΈ, ΡΠ°Π·ΠΌΠ΅Ρ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² Π² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ. Postgres ΡΠ°Π·ΠΌΠ΅ΡΠ°Π΅Ρ Π² ΡΡΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠ²Π½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ Π΄Π»Ρ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΈΠ»ΠΈ Π²ΡΠ΄Π°ΡΠΈ ΠΏΠΎ Π·Π°ΠΏΡΠΎΡΠ°ΠΌ. Π ΡΠ»ΡΡΠ°Π΅ Π·Π°ΠΏΡΠΎΡΠΎΠ² Π½Π° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½ΡΡ
ΠΏΡΠΎΠΈΡΡ
ΠΎΠ΄ΠΈΡ ΠΈΡ
ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅. Π ΠΌΡ ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ Π΄Π²Π΅ Π²Π΅ΡΡΠΈΠΈ Π΄Π°Π½Π½ΡΡ
. ΠΠ΄Π½Π° Ρ Π½Π°Ρ Π² ΠΏΠ°ΠΌΡΡΠΈ, Π΄ΡΡΠ³Π°Ρ Π½Π° Π΄ΠΈΡΠΊΠ΅. Π ΠΏΠ΅ΡΠΈΠΎΠ΄ΠΈΡΠ΅ΡΠΊΠΈ Π½ΡΠΆΠ½ΠΎ ΡΡΠΈ Π΄Π°Π½Π½ΡΠ΅ ΡΠΈΠ½Ρ
ΡΠΎΠ½ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ. ΠΠ°ΠΌ Π½ΡΠΆΠ½ΠΎ ΡΠΎ, ΡΡΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΎ Π² ΠΏΠ°ΠΌΡΡΠΈ, ΡΠΈΠ½Ρ
ΡΠΎΠ½ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ Π½Π° Π΄ΠΈΡΠΊ. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ Π½ΡΠΆΠ½Ρ checkpoint.
Checkpoint ΠΏΡΠΎΡ ΠΎΠ΄ΠΈΡ ΠΏΠΎ shared buffers, ΠΏΠΎΠΌΠ΅ΡΠ°Π΅Ρ Π³ΡΡΠ·Π½ΡΠ΅ ΡΡΡΠ°Π½ΠΈΡΡ, ΡΡΠΎ ΠΎΠ½ΠΈ Π½ΡΠΆΠ½Ρ Π΄Π»Ρ checkpoint. ΠΠΎΡΠΎΠΌ Π·Π°ΠΏΡΡΠΊΠ°Π΅Ρ Π²ΡΠΎΡΠΎΠΉ ΠΏΡΠΎΡ ΠΎΠ΄ ΠΏΠΎ shared buffers. Π ΡΡΡΠ°Π½ΠΈΡΡ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠΎΠΌΠ΅ΡΠ΅Π½Ρ Π΄Π»Ρ checkpoint, ΠΎΠ½ ΠΈΡ ΡΠΆΠ΅ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·ΠΈΡΡΠ΅Ρ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΡ Π΄Π°Π½Π½ΡΡ ΡΠΆΠ΅ Ρ Π΄ΠΈΡΠΊΠΎΠΌ.
ΠΡΡΡ Π΄Π²Π° ΡΠΈΠΏΠ° ΠΊΠΎΠ½ΡΡΠΎΠ»ΡΠ½ΡΡ
ΡΠΎΡΠ΅ΠΊ. ΠΠ΄ΠΈΠ½ checkpoint Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΠΏΠΎ ΡΠ°ΠΉΠΌ-Π°ΡΡΡ. ΠΡΠΎ checkpoint ΠΏΠΎΠ»Π΅Π·Π½ΡΠΉ ΠΈ Ρ
ΠΎΡΠΎΡΠΈΠΉ β checkpoint_timed
. Π Π΅ΡΡΡ checkpoints ΠΏΠΎ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΡ β checkpoint required
. Π’Π°ΠΊΠ°Ρ ΠΊΠΎΠ½ΡΡΠΎΠ»ΡΠ½Π°Ρ ΡΠΎΡΠΊΠ° ΠΏΡΠΎΠΈΡΡ
ΠΎΠ΄ΠΈΡ ΠΊΠΎΠ³Π΄Π° Ρ Π½Π°Ρ ΠΈΠ΄Π΅Ρ ΠΎΡΠ΅Π½Ρ Π±ΠΎΠ»ΡΡΠ°Ρ Π·Π°ΠΏΠΈΡΡ Π΄Π°Π½Π½ΡΡ
. ΠΡ Π·Π°ΠΏΠΈΡΠ°Π»ΠΈ ΠΎΡΠ΅Π½Ρ ΠΌΠ½ΠΎΠ³ΠΎ ΠΆΡΡΠ½Π°Π»ΠΎΠ² ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ. Π PostgreSQL ΡΡΠΈΡΠ°Π΅Ρ, ΡΡΠΎ Π΅ΠΌΡ Π½ΡΠΆΠ½ΠΎ Π²ΡΠ΅ ΡΡΠΎ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΡΡΡΠ΅Π΅ ΡΠΈΠ½Ρ
ΡΠΎΠ½ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ, ΡΠ΄Π΅Π»Π°ΡΡ ΠΊΠΎΠ½ΡΡΠΎΠ»ΡΠ½ΡΡ ΡΠΎΡΠΊΡ ΠΈ ΠΆΠΈΡΡ Π΄Π°Π»ΡΡΠ΅.
Π Π΅ΡΠ»ΠΈ Π²Ρ ΠΏΠΎΡΠΌΠΎΡΡΠ΅Π»ΠΈ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΡ pg_stat_bgwriter
ΠΈ ΡΠ²ΠΈΠ΄Π΅Π»ΠΈ, ΡΡΠΎ Ρ Π²Π°Ρ checkpoint_req Π³ΠΎΡΠ°Π·Π΄ΠΎ Π±ΠΎΠ»ΡΡΠ΅, ΡΠ΅ΠΌ checkpoint_timed, ΡΠΎ ΡΡΠΎ ΠΏΠ»ΠΎΡ
ΠΎ. ΠΠΎΡΠ΅ΠΌΡ ΠΏΠ»ΠΎΡ
ΠΎ? ΠΡΠΎ Π·Π½Π°ΡΠΈΡ, ΡΡΠΎ PostgreSQL Π½Π°Ρ
ΠΎΠ΄ΠΈΡΡΡ Π² ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎΠΉ ΡΡΡΠ΅ΡΡΠΎΠ²ΠΎΠΉ ΡΠΈΡΡΠ°ΡΠΈΠΈ, ΠΊΠΎΠ³Π΄Π° Π΅ΠΌΡ Π½ΡΠΆΠ½ΠΎ Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΡ Π΄Π°Π½Π½ΡΠ΅ Π½Π° Π΄ΠΈΡΠΊ. Checkpoint ΠΏΠΎ ΡΠ°ΠΉΠΌΠ°ΡΡΡ ΠΌΠ΅Π½Π΅Π΅ ΡΡΡΠ΅ΡΡΠΎΠ²ΡΠΉ ΠΈ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΡΠΎΠ³Π»Π°ΡΠ½ΠΎ Π²Π½ΡΡΡΠ΅Π½Π½Π΅ΠΌΡ ΡΠ°ΡΠΏΠΈΡΠ°Π½ΠΈΡ ΠΈ ΠΊΠ°ΠΊ Π±Ρ ΡΠ°ΡΡΡΠ½ΡΡ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ. Π£ PostgreSQL Π΅ΡΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΠ΄Π΅Π»Π°ΡΡ ΠΏΠ°ΡΠ·Ρ Π² ΡΠ°Π±ΠΎΡΠ΅ ΠΈ Π½Π΅ Π½Π°ΠΏΡΡΠ³Π°ΡΡ Π΄ΠΈΡΠΊΠΎΠ²ΡΡ ΠΏΠΎΠ΄ΡΠΈΡΡΠ΅ΠΌΡ. ΠΡΠΎ Π΄Π»Ρ PostgreSQL ΠΏΠΎΠ»Π΅Π·Π½ΠΎ. Π Π·Π°ΠΏΡΠΎΡΡ, ΠΊΠΎΡΠΎΡΡΠ΅ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ Π²ΠΎ Π²ΡΠ΅ΠΌΡ checkpoint Π½Π΅ Π±ΡΠ΄ΡΡ ΠΈΡΠΏΡΡΡΠ²Π°ΡΡ ΡΡΡΠ΅ΡΡΡ ΠΎΡ ΡΠΎΠ³ΠΎ, ΡΡΠΎ Π΄ΠΈΡΠΊΠΎΠ²Π°Ρ ΠΏΠΎΠ΄ΡΠΈΡΡΠ΅ΠΌΠ° Π·Π°Π½ΡΡΠ°.
Π Π΄Π»Ρ ΡΠ΅Π³ΡΠ»ΠΈΡΠΎΠ²ΠΊΠΈ checkpoint Π΅ΡΡΡ ΡΡΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°:
-
Ρheckpoint_segments
. -
Ρheckpoint_timeout
. -
Ρheckpoint_competion_target
.
ΠΠ½ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ ΡΠ΅Π³ΡΠ»ΠΈΡΠΎΠ²Π°ΡΡ ΡΠ°Π±ΠΎΡΡ ΠΊΠΎΠ½ΡΡΠΎΠ»ΡΠ½ΡΡ ΡΠΎΡΠ΅ΠΊ. ΠΠΎ Π½Π΅ Π±ΡΠ΄Ρ Π½Π° Π½ΠΈΡ Π·Π°Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΡΡ. ΠΡ Π²Π»ΠΈΡΠ½ΠΈΠ΅ β ΡΡΠΎ ΡΠΆΠ΅ ΠΎΡΠ΄Π΅Π»ΡΠ½Π°Ρ ΡΠ΅ΠΌΠ°.
ΠΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅: Π Π°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅ΠΌΠ°Ρ Π² Π΄ΠΎΠΊΠ»Π°Π΄Π΅ Π²Π΅ΡΡΠΈΡ 9.4 ΡΠΆΠ΅ Π½Π΅Π°ΠΊΡΡΠ°Π»ΡΠ½Π°. Π ΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ
Π²Π΅ΡΡΠΈΡΡ
PostgreSQL ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ checkpoint_segments
Π·Π°ΠΌΠ΅Π½Π΅Π½ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°ΠΌΠΈ min_wal_size
ΠΈ max_wal_size
.
Π‘Π»Π΅Π΄ΡΡΡΠ°Ρ ΠΏΠΎΠ΄ΡΠΈΡΡΠ΅ΠΌΠ° ΡΡΠΎ ΡΠΎΠ½ΠΎΠ²ΡΠΉ ΠΏΠΈΡΠ°ΡΠ΅Π»Ρ β background writer
. Π§ΡΠΎ ΠΎΠ½ Π΄Π΅Π»Π°Π΅Ρ? ΠΠ½ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎ Π² Π±Π΅ΡΠΊΠΎΠ½Π΅ΡΠ½ΠΎΠΌ ΡΠΈΠΊΠ»Π΅. Π‘ΠΊΠ°Π½ΠΈΡΡΠ΅Ρ ΡΡΡΠ°Π½ΠΈΡΡ Π² shared buffers ΠΈ ΡΡΡΠ°Π½ΠΈΡΠΊΠΈ Π³ΡΡΠ·Π½ΡΠ΅, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΠ½ Π½Π°ΡΠ΅Π», ΡΠ±ΡΠ°ΡΡΠ²Π°Π΅Ρ Π½Π° Π΄ΠΈΡΠΊ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΎΠ½ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ checkpointer’Ρ Π΄Π΅Π»Π°ΡΡ ΠΌΠ΅Π½ΡΡΠ΅ ΡΠ°Π±ΠΎΡΡ Π² ΠΏΡΠΎΡΠ΅ΡΡΠ΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΊΠΎΠ½ΡΡΠΎΠ»ΡΠ½ΡΡ
ΡΠΎΡΠ΅ΠΊ.
ΠΠ»Ρ ΡΠ΅Π³ΠΎ ΠΎΠ½ Π΅ΡΠ΅ Π½ΡΠΆΠ΅Π½? ΠΠ½ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ ΠΏΠΎΡΡΠ΅Π±Π½ΠΎΡΡΡ Π² ΡΠΈΡΡΡΡ
ΡΡΡΠ°Π½ΠΈΡΠ°Ρ
Π² shared buffers Π΅ΡΠ»ΠΈ ΠΎΠ½ΠΈ Π²Π΄ΡΡΠ³ ΠΏΠΎΡΡΠ΅Π±ΡΡΡΡΡ (Π² Π±ΠΎΠ»ΡΡΠΎΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π΅ ΠΈ ΡΡΠ°Π·Ρ) Π΄Π»Ρ ΡΠ°Π·ΠΌΠ΅ΡΠ΅Π½ΠΈΡ Π΄Π°Π½Π½ΡΡ
. ΠΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ Π²ΠΎΠ·Π½ΠΈΠΊΠ»Π° ΡΠΈΡΡΠ°ΡΠΈΡ ΠΊΠΎΠ³Π΄Π° Π΄Π»Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π·Π°ΠΏΡΠΎΡΠ° ΠΏΠΎΡΡΠ΅Π±ΠΎΠ²Π°Π»ΠΈΡΡ ΡΠΈΡΡΡΠ΅ ΡΡΡΠ°Π½ΠΈΡΡ ΠΈ ΠΎΠ½ΠΈ ΡΠΆΠ΅ Π΅ΡΡΡ Π² shared buffers. ΠΠΎΡΡΠ³ΡΠ΅ΡΠΎΠ²ΡΠΉ backend
ΠΏΡΠΎΡΡΠΎ Π±Π΅ΡΠ΅Ρ ΠΈΡ
ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ, Π΅ΠΌΡ Π½Π΅ Π½Π°Π΄ΠΎ ΡΠ°ΠΌΠΎΠΌΡ Π½ΠΈΡΠ΅Π³ΠΎ ΡΠΈΡΡΠΈΡΡ. ΠΠΎ Π΅ΡΠ»ΠΈ Π²Π΄ΡΡΠ³ ΡΠ°ΠΊΠΈΡ
ΡΡΡΠ°Π½ΠΈΡ Π½Π΅Ρ, Π±ΡΠΊΠ΅Π½Π΄ ΠΏΡΠΈΠΎΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ ΡΠ°Π±ΠΎΡΡ ΠΈ Π½Π°ΡΠΈΠ½Π°Π΅Ρ ΠΏΠΎΠΈΡΠΊ ΡΡΡΠ°Π½ΠΈΡ ΡΡΠΎΠ±Ρ ΡΠ±ΡΠΎΡΠΈΡΡ ΠΈΡ
Π½Π° Π΄ΠΈΡΠΊ ΠΈ Π²Π·ΡΡΡ Π΄Π»Ρ ΡΠ²ΠΎΠΈΡ
Π½ΡΠΆΠ΄ β ΡΡΠΎ Π½Π΅Π³Π°ΡΠΈΠ²Π½ΠΎ ΡΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ Π½Π° Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΠ΅Π³ΠΎΡΡ Π² Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ Π·Π°ΠΏΡΠΎΡΠ°. ΠΡΠ»ΠΈ Π²Ρ Π²ΠΈΠ΄ΠΈΡΠ΅, ΡΡΠΎ Ρ Π²Π°Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ maxwritten_clean
Π±ΠΎΠ»ΡΡΠΎΠΉ, ΡΡΠΎ Π·Π½Π°ΡΠΈΡ, ΡΡΠΎ background writer Π½Π΅ ΡΠΏΡΠ°Π²Π»ΡΠ΅ΡΡΡ ΡΠΎ ΡΠ²ΠΎΠ΅ΠΉ ΡΠ°Π±ΠΎΡΠΎΠΉ ΠΈ Π½ΡΠΆΠ½ΠΎ ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°ΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ bgwriter_lru_maxpages
, ΡΡΠΎΠ±Ρ ΠΎΠ½ ΡΠΌΠΎΠ³ Π·Π° ΠΎΠ΄ΠΈΠ½ ΡΠΈΠΊΠ» ΡΠ΄Π΅Π»Π°ΡΡ Π±ΠΎΠ»ΡΡΠ΅ ΡΠ°Π±ΠΎΡΡ, Π±ΠΎΠ»ΡΡΠ΅ ΠΎΡΠΈΡΡΠΈΡΡ ΡΡΡΠ°Π½ΠΈΡΠ΅ΠΊ.
Π Π΄ΡΡΠ³ΠΎΠΉ ΠΎΡΠ΅Π½Ρ ΠΏΠΎΠ»Π΅Π·Π½ΡΠΉ ΠΏΠΎΠΊΠ°Π·Π°ΡΠ΅Π»Ρ β ΡΡΠΎ buffers_backend_fsync
. ΠΡΠΊΠ΅Π½Π΄Ρ Π½Π΅ Π΄Π΅Π»Π°ΡΡ fsync, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΡΡΠΎ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ. ΠΠ½ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ fsync Π²ΡΡΠ΅ ΠΏΠΎ IO stack checkpointerβΡ. Π£ checkpointer Π΅ΡΡΡ ΡΠ²ΠΎΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ, ΠΎΠ½ ΠΏΠ΅ΡΠΈΠΎΠ΄ΠΈΡΠ΅ΡΠΊΠΈ fsync ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ ΠΈ ΡΡΡΠ°Π½ΠΈΡΡ Π² ΠΏΠ°ΠΌΡΡΠΈ ΡΠΈΠ½Ρ
ΡΠΎΠ½ΠΈΠ·ΠΈΡΡΠ΅Ρ Ρ ΡΠ°ΠΉΠ»Π°ΠΌΠΈ Π½Π° Π΄ΠΈΡΠΊΠ΅. ΠΡΠ»ΠΈ ΠΎΡΠ΅ΡΠ΅Π΄Ρ Π±ΠΎΠ»ΡΡΠ°Ρ Ρ checkpointer ΠΈ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Π°, ΡΠΎ Π±ΡΠΊΠ΅Π½Π΄ Π²ΡΠ½ΡΠΆΠ΄Π΅Π½ ΡΠ°ΠΌ Π΄Π΅Π»Π°ΡΡ fsync ΠΈ ΡΡΠΎ Π·Π°ΠΌΠ΅Π΄Π»ΡΠ΅Ρ ΡΠ°Π±ΠΎΡΡ Π±ΡΠΊΠ΅Π½Π΄Π°, Ρ. Π΅. ΠΊΠ»ΠΈΠ΅Π½Ρ ΠΏΠΎΠ»ΡΡΠΈΡ ΠΎΡΠ²Π΅Ρ ΠΏΠΎΠ·ΠΆΠ΅, ΡΠ΅ΠΌ ΠΌΠΎΠ³ Π±Ρ. ΠΡΠ»ΠΈ Π²Ρ Π²ΠΈΠ΄ΠΈΡΠ΅, ΡΡΠΎ Ρ Π²Π°Ρ ΡΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π±ΠΎΠ»ΡΡΠ΅ Π½ΡΠ»Ρ, ΡΠΎ ΡΡΠΎ ΡΠΆΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° ΠΈ Π½ΡΠΆΠ½ΠΎ ΠΎΠ±ΡΠ°ΡΠΈΡΡ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ background writer’Π° ΠΈ ΡΠ°ΠΊΠΆΠ΅ ΠΎΡΠ΅Π½ΠΈΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ Π΄ΠΈΡΠΊΠΎΠ²ΠΎΠΉ ΠΏΠΎΠ΄ΡΠΈΡΡΠ΅ΠΌΡ.
ΠΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅: _Π‘Π»Π΅Π΄ΡΡΡΠΈΠΉ ΡΠ΅ΠΊΡΡ ΠΎΠΏΠΈΡΡΠ²Π°Π΅Ρ ΡΡΠ°ΡΠΈΡΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ ΡΠ²ΡΠ·Π°Π½Π½ΡΠ΅ Ρ ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠ΅ΠΉ. ΠΠΎΠ»ΡΡΠ°Ρ ΡΠ°ΡΡΡ ΠΈΠΌΠ΅Π½ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠΉ ΠΈ ΡΡΠ½ΠΊΡΠΈΠΉ Π±ΡΠ»Π° ΠΏΠ΅ΡΠ΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π° Π² Postgres 10. Π‘ΡΡΡ ΠΏΠ΅ΡΠ΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠΉ ΡΠ²ΠΎΠ΄ΠΈΠ»Π°ΡΡ ΠΊ Π·Π°ΠΌΠ΅Π½Π΅ xlog
Π½Π° wal
ΠΈ location
Π½Π° lsn
Π² ΠΈΠΌΠ΅Π½Π°Ρ
ΡΡΠ½ΠΊΡΠΈΠΉ/ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠΉ ΠΈ Ρ.ΠΏ. Π§Π°ΡΡΠ½ΡΠΉ ΠΏΡΠΈΠΌΠ΅Ρ, ΡΡΠ½ΠΊΡΠΈΡ pg_xlog_location_diff()
Π±ΡΠ»Π° ΠΏΠ΅ΡΠ΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π° Π² pg_wal_lsn_diff()
._
Π’ΡΡ ΡΠΎΠΆΠ΅ Ρ Π½Π°Ρ ΠΌΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅Π³ΠΎ. ΠΠΎ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΡΡΡΡ Π½Π°ΠΌ Π²ΡΠ΅Π³ΠΎ Π»ΠΈΡΡ ΠΏΡΠ½ΠΊΡΡ, ΡΠ²ΡΠ·Π°Π½Π½ΡΠ΅ Ρ location.
ΠΡΠ»ΠΈ ΠΌΡ Π²ΠΈΠ΄ΠΈΠΌ, ΡΡΠΎ Π²ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΠ°Π²Π½Ρ, ΡΠΎ ΡΡΠΎ ΠΈΠ΄Π΅Π°Π»ΡΠ½ΡΠΉ Π²Π°ΡΠΈΠ°Π½Ρ ΠΈ ΡΠ΅ΠΏΠ»ΠΈΠΊΠ° Π½Π΅ ΠΎΡΡΡΠ°Π΅Ρ ΠΎΡ ΠΌΠ°ΡΡΠ΅ΡΠ°.
ΠΠΎΡ ΡΡΠ° ΡΠ΅ΡΡΠ½Π°Π΄ΡΠ°ΡΠ΅ΡΠΈΡΠ½Π°Ρ ΠΏΠΎΠ·ΠΈΡΠΈΡ β ΡΡΠΎ ΠΏΠΎΠ·ΠΈΡΠΈΡ Π² ΠΆΡΡΠ½Π°Π»Π΅ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ. ΠΠ½Π° ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎ ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°Π΅ΡΡΡ, Π΅ΡΠ»ΠΈ Π² Π±Π°Π·Π΅ Π΅ΡΡΡ ΠΊΠ°ΠΊΠ°Ρ-ΡΠΎ Π°ΠΊΡΠΈΠ²Π½ΠΎΡΡΡ: inserts, deletes ΠΈ Ρ. Π΄.
ΡΠΊΠΎΠ»ΡΠΊΠΎ Π·Π°ΠΏΠΈΡΠ°Π½ΠΎ xlog Π² Π±Π°ΠΉΡΠ°Ρ
$ select
pg_xlog_location_diff(pg_current_xlog_location(),'0/00000000');
Π»Π°Π³ ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠΈ Π² Π±Π°ΠΉΡΠ°Ρ
$ select
client_addr,
pg_xlog_location_diff(pg_current_xlog_location(), replay_location)
from pg_stat_replication;
Π»Π°Π³ ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠΈ Π² ΡΠ΅ΠΊΡΠ½Π΄Π°Ρ
$ select
extract(epoch from now() - pg_last_xact_replay_timestamp());
ΠΡΠ»ΠΈ ΡΡΠΈ Π²Π΅ΡΠΈ ΠΎΡΠ»ΠΈΡΠ°ΡΡΡΡ, Π·Π½Π°ΡΠΈΡ Π΅ΡΡΡ ΠΊΠ°ΠΊΠΎΠΉ-ΡΠΎ Π»Π°Π³. ΠΠ°Π³ β ΡΡΠΎ ΠΎΡΡΡΠ°Π²Π°Π½ΠΈΠ΅ ΡΠ΅ΠΏΠ»ΠΈΠΊΠΈ ΠΎΡ ΠΌΠ°ΡΡΠ΅ΡΠ°, Ρ. Π΅. Π΄Π°Π½Π½ΡΠ΅ ΠΎΡΠ»ΠΈΡΠ°ΡΡΡΡ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠ΅ΡΠ²Π΅ΡΠ°ΠΌΠΈ.
ΠΡΡΡ ΡΡΠΈ ΠΏΡΠΈΡΠΈΠ½Ρ ΠΎΡΡΡΠ°Π²Π°Π½ΠΈΡ:
- ΠΡΠΎ Π΄ΠΈΡΠΊΠΎΠ²Π°Ρ ΠΏΠΎΠ΄ΡΠΈΡΡΠ΅ΠΌΠ° Π½Π΅ ΡΠΏΡΠ°Π²Π»ΡΠ΅ΡΡΡ Ρ Π·Π°ΠΏΠΈΡΡΡ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ ΡΠ°ΠΉΠ»ΠΎΠ².
- ΠΡΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠ΅ ΠΎΡΠΈΠ±ΠΊΠΈ ΡΠ΅ΡΠΈ, Π»ΠΈΠ±ΠΎ ΠΏΠ΅ΡΠ΅Π³ΡΡΠ·ΠΊΠ° ΡΠ΅ΡΠΈ, ΠΊΠΎΠ³Π΄Π° Π΄Π°Π½Π½ΡΠ΅ Π½Π΅ ΡΡΠΏΠ΅Π²Π°ΡΡ Π΄ΠΎΠ΅Π·ΠΆΠ°ΡΡ Π΄ΠΎ ΡΠ΅ΠΏΠ»ΠΈΠΊΠΈ ΠΈ ΠΎΠ½ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ ΠΈΡ Π²ΠΎΡΠΏΡΠΎΠΈΠ·Π²Π΅ΡΡΠΈ.
- Π ΠΏΡΠΎΡΠ΅ΡΡΠΎΡ. ΠΡΠΎΡΠ΅ΡΡΠΎΡ β ΡΡΠΎ ΠΎΡΠ΅Π½Ρ ΡΠ΅Π΄ΠΊΠΈΠΉ ΡΠ»ΡΡΠ°ΠΉ. Π Ρ Π²ΠΈΠ΄Π΅Π» ΡΠ°ΠΊΠΎΠ΅ Π΄Π²Π° ΠΈΠ»ΠΈ ΡΡΠΈ ΡΠ°Π·Π°, Π½ΠΎ ΡΠ°ΠΊΠΎΠ΅ ΡΠΎΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ.
Π Π²ΠΎΡ ΡΡΠΈ Π·Π°ΠΏΡΠΎΡΠ°, ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π°ΠΌ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΡ. ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΡΠ΅Π½ΠΈΡΡ, ΡΠΊΠΎΠ»ΡΠΊΠΎ Π·Π°ΠΏΠΈΡΠ°Π½ΠΎ Ρ Π½Π°Ρ Π² ΠΆΡΡΠ½Π°Π»Π΅ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ. ΠΡΡΡ ΡΠ°ΠΊΠ°Ρ ΡΡΠ½ΠΊΡΠΈΡ pg_xlog_location_diff
ΠΈ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΡΠ΅Π½ΠΈΡΡ Π»Π°Π³ ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠΈ Π² Π±Π°ΠΉΡΠ°Ρ
ΠΈ ΡΠ΅ΠΊΡΠ½Π΄Π°Ρ
. ΠΡ ΡΠΎΠΆΠ΅ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΈΠ· ΡΡΠΎΠ³ΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ (VIEWs).
ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅: _ΠΠΌΠ΅ΡΡΠΎ pg_xlog_locationdiff() ΡΡΠ½ΠΊΡΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ Π²ΡΡΠΈΡΠ°Π½ΠΈΡ ΠΈ Π²ΡΡΠΈΡΠ°ΡΡ ΠΎΠ΄ΠΈΠ½ location ΠΈΠ· Π΄ΡΡΠ³ΠΎΠ³ΠΎ. Π£Π΄ΠΎΠ±Π½ΠΎ.
Π‘ Π»Π°Π³ΠΎΠΌ, ΠΊΠΎΡΠΎΡΡΠΉ Π² ΡΠ΅ΠΊΡΠ½Π΄Π°Ρ , Π΅ΡΡΡ ΠΎΠ΄ΠΈΠ½ ΠΌΠΎΠΌΠ΅Π½Ρ. ΠΡΠ»ΠΈ Π½Π° ΠΌΠ°ΡΡΠ΅ΡΠ΅ Π½Π΅ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ Π°ΠΊΡΠΈΠ²Π½ΠΎΡΡΠΈ, ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ ΡΠ°ΠΌ Π±ΡΠ»Π° Π³Π΄Π΅-ΡΠΎ 15 ΠΌΠΈΠ½ΡΡ Π½Π°Π·Π°Π΄ ΠΈ Π°ΠΊΡΠΈΠ²Π½ΠΎΡΡΠΈ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ Π½Π΅Ρ, ΠΈ Π΅ΡΠ»ΠΈ ΠΌΡ Π½Π° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ΅ ΠΏΠΎΡΠΌΠΎΡΡΠΈΠΌ ΡΡΠΎΡ Π»Π°Π³, ΡΠΎ ΠΌΡ ΡΠ²ΠΈΠ΄ΠΈΠΌ Π»Π°Π³ Π² 15 ΠΌΠΈΠ½ΡΡ. ΠΠ± ΡΡΠΎΠΌ ΡΡΠΎΠΈΡ ΠΏΠΎΠΌΠ½ΠΈΡΡ. Π ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ Π²Π²ΠΎΠ΄ΠΈΡΡ Π² ΡΡΡΠΏΠΎΡ, ΠΊΠΎΠ³Π΄Π° Π²Ρ ΠΏΠΎΡΠΌΠΎΡΡΠ΅Π»ΠΈ ΡΡΠΎΡ Π»Π°Π³.
Pg_stat_all_tables β Π΅ΡΠ΅ ΠΎΠ΄Π½ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅. ΠΠ½ΠΎ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΡ ΠΏΠΎ ΡΠ°Π±Π»ΠΈΡΠ°ΠΌ. ΠΠΎΠ³Π΄Π° Ρ Π½Π°Ρ Π² Π±Π°Π·Π΅ Π΅ΡΡΡ ΡΠ°Π±Π»ΠΈΡΡ, Ρ Π½ΠΈΠΌ Π΅ΡΡΡ ΠΊΠ°ΠΊΠ°Ρ-ΡΠΎ Π°ΠΊΡΠΈΠ²Π½ΠΎΡΡΡ, ΠΊΠ°ΠΊΠΈΠ΅-ΡΠΎ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΈΠ· ΡΡΠΎΠ³ΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ.
select
relname,
pg_size_pretty(pg_relation_size(relname::regclass)) as size,
seq_scan, seq_tup_read,
seq_scan / seq_tup_read as seq_tup_avg
from pg_stat_user_tables
where seq_tup_read > 0 order by 3,4 desc limit 5;
ΠΠ΅ΡΠ²ΠΎΠ΅, ΡΡΠΎ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ, ΡΡΠΎ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΡΠ΅ ΡΠΊΠ°Π½ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΏΠΎ ΡΠ°Π±Π»ΠΈΡΠ΅. Π‘Π°ΠΌΠΎ ΡΠΈΡΠ»ΠΎ ΠΏΠΎΡΠ»Π΅ ΡΡΠΈΡ ΠΏΡΠΎΡ ΠΎΠ΄ΠΎΠ² Π΅ΡΠ΅ Π½Π΅ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ ΠΏΠ»ΠΎΡ ΠΎ ΠΈ Π½Π΅ ΠΏΠΎΠΊΠ°Π·Π°ΡΠ΅Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎ Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΡΠΆΠ΅ ΡΡΠΎ-ΡΠΎ ΠΏΡΠ΅Π΄ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ.
ΠΠ΄Π½Π°ΠΊΠΎ Π΅ΡΡΡ Π²ΡΠΎΡΠ°Ρ ΠΌΠ΅ΡΡΠΈΠΊΠ° β seq_tup_read. ΠΡΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΡΡΠΎΠΊ, Π²ΠΎΠ·Π²ΡΠ°ΡΠ΅Π½Π½ΡΡ Π² ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠΊΠ°Π½ΠΈΡΠΎΠ²Π°Π½ΠΈΡ. ΠΡΠ»ΠΈ ΡΡΡΠ΅Π΄Π½Π΅Π½Π½ΠΎΠ΅ ΡΠΈΡΠ»ΠΎ ΠΏΡΠ΅Π²ΡΡΠ°Π΅Ρ 1 000, 10 000, 50 000, 100 000, ΡΠΎ ΡΡΠΎ ΡΠΆΠ΅ ΠΏΠΎΠΊΠ°Π·Π°ΡΠ΅Π»Ρ, ΡΡΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π²Π°ΠΌ Π½ΡΠΆΠ½ΠΎ Π³Π΄Π΅-ΡΠΎ ΠΏΠΎΡΡΡΠΎΠΈΡΡ ΠΈΠ½Π΄Π΅ΠΊΡ, ΡΡΠΎΠ±Ρ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΡ Π±ΡΠ»ΠΈ ΠΏΠΎ ΠΈΠ½Π΄Π΅ΠΊΡΡ, Π»ΠΈΠ±ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ Π·Π°ΠΏΡΠΎΡΡ ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΠ°ΠΊΠΈΠ΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΡΠ΅ ΡΠΊΠ°Π½ΠΈΡΠΎΠ²Π°Π½ΠΈΡ, ΡΡΠΎΠ±Ρ ΡΠ°ΠΊΠΎΠ³ΠΎ Π½Π΅ Π±ΡΠ»ΠΎ.
ΠΡΠΎΡΡΠΎΠΉ ΠΏΡΠΈΠΌΠ΅Ρ β Π΄ΠΎΠΏΡΡΡΠΈΠΌ, Π·Π°ΠΏΡΠΎΡ Ρ Π±ΠΎΠ»ΡΡΠΈΠΌ OFFSET ΠΈ LIMIT ΡΡΠΎΠΈΡ. Π ΠΏΡΠΈΠΌΠ΅ΡΡ ΡΠΊΠ°Π½ΠΈΡΡΠ΅ΡΡΡ 100 000 ΡΡΡΠΎΠΊ Π² ΡΠ°Π±Π»ΠΈΡΠ΅ ΠΈ ΠΏΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ Π±Π΅ΡΠ΅ΡΡΡ 50 000 Π½ΡΠΆΠ½ΡΡ ΡΡΡΠΎΠΊ, Π° ΠΏΡΠ΅Π΄ΡΠ΄ΡΠΈΠ΅ ΠΎΡΡΠΊΠ°Π½ΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ ΡΡΡΠΎΠΊΠΈ ΠΎΡΠ±ΡΠ°ΡΡΠ²Π°ΡΡΡΡ. ΠΡΠΎ ΡΠΎΠΆΠ΅ ΠΏΠ»ΠΎΡ ΠΎΠΉ ΠΊΠ΅ΠΉΡ. Π ΡΠ°ΠΊΠΈΠ΅ Π·Π°ΠΏΡΠΎΡΡ Π½ΡΠΆΠ½ΠΎ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ. Π Π·Π΄Π΅ΡΡ Π²ΠΎΡ ΡΠ°ΠΊΠΎΠΉ ΠΏΡΠΎΡΡΠΎΠΉ SQL-Π·Π°ΠΏΡΠΎΡ, Π½Π° ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΡΡΠΎ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ ΠΈ ΠΎΡΠ΅Π½ΠΈΡΡ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΠ΅ ΡΠΈΡΡΡ.
select
relname,
pg_size_pretty(pg_total_relation_size(relname::regclass)) as
full_size,
pg_size_pretty(pg_relation_size(relname::regclass)) as
table_size,
pg_size_pretty(pg_total_relation_size(relname::regclass) -
pg_relation_size(relname::regclass)) as index_size
from pg_stat_user_tables
order by pg_total_relation_size(relname::regclass) desc limit 10;
Π Π°Π·ΠΌΠ΅ΡΡ ΡΠ°Π±Π»ΠΈΡ ΡΠ°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠΎΠΉ ΡΠ°Π±Π»ΠΈΡΡ ΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ
ΡΡΠ½ΠΊΡΠΈΠΉ pg_total_relation_size()
, pg_relation_size()
.
ΠΠΎΠΎΠ±ΡΠ΅, Π΅ΡΡΡ ΠΌΠ΅ΡΠ°ΠΊΠΎΠΌΠ°Π½Π΄Ρ dt
ΠΈ di
, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π² PSQL ΠΈ ΡΠ°ΠΊΠΆΠ΅ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ ΡΠ°Π·ΠΌΠ΅ΡΡ ΡΠ°Π±Π»ΠΈΡ ΠΈ ΠΈΠ½Π΄Π΅ΠΊΡΠΎΠ².
ΠΠ΄Π½Π°ΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΉ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ Π½Π°ΠΌ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ ΡΠ°Π·ΠΌΠ΅ΡΡ ΡΠ°Π±Π»ΠΈΡ Π΅ΡΠ΅ Ρ ΡΡΠ΅ΡΠΎΠΌ ΠΈΠ½Π΄Π΅ΠΊΡΠΎΠ², Π»ΠΈΠ±ΠΎ Π±Π΅Π· ΡΡΠ΅ΡΠΎΠ² ΠΈΠ½Π΄Π΅ΠΊΡΠΎΠ² ΠΈ ΡΠΆΠ΅ Π΄Π΅Π»Π°ΡΡ ΠΊΠ°ΠΊΠΈΠ΅-ΡΠΎ ΠΎΡΠ΅Π½ΠΊΠΈ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΡΠΎΡΡΠ° Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ , Ρ. Π΅. ΠΊΠ°ΠΊ ΠΎΠ½Π° Ρ Π½Π°Ρ ΡΠ°ΡΡΠ΅Ρ, Ρ ΠΊΠ°ΠΊΠΎΠΉ ΠΈΠ½ΡΠ΅Π½ΡΠΈΠ²Π½ΠΎΡΡΡΡ ΠΈ Π΄Π΅Π»Π°ΡΡ ΡΠΆΠ΅ ΠΊΠ°ΠΊΠΈΠ΅-ΡΠΎ Π²ΡΠ²ΠΎΠ΄Ρ ΠΎΠ± ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ ΡΠ°Π·ΠΌΠ΅ΡΠΎΠ².
ΠΠΊΡΠΈΠ²Π½ΠΎΡΡΡ Π½Π° Π·Π°ΠΏΠΈΡΡ. Π§ΡΠΎ ΡΠ°ΠΊΠΎΠ΅ Π·Π°ΠΏΠΈΡΡ? ΠΠ°Π²Π°ΠΉΡΠ΅ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ UPDATE
β ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ ΡΡΡΠΎΠΊ Π² ΡΠ°Π±Π»ΠΈΡΠ΅. ΠΠΎ ΡΡΡΠΈ, update β ΡΡΠΎ Π΄Π²Π΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ (Π° ΡΠΎ ΠΈ Π΅ΡΡ Π±ΠΎΠ»ΡΡΠ΅). ΠΡΠΎ Π²ΡΡΠ°Π²ΠΊΠ° Π½ΠΎΠ²ΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ ΡΡΡΠΎΠΊΠΈ ΠΈ ΠΏΠΎΠΌΠ΅ΡΠΊΠ° ΡΡΠ°ΡΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ ΡΡΡΠΎΠΊΠΈ ΠΊΠ°ΠΊ ΡΡΡΠ°ΡΠ΅Π²ΡΠ΅ΠΉ. Π ΠΏΠΎΡΠ»Π΅Π΄ΡΡΠ²ΠΈΠΈ ΠΏΡΠΈΠ΄Π΅Ρ Π°Π²ΡΠΎΠ²Π°ΠΊΡΡΠΌ ΠΈ Π²ΠΎΡ ΡΡΠΈ ΡΡΡΠ°ΡΠ΅Π²ΡΠΈΠ΅ Π²Π΅ΡΡΠΈΠΈ ΡΡΡΠΎΠΊ Π²ΡΡΠΈΡΡΠΈΡ, ΠΏΠΎΠΌΠ΅ΡΠΈΡ ΡΡΠΎ ΠΌΠ΅ΡΡΠΎ ΠΊΠ°ΠΊ Π΄ΠΎΡΡΡΠΏΠ½ΠΎΠ΅ Π΄Π»Ρ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ.
ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, update β ΡΡΠΎ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΡΠ°Π±Π»ΠΈΡΡ. ΠΡΠΎ Π΅ΡΠ΅ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΠΈΠ½Π΄Π΅ΠΊΡΠΎΠ². ΠΡΠ»ΠΈ Ρ Π²Π°Ρ Π½Π° ΡΠ°Π±Π»ΠΈΡΠ΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ½Π΄Π΅ΠΊΡΠΎΠ², ΡΠΎ ΠΏΡΠΈ update Π²ΡΠ΅ ΠΈΠ½Π΄Π΅ΠΊΡΡ, Π² ΠΊΠΎΡΠΎΡΡΡ ΡΡΠ°ΡΡΠ²ΡΡΡ ΠΏΠΎΠ»Ρ, ΠΎΠ±Π½ΠΎΠ²Π»ΡΠ΅ΠΌΡΠ΅ Π² Π·Π°ΠΏΡΠΎΡΠ΅, Π½ΡΠΆΠ½ΠΎ Π±ΡΠ΄Π΅Ρ ΡΠ°ΠΊΠΆΠ΅ ΠΎΠ±Π½ΠΎΠ²ΠΈΡΡ. Π ΡΡΠΈΡ ΠΈΠ½Π΄Π΅ΠΊΡΠ°Ρ ΡΠ°ΠΊΠΆΠ΅ Π±ΡΠ΄ΡΡ ΡΡΡΠ°ΡΠ΅Π²ΡΠΈΠ΅ Π²Π΅ΡΡΠΈΠΈ ΡΡΡΠΎΠΊ, ΠΊΠΎΡΠΎΡΡΠ΅ Π½ΡΠΆΠ½ΠΎ Π±ΡΠ΄Π΅Ρ ΠΏΠΎΡΠΈΡΡΠΈΡΡ.
select
s.relname,
pg_size_pretty(pg_relation_size(relid)),
coalesce(n_tup_ins,0) + 2 * coalesce(n_tup_upd,0) -
coalesce(n_tup_hot_upd,0) + coalesce(n_tup_del,0) AS total_writes,
(coalesce(n_tup_hot_upd,0)::float * 100 / (case when n_tup_upd > 0
then n_tup_upd else 1 end)::float)::numeric(10,2) AS hot_rate,
(select v[1] FROM regexp_matches(reloptions::text,E'fillfactor=(\d+)') as
r(v) limit 1) AS fillfactor
from pg_stat_all_tables s
join pg_class c ON c.oid=relid
order by total_writes desc limit 50;
Π Π·Π° ΡΡΠ΅Ρ ΡΠ²Π΅Π³ΠΎ Π΄ΠΈΠ·Π°ΠΉΠ½Π°, UPDATE β ΡΡΠΎ ΡΡΠΆΠ΅Π»ΠΎΠ²Π΅ΡΠ½ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ. ΠΠΎ ΠΈΡ
ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Π»Π΅Π³ΡΠΈΡΡ. ΠΡΡΡ hot updates
. ΠΠ½ΠΈ ΠΏΠΎΡΠ²ΠΈΠ»ΠΈΡΡ Π² PostgreSQL Π²Π΅ΡΡΠΈΠΈ 8.3. Π ΡΡΠΎ ΡΡΠΎ ΡΠ°ΠΊΠΎΠ΅? ΠΡΠΎ Π»Π΅Π³ΠΊΠΎΠ²Π΅ΡΠ½ΡΠΉ update, ΠΊΠΎΡΠΎΡΡΠΉ Π½Π΅ Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΠΏΠ΅ΡΠ΅ΡΡΡΠΎΠ΅Π½ΠΈΠ΅ ΠΈΠ½Π΄Π΅ΠΊΡΠΎΠ². Π’. Π΅. ΠΌΡ ΠΎΠ±Π½ΠΎΠ²ΠΈΠ»ΠΈ Π·Π°ΠΏΠΈΡΡ, Π½ΠΎ ΠΏΡΠΈ ΡΡΠΎΠΌ ΠΎΠ±Π½ΠΎΠ²ΠΈΠ»Π°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π·Π°ΠΏΠΈΡΡ Π² ΡΡΡΠ°Π½ΠΈΡΠΊΠ΅ (ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΡΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ ΡΠ°Π±Π»ΠΈΡΠ΅), Π° ΠΈΠ½Π΄Π΅ΠΊΡΡ ΠΏΠΎ-ΠΏΡΠ΅ΠΆΠ½Π΅ΠΌΡ ΡΠΊΠ°Π·ΡΠ²Π°ΡΡ Π½Π° ΡΡ ΠΆΠ΅ ΡΠ°ΠΌΡΡ Π·Π°ΠΏΠΈΡΡ Π² ΡΡΡΠ°Π½ΠΈΡΠ΅. Π’Π°ΠΌ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ°ΠΊΠ°Ρ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½Π°Ρ Π»ΠΎΠ³ΠΈΠΊΠ° ΡΠ°Π±ΠΎΡΡ, ΠΊΠΎΠ³Π΄Π° ΠΏΡΠΈΡ
ΠΎΠ΄ΠΈΡ Π²Π°ΠΊΡΡΠΌ, ΡΠΎ ΠΎΠ½ ΡΡΠΈ ΡΠ΅ΠΏΠΎΡΠΊΠΈ hot
ΠΏΠ΅ΡΠ΅ΡΡΡΠ°ΠΈΠ²Π°Π΅Ρ ΠΈ Π²ΡΠ΅ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π±Π΅Π· ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ ΠΈΠ½Π΄Π΅ΠΊΡΠΎΠ², ΠΈ ΠΏΡΠΎΠΈΡΡ
ΠΎΠ΄ΠΈΡ Π²ΡΠ΅ Ρ ΠΌΠ΅Π½ΡΡΠ΅ΠΉ ΡΡΠ°ΡΠΎΠΉ ΡΠ΅ΡΡΡΡΠΎΠ².
Π ΠΊΠΎΠ³Π΄Π° Ρ Π²Π°Ρ n_tup_hot_upd
Π±ΠΎΠ»ΡΡΠΎΠ΅, ΡΠΎ ΡΡΠΎ ΠΎΡΠ΅Π½Ρ Ρ
ΠΎΡΠΎΡΠΎ. ΠΡΠΎ Π·Π½Π°ΡΠΈΡ, ΡΡΠΎ Π»Π΅Π³ΠΊΠΎΠ²Π΅ΡΠ½ΡΠ΅ updates ΠΏΡΠ΅ΠΎΠ±Π»Π°Π΄Π°ΡΡ ΠΈ ΡΡΠΎ ΠΏΠΎ ΡΠ΅ΡΡΡΡΠ°ΠΌ Π²ΡΡ
ΠΎΠ΄ΠΈΡ Π½Π°ΠΌ Π΄Π΅ΡΠ΅Π²Π»Π΅ ΠΈ Π²ΡΠ΅ ΠΏΡΠ΅ΠΊΡΠ°ΡΠ½ΠΎ.
ALTER TABLE table_name SET (fillfactor = 70);
ΠΠ°ΠΊ ΡΠ²Π΅Π»ΠΈΡΠΈΡΡ ΠΎΠ±ΡΠ΅ΠΌ hot update
ΠΎΠ²? ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ fillfactor
. ΠΠ½ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ ΡΠ°Π·ΠΌΠ΅Ρ ΡΠ΅Π·Π΅ΡΠ²ΠΈΡΡΠ΅ΠΌΠΎΠ³ΠΎ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΌΠ΅ΡΡΠ΅ ΠΏΡΠΈ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΡΡΡΠ°Π½ΠΈΡΡ Π² ΡΠ°Π±Π»ΠΈΡΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΡ INSERT’ΠΎΠ². ΠΠΎΠ³Π΄Π° Π² ΡΠ°Π±Π»ΠΈΡΡ ΠΈΠ΄ΡΡ inserts, ΡΠΎ ΠΎΠ½ΠΈ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ Π·Π°ΠΏΠΎΠ»Π½ΡΡΡ ΡΡΡΠ°Π½ΠΈΡΠΊΡ, Π½Π΅ ΠΎΡΡΠ°Π²Π»ΡΡΡ Π² Π½Π΅ΠΉ ΠΏΡΡΡΠΎΠ³ΠΎ ΠΌΠ΅ΡΡΠ°. ΠΠΎΡΠΎΠΌ Π²ΡΠ΄Π΅Π»ΡΠ΅ΡΡΡ Π½ΠΎΠ²Π°Ρ ΡΡΡΠ°Π½ΠΈΡΠΊΠ°. Π‘Π½ΠΎΠ²Π° Π΄Π°Π½Π½ΡΠ΅ Π·Π°ΠΏΠΎΠ»Π½ΡΡΡΡΡ. Π ΡΡΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ, fillfactor = 100 %.
ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ΄Π΅Π»Π°ΡΡ fillfactor Π² 70 %. Π’. Π΅. ΠΏΡΠΈ inserts Π²ΡΠ΄Π΅Π»ΠΈΠ»Π°ΡΡ Π½ΠΎΠ²Π°Ρ ΡΡΡΠ°Π½ΠΈΡΠΊΠ°, Π½ΠΎ Π·Π°ΠΏΠΎΠ»Π½ΠΈΠ»ΠΎΡΡ Π²ΡΠ΅Π³ΠΎ Π»ΠΈΡΡ 70 % ΡΡΡΠ°Π½ΠΈΡΠΊΠΈ. Π 30 % Ρ Π½Π°Ρ ΠΎΡΡΠ°Π»ΠΎΡΡ Π½Π° ΡΠ΅Π·Π΅ΡΠ². ΠΠΎΠ³Π΄Π° Π½ΡΠΆΠ½ΠΎ Π±ΡΠ΄Π΅Ρ ΡΠ΄Π΅Π»Π°ΡΡ update, ΡΠΎ ΠΎΠ½ Ρ Π²ΡΡΠΎΠΊΠΎΠΉ Π΄ΠΎΠ»Π΅ΠΉ Π²Π΅ΡΠΎΡΡΠ½ΠΎΡΡΠΈ ΠΏΡΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ Π² ΡΠΎΠΉ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠΉ ΡΡΡΠ°Π½ΠΈΡΠΊΠ΅, ΠΈ Π½ΠΎΠ²Π°Ρ Π²Π΅ΡΡΠΈΡ ΡΡΡΠΎΠΊΠΈ ΠΏΠΎΠΌΠ΅ΡΡΠΈΡΡΡ Π² ΡΡ ΠΆΠ΅ ΡΡΡΠ°Π½ΠΈΡΠΊΡ. Π Π±ΡΠ΄Π΅Ρ ΡΠ΄Π΅Π»Π°Π½ hot_update. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΎΠ±Π»Π΅Π³ΡΠ°Π΅ΡΡΡ Π·Π°ΠΏΠΈΡΡ Π½Π° ΡΠ°Π±Π»ΠΈΡΠ°Ρ .
select c.relname,
current_setting('autovacuum_vacuum_threshold') as av_base_thresh,
current_setting('autovacuum_vacuum_scale_factor') as av_scale_factor,
(current_setting('autovacuum_vacuum_threshold')::int +
(current_setting('autovacuum_vacuum_scale_factor')::float * c.reltuples))
as av_thresh,
s.n_dead_tup
from pg_stat_user_tables s join pg_class c ON s.relname = c.relname
where s.n_dead_tup > (current_setting('autovacuum_vacuum_threshold')::int
+ (current_setting('autovacuum_vacuum_scale_factor')::float * c.reltuples));
ΠΡΠ΅ΡΠ΅Π΄Ρ Π°Π²ΡΠΎΠ²Π°ΠΊΡΡΠΌΠ°. ΠΠ²ΡΠΎΠ²Π°ΠΊΡΡΠΌ β ΡΡΠΎ ΡΠ°ΠΊΠ°Ρ ΠΏΠΎΠ΄ΡΠΈΡΡΠ΅ΠΌΠ°, ΠΏΠΎ ΠΊΠΎΡΠΎΡΠΎΠΉ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠ΅ Π² PostgreSQL ΠΎΡΠ΅Π½Ρ ΠΌΠ°Π»ΠΎ. ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ Π² ΡΠ°Π±Π»ΠΈΡΠ°Ρ ΡΠΎΠ»ΡΠΊΠΎ Π² pg_stat_activity ΡΠ²ΠΈΠ΄Π΅ΡΡ, ΡΠΊΠΎΠ»ΡΠΊΠΎ Ρ Π½Π°Ρ Π²Π°ΠΊΡΡΠΌΠΎΠ² Π΄Π»ΡΡΡΡ Π² Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ. ΠΠ΄Π½Π°ΠΊΠΎ ΠΏΠΎΠ½ΡΡΡ, ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°Π±Π»ΠΈΡ Π² ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ Ρ Π½Π΅Π³ΠΎ Ρ Ρ ΠΎΠ΄Ρ ΠΎΡΠ΅Π½Ρ ΡΠ»ΠΎΠΆΠ½ΠΎ.
ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅: _ΠΠ°ΡΠΈΠ½Π°Ρ Ρ Π²Π΅ΡΡΠΈΠΈ Postgres 10 ΡΠΈΡΡΠ°ΡΠΈΡ Ρ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΠ΅ΠΌ Π²Π°ΡΠΎΠ²Π°ΠΊΡΡΠΌΠ° ΡΠΈΠ»ΡΠ½ΠΎ ΡΠ»ΡΡΡΠΈΠ»Π°ΡΡ β ΠΏΠΎΡΠ²ΠΈΠ»ΠΎΡΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ pg_stat_progressvacuum, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΡΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎ ΡΠΏΡΠΎΡΠ°Π΅Ρ Π²ΠΎΠΏΡΠΎΡ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³Π° Π°Π²ΡΠΎΠ²Π°ΠΊΡΡΠΌΠ°.
ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π²ΠΎΡ ΡΠ°ΠΊΠΎΠΉ ΡΠΏΡΠΎΡΠ΅Π½Π½ΡΠΉ Π·Π°ΠΏΡΠΎΡ. Π ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ, ΠΊΠΎΠ³Π΄Π° Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΠ΄Π΅Ρ ΡΠ΄Π΅Π»Π°Π½ Π²Π°ΠΊΡΡΠΌ. ΠΠΎ, ΠΊΠ°ΠΊ ΠΈ ΠΊΠΎΠ³Π΄Π° Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π°ΠΏΡΡΡΠΈΡΡΡΡ Π²Π°ΠΊΡΡΠΌ? ΠΠΎΡ ΡΡΠΈ ΡΡΡΠ°ΡΠ΅Π²ΡΠΈΠ΅ Π²Π΅ΡΡΠΈΠΈ ΡΡΡΠΎΠΊ, ΠΎ ΠΊΠΎΡΠΎΡΡΡ
Ρ Π³ΠΎΠ²ΠΎΡΠΈΠ» ΡΠ°Π½ΡΡΠ΅. Update ΠΏΡΠΎΠΈΠ·ΠΎΡΠ΅Π», Π½ΠΎΠ²Π°Ρ Π²Π΅ΡΡΠΈΡ ΡΡΡΠΎΠΊΠΈ Π²ΡΡΠ°Π²ΠΈΠ»Π°ΡΡ. ΠΠΎΡΠ²ΠΈΠ»Π°ΡΡ ΡΡΡΠ°ΡΠ΅Π²ΡΠ°Ρ Π²Π΅ΡΡΠΈΡ ΡΡΡΠΎΠΊΠΈ. Π ΡΠ°Π±Π»ΠΈΡΠ΅ pg_stat_user_tables
Π΅ΡΡΡ ΡΠ°ΠΊΠΎΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ n_dead_tup
. ΠΠ½ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ "ΠΌΠ΅ΡΡΠ²ΡΡ
" ΡΡΡΠΎΠΊ. Π ΠΊΠ°ΠΊ ΡΠΎΠ»ΡΠΊΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΌΠ΅ΡΡΠ²ΡΡ
ΡΡΡΠΎΠΊ ΡΡΠ°Π»ΠΎ Π±ΠΎΠ»ΡΡΠ΅, ΡΠ΅ΠΌ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΉ ΠΏΠΎΡΠΎΠ³, ΠΊ ΡΠ°Π±Π»ΠΈΡΠ΅ ΠΏΡΠΈΠ΄Π΅Ρ Π°Π²ΡΠΎΠ²Π°ΠΊΡΡΠΌ.
Π ΠΊΠ°ΠΊ ΡΠ°ΡΡΡΠΈΡΡΠ²Π°Π΅ΡΡΡ ΡΡΠΎΡ ΠΏΠΎΡΠΎΠ³? ΠΡΠΎ Π²ΠΏΠΎΠ»Π½Π΅ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠ΅ ΠΏΡΠΎΡΠ΅Π½ΡΠ½ΠΎΠ΅ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠ΅ ΠΎΡ ΠΎΠ±ΡΠ΅Π³ΠΎ ΡΠΈΡΠ»Π° ΡΡΡΠΎΠΊ Π² ΡΠ°Π±Π»ΠΈΡΠ΅. ΠΡΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ autovacuum_vacuum_scale_factor
. ΠΠ½ ΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ ΠΏΡΠΎΡΠ΅Π½ΡΠ½ΠΎΠ΅ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠ΅. ΠΠΎΠΏΡΡΡΠΈΠΌ, 10 % + ΡΠ°ΠΌ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠΉ Π±Π°Π·ΠΎΠ²ΡΠΉ ΠΏΠΎΡΠΎΠ³ Π² 50 ΡΡΡΠΎΠΊ. Π ΡΡΠΎ ΠΏΠΎΠ»ΡΡΠ°Π΅ΡΡΡ? ΠΠΎΠ³Π΄Π° Ρ Π½Π°Ρ ΠΌΠ΅ΡΡΠ²ΡΡ
ΡΡΡΠΎΠΊ ΡΡΠ°Π»ΠΎ Π±ΠΎΠ»ΡΡΠ΅ ΡΠ΅ΠΌ "10 % + 50" ΠΎΡ Π²ΡΠ΅Ρ
ΡΡΡΠΎΠΊ Π² ΡΠ°Π±Π»ΠΈΡΠ΅, ΡΠΎ ΠΌΡ ΡΡΠ°Π²ΠΈΠΌ ΡΠ°Π±Π»ΠΈΡΡ Π½Π° Π°Π²ΡΠΎΠ²Π°ΡΡΠΌ.
select c.relname,
current_setting('autovacuum_vacuum_threshold') as av_base_thresh,
current_setting('autovacuum_vacuum_scale_factor') as av_scale_factor,
(current_setting('autovacuum_vacuum_threshold')::int +
(current_setting('autovacuum_vacuum_scale_factor')::float * c.reltuples))
as av_thresh,
s.n_dead_tup
from pg_stat_user_tables s join pg_class c ON s.relname = c.relname
where s.n_dead_tup > (current_setting('autovacuum_vacuum_threshold')::int
+ (current_setting('autovacuum_vacuum_scale_factor')::float * c.reltuples));
ΠΠ΄Π½Π°ΠΊΠΎ ΡΡΡ Π΅ΡΡΡ ΠΎΠ΄ΠΈΠ½ ΠΌΠΎΠΌΠ΅Π½Ρ. ΠΠ°Π·ΠΎΠ²ΡΠ΅ ΠΏΠΎΡΠΎΠ³ΠΈ Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² av_base_thresh
ΠΈ av_scale_factor
ΠΌΠΎΠ³ΡΡ Π½Π°Π·Π½Π°ΡΠ°ΡΡΡΡ ΠΈΠ½Π΄ΠΈΠ²ΠΈΠ΄ΡΠ°Π»ΡΠ½ΠΎ. Π, ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ, ΠΏΠΎΡΠΎΠ³ Π±ΡΠ΄Π΅Ρ Π½Π΅ Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΡΠΉ, Π° ΠΈΠ½Π΄ΠΈΠ²ΠΈΠ΄ΡΠ°Π»ΡΠ½ΡΠΉ Π΄Π»Ρ ΡΠ°Π±Π»ΠΈΡΡ. ΠΠΎΡΡΠΎΠΌΡ ΡΡΠΎΠ±Ρ ΡΠ°ΡΡΡΠΈΡΠ°ΡΡ, ΡΠ°ΠΌ Π½ΡΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡ
ΠΈΡΡΠ΅Π½ΠΈΡ ΠΈ ΡΠ»ΠΎΠ²ΠΊΠΈ. Π Π΅ΡΠ»ΠΈ Π²Π°ΠΌ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎ, ΡΠΎ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ Π½Π° ΠΎΠΏΡΡ Π½Π°ΡΠΈΡ
ΠΊΠΎΠ»Π»Π΅Π³ ΠΈΠ· Avito (ΡΡΡΠ»ΠΊΠ° Π½Π° ΡΠ»Π°ΠΉΠ΄Π΅ Π½Π΅Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½Π° Π² ΡΠ΅ΠΊΡΡΠ΅).
ΠΠ½ΠΈ Π½Π°ΠΏΠΈΡΠ°Π»ΠΈ Π΄Π»Ρ
Π§ΡΠΎ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ Ρ ΡΡΠΈΠΌ ΡΠ΄Π΅Π»Π°ΡΡ? ΠΡΠ»ΠΈ Ρ Π½Π°Ρ ΠΎΡΠ΅ΡΠ΅Π΄Ρ Π±ΠΎΠ»ΡΡΠ°Ρ ΠΈ Π°Π²ΡΠΎΠ²Π°ΠΊΡΡΠΌ Π½Π΅ ΡΠΏΡΠ°Π²Π»ΡΠ΅ΡΡΡ, ΡΠΎ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ΄Π½ΡΡΡ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π²ΠΎΡΠΊΠ΅ΡΠΎΠ² Π²Π°ΠΊΡΡΠΌΠ°, Π»ΠΈΠ±ΠΎ ΠΏΡΠΎΡΡΠΎ ΡΠ΄Π΅Π»Π°ΡΡ Π²Π°ΠΊΡΡΠΌ Π°Π³ΡΠ΅ΡΡΠΈΠ²Π½Π΅Π΅, ΡΡΠΎΠ±Ρ ΠΎΠ½ ΡΡΠΈΠ³Π³Π΅ΡΠΈΠ»ΡΡ ΡΠ°Π½ΡΡΠ΅, ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π» ΡΠ°Π±Π»ΠΈΡΡ ΠΌΠ°Π»Π΅Π½ΡΠΊΠΈΠΌΠΈ ΠΊΡΡΠΎΡΠΊΠ°ΠΌΠΈ. Π ΡΠ΅ΠΌ ΡΠ°ΠΌΡΠΌ ΠΎΡΠ΅ΡΠ΅Π΄Ρ Π±ΡΠ΄Π΅Ρ ΡΠΌΠ΅Π½ΡΡΠ°ΡΡΡΡ. β ΠΠ»Π°Π²Π½ΠΎΠ΅ Π·Π΄Π΅ΡΡ ΡΠ»Π΅Π΄ΠΈΡΡ Π·Π° Π½Π°Π³ΡΡΠ·ΠΊΠΎΠΉ Π½Π° Π΄ΠΈΡΠΊΠΈ, Ρ.ΠΊ. Π²Π°ΠΊΡΡΠΌ ΡΡΡΠΊΠ° Π½Π΅Π±Π΅ΡΠΏΠ»Π°ΡΠ½Π°Ρ, Ρ ΠΎΡΡ Ρ ΠΏΠΎΡΠ²Π»Π΅Π½ΠΈΠ΅ΠΌ SSD/NVMe ΡΡΡΡΠΎΠΉΡΡΠ² ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° ΡΡΠ°Π»Π° ΠΌΠ΅Π½Π΅Π΅ Π·Π°ΠΌΠ΅ΡΠ½ΠΎΠΉ.
Pg_stat_all_indexes β ΡΡΠΎ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠ° ΠΏΠΎ ΠΈΠ½Π΄Π΅ΠΊΡΠ°ΠΌ. ΠΠ½Π° Π½Π΅Π±ΠΎΠ»ΡΡΠ°Ρ. Π ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎ Π½Π΅ΠΉ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΏΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΈΠ½Π΄Π΅ΠΊΡΠΎΠ². Π Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΠΊΠ°ΠΊΠΈΠ΅ ΠΈΠ½Π΄Π΅ΠΊΡΡ Ρ Π½Π°Ρ Π»ΠΈΡΠ½ΠΈΠ΅.
ΠΠ°ΠΊ Ρ ΡΠΆΠ΅ Π³ΠΎΠ²ΠΎΡΠΈΠ», update β ΡΡΠΎ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΡΠ°Π±Π»ΠΈΡ, ΡΡΠΎ Π΅ΡΠ΅ ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΠΈΠ½Π΄Π΅ΠΊΡΠΎΠ². Π‘ΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ, Π΅ΡΠ»ΠΈ Ρ Π½Π°Ρ Π½Π° ΡΠ°Π±Π»ΠΈΡΠ΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ½Π΄Π΅ΠΊΡΠΎΠ² ΡΠΎ ΠΏΡΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΈ ΡΡΡΠΎΠΊ Π² ΡΠ°Π±Π»ΠΈΡΠ΅, ΠΈΠ½Π΄Π΅ΠΊΡΡ ΠΏΡΠΎΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠΎΠ²Π°Π½Π½ΡΡ
ΠΏΠΎΠ»Π΅ΠΉ ΡΠ°ΠΊΠΆΠ΅ Π½ΡΠΆΠ½ΠΎ ΠΎΠ±Π½ΠΎΠ²ΠΈΡΡ, ΠΈ Π΅ΡΠ»ΠΈ Ρ Π½Π°Ρ Π΅ΡΡΡ Π½Π΅ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠ΅ ΠΈΠ½Π΄Π΅ΠΊΡΡ, ΠΏΠΎ ΠΊΠΎΡΠΎΡΡΠΌ Π½Π΅Ρ ΠΈΠ½Π΄Π΅ΠΊΡΠΎΠ²ΡΡ
ΡΠΊΠ°Π½ΠΈΡΠΎΠ²Π°Π½ΠΈΠΉ, ΡΠΎ ΠΎΠ½ΠΈ Ρ Π½Π°Ρ Π²ΠΈΡΡΡ Π±Π°Π»Π»Π°ΡΡΠΎΠΌ. Π ΠΎΡ Π½ΠΈΡ
Π½ΡΠΆΠ½ΠΎ ΠΈΠ·Π±Π°Π²Π»ΡΡΡΡΡ. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΠΏΠΎΠ»Π΅ idx_scan
. ΠΡ ΠΏΡΠΎΡΡΠΎ ΡΠΌΠΎΡΡΠΈΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΈΠ½Π΄Π΅ΠΊΡΠ½ΡΡ
ΡΠΊΠ°Π½ΠΈΡΠΎΠ²Π°Π½ΠΈΠΉ. ΠΡΠ»ΠΈ Ρ ΠΈΠ½Π΄Π΅ΠΊΡΠΎΠ² Π½ΠΎΠ»Ρ ΡΠΊΠ°Π½ΠΈΡΠΎΠ²Π°Π½ΠΈΠΉ Π·Π° ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎ Π΄Π»ΠΈΠ½Π½ΡΠΉ ΠΏΠ΅ΡΠΈΠΎΠ΄ Ρ
ΡΠ°Π½Π΅Π½ΠΈΡ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠΈ (Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ ΡΠ΅ΠΌ 2-3 Π½Π΅Π΄Π΅Π»ΠΈ), ΡΠΎ Π²Π΅ΡΠΎΡΡΠ½Π΅ΠΉ Π²ΡΠ΅Π³ΠΎ ΡΡΠΎ ΠΏΠ»ΠΎΡ
ΠΈΠ΅ ΠΈΠ½Π΄Π΅ΠΊΡΡ, Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΠΎΡ Π½ΠΈΡ
ΠΈΠ·Π±Π°Π²ΠΈΡΡΡΡ.
ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅: ΠΡΠΈ ΠΏΠΎΠΈΡΠΊΠ΅ Π½Π΅ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ ΠΈΠ½Π΄Π΅ΠΊΡΠΎΠ² Π² ΡΠ»ΡΡΠ°Π΅ ΠΊΠ»Π°ΡΡΠ΅ΡΠΎΠ² ΠΏΠΎΡΠΎΠΊΠΎΠ²ΠΎΠΉ ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠΈ Π½ΡΠΆΠ½ΠΎ ΠΏΡΠΎΠ²Π΅ΡΡΡΡ Π²ΡΠ΅ ΡΠ·Π»Ρ ΠΊΠ»Π°ΡΡΠ΅ΡΠ°, Ρ.ΠΊ. ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠ° Π½Π΅ Π³Π»ΠΎΠ±Π°Π»ΡΠ½Π°Ρ, ΠΈ Π΅ΡΠ»ΠΈ ΠΈΠ½Π΄Π΅ΠΊΡ Π½Π΅ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π½Π° ΠΌΠ°ΡΡΠ΅ΡΠ΅, ΡΠΎ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π½Π° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°Ρ (Π΅ΡΠ»ΠΈ ΡΠ°ΠΌ Π΅ΡΡΡ Π½Π°Π³ΡΡΠ·ΠΊΠ°).
ΠΠ²Π΅ ΡΡΡΠ»ΠΊΠΈ:
ΠΡΠΎ Π±ΠΎΠ»Π΅Π΅ ΠΏΡΠΎΠ΄Π²ΠΈΠ½ΡΡΡΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΡ Π·Π°ΠΏΡΠΎΡΠΎΠ² Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΈΡΠΊΠ°ΡΡ Π½Π΅ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠ΅ ΠΈΠ½Π΄Π΅ΠΊΡΡ.
ΠΡΠΎΡΠ°Ρ ΡΡΡΠ»ΠΊΠ° β ΡΡΠΎ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΡΠΉ Π·Π°ΠΏΡΠΎΡ. Π’Π°ΠΌ ΠΎΡΠ΅Π½Ρ Π½Π΅ΡΡΠΈΠ²ΠΈΠ°Π»ΡΠ½Π°Ρ Π»ΠΎΠ³ΠΈΠΊΠ° Π·Π°Π»ΠΎΠΆΠ΅Π½Π°. Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΡ Π΅Π³ΠΎ Π΄Π»Ρ ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠ»Π΅Π½ΠΈΡ.
Π§ΡΠΎ Π΅ΡΠ΅ ΡΡΠΎΠΈΡ ΠΏΠΎΠ΄ΡΡΠΎΠΆΠΈΡΡ ΠΏΠΎ ΠΈΠ½Π΄Π΅ΠΊΡΠ°ΠΌ?
-
ΠΠ΅ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠ΅ ΠΈΠ½Π΄Π΅ΠΊΡΡ β ΡΡΠΎ ΠΏΠ»ΠΎΡ ΠΎ.
-
ΠΠ°Π½ΠΈΠΌΠ°ΡΡ ΠΌΠ΅ΡΡΠΎ.
-
ΠΠ°ΠΌΠ΅Π΄Π»ΡΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ.
-
ΠΠΈΡΠ½ΡΡ ΡΠ°Π±ΠΎΡΠ° Π΄Π»Ρ Π²Π°ΠΊΡΡΠΌΠ°.
ΠΡΠ»ΠΈ ΠΌΡ ΡΠ΄Π°Π»ΠΈΠΌ Π½Π΅ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠ΅ ΠΈΠ½Π΄Π΅ΠΊΡΡ, ΡΠΎ ΠΌΡ ΡΠ΄Π΅Π»Π°Π΅ΠΌ Π±Π°Π·Π΅ ΡΠΎΠ»ΡΠΊΠΎ Π»ΡΡΡΠ΅.
Π‘Π»Π΅Π΄ΡΡΡΠ΅Π΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ β ΡΡΠΎ pg_stat_activity
. ΠΡΠΎ Π°Π½Π°Π»ΠΎΠ³ ΡΡΠΈΠ»ΠΈΡΡ ps
, ΡΠΎΠ»ΡΠΊΠΎ Π² PostgreSQL. ΠΡΠ»ΠΈ ps
‘ΠΎΠΌ Π²Ρ ΡΠΌΠΎΡΡΠΈΡΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΡ Π² ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠ΅, ΡΠΎ pg_stat_activity
Π²Π°ΠΌ ΠΏΠΎΠΊΠ°ΠΆΠ΅Ρ Π°ΠΊΡΠΈΠ²Π½ΠΎΡΡΡ Π²Π½ΡΡΡΠΈ PostgreSQL.
Π§ΡΠΎ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΡΡΡΠ΄Π° ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠ³ΠΎ Π²Π·ΡΡΡ?
select
count(*)*100/(select current_setting('max_connections')::int)
from pg_stat_activity;
ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ ΠΎΠ±ΡΡΡ Π°ΠΊΡΠΈΠ²Π½ΠΎΡΡΡ, ΡΡΠΎ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ Π² Π±Π°Π·Π΅. ΠΠΎΠΆΠ΅ΠΌ ΡΠ΄Π΅Π»Π°ΡΡ Π½ΠΎΠ²ΡΠΉ Π΄Π΅ΠΏΠ»ΠΎΠΉ. Π£ Π½Π°Ρ ΡΠ°ΠΌ Π²ΡΠ΅ Π²Π·ΠΎΡΠ²Π°Π»ΠΎΡΡ, ΠΊΠΎΠ½Π½Π΅ΠΊΡΡ Π½ΠΎΠ²ΡΠ΅ Π½Π΅ ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡΡΡ, ΠΎΡΠΈΠ±ΠΊΠΈ ΡΡΠΏΠ»ΡΡΡΡ Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ.
select
client_addr, usename, datname, count(*)
from pg_stat_activity group by 1,2,3 order by 4 desc;
ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ Π²ΠΎΡ ΡΠ°ΠΊΠΎΠΉ Π·Π°ΠΏΡΠΎΡ ΠΈ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ ΠΎΠ±ΡΠΈΠΉ ΠΏΡΠΎΡΠ΅Π½Ρ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ³ΠΎ Π»ΠΈΠΌΠΈΡΠ° ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ ΠΈ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ, ΠΊΡΠΎ Ρ Π½Π°Ρ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ Π±ΠΎΠ»ΡΡΠ΅ Π²ΡΠ΅Π³ΠΎ ΠΊΠΎΠ½Π½Π΅ΠΊΡΠΎΠ². Π Π² Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΌΡ Π²ΠΈΠ΄ΠΈΠΌ, ΡΡΠΎ user cron_role
ΠΎΡΠΊΡΡΠ» 508 ΠΊΠΎΠ½Π½Π΅ΠΊΡΠΎΠ². Π ΡΡΠΎ-ΡΠΎ Ρ Π½ΠΈΠΌ ΡΠ°ΠΌ ΠΏΡΠΎΠΈΠ·ΠΎΡΠ»ΠΎ. ΠΡΠΆΠ½ΠΎ Ρ Π½ΠΈΠΌ ΡΠ°Π·Π±ΠΈΡΠ°ΡΡΡΡ ΠΈ ΡΠΌΠΎΡΡΠ΅ΡΡ. Π Π²ΠΏΠΎΠ»Π½Π΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΡΡΠΎ ΡΡΠΎ ΠΊΠ°ΠΊΠΎΠ΅-ΡΠΎ Π°Π½ΠΎΠΌΠ°Π»ΡΠ½ΠΎΠ΅ ΡΠΈΡΠ»ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ.
ΠΡΠ»ΠΈ Ρ Π½Π°Ρ Π½Π°Π³ΡΡΠ·ΠΊΠ° OLTP, Π·Π°ΠΏΡΠΎΡΡ Π΄ΠΎΠ»ΠΆΠ½Ρ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ Π±ΡΡΡΡΠΎ, ΠΎΡΠ΅Π½Ρ Π±ΡΡΡΡΠΎ ΠΈ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ Π΄ΠΎΠ»Π³ΠΈΡ Π·Π°ΠΏΡΠΎΡΠΎΠ². ΠΠ΄Π½Π°ΠΊΠΎ, Π΅ΡΠ»ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡΡ Π΄ΠΎΠ»Π³ΠΈΠ΅ Π·Π°ΠΏΡΠΎΡΡ, ΡΠΎ Π² ΠΊΡΠ°ΡΠΊΠΎΡΡΠΎΡΠ½ΠΎΠΉ ΠΏΠ΅ΡΡΠΏΠ΅ΠΊΡΠΈΠ²Π΅ Π½ΠΈΡΠ΅Π³ΠΎ ΡΡΡΠ°ΡΠ½ΠΎΠ³ΠΎ Π½Π΅Ρ, Π½ΠΎ Π² Π΄ΠΎΠ»Π³ΠΎΡΡΠΎΡΠ½ΠΎΠΉ ΠΏΠ΅ΡΡΠΏΠ΅ΠΊΡΠΈΠ²Π΅ Π΄ΠΎΠ»Π³ΠΈΠ΅ Π·Π°ΠΏΡΠΎΡΡ Π²ΡΠ΅Π΄ΡΡ Π±Π°Π·Π΅, ΠΎΠ½ΠΈ ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°ΡΡ bloat ΡΡΡΠ΅ΠΊΡ ΡΠ°Π±Π»ΠΈΡ, ΠΊΠΎΠ³Π΄Π° ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΡΡΠ°Π³ΠΌΠ΅Π½ΡΠ°ΡΠΈΡ ΡΠ°Π±Π»ΠΈΡ. Π ΠΎΡ bloat, ΠΈ ΠΎΡ Π΄ΠΎΠ»Π³ΠΈΡ Π·Π°ΠΏΡΠΎΡΠΎΠ² Π½ΡΠΆΠ½ΠΎ ΠΈΠ·Π±Π°Π²Π»ΡΡΡΡΡ.
select
client_addr, usename, datname,
clock_timestamp() - xact_start as xact_age,
clock_timestamp() - query_start as query_age,
query
from pg_stat_activity order by xact_start, query_start;
ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: Π²ΠΎΡ ΡΠ°ΠΊΠΈΠΌ Π·Π°ΠΏΡΠΎΡΠΎΠΌ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡ Π΄ΠΎΠ»Π³ΠΈΠ΅ Π·Π°ΠΏΡΠΎΡΡ ΠΈ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ. ΠΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ clock_timestamp()
Π΄Π»Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΡΠ°Π±ΠΎΡΡ. ΠΠΎΠ»Π³ΠΈΠ΅ Π·Π°ΠΏΡΠΎΡΡ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΡ Π½Π°ΡΠ»ΠΈ, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡ
Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡΡ, Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ explain
, ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ ΠΏΠ»Π°Π½Ρ ΠΈ ΠΊΠ°ΠΊ-ΡΠΎ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ. Π’Π΅ΠΊΡΡΠΈΠ΅ Π΄ΠΎΠ»Π³ΠΈΠ΅ Π·Π°ΠΏΡΠΎΡΡ ΠΌΡ ΠΎΡΡΡΡΠ΅Π»ΠΈΠ²Π°Π΅ΠΌ ΠΈ Π΄Π°Π»ΡΡΠ΅ ΠΆΠΈΠ²Π΅ΠΌ.
select * from pg_stat_activity where state in
('idle in transaction', 'idle in transaction (aborted)';
ΠΠ»ΠΎΡ ΠΈΠ΅ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ β ΡΡΠΎ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ Π² ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ idle in transaction ΠΈ idle in transaction (aborted).
Π§ΡΠΎ ΡΡΠΎ Π·Π½Π°ΡΠΈΡ? Π’ΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ ΠΈΠΌΠ΅ΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΉ. Π ΠΎΠ΄Π½ΠΎ ΠΈΠ· ΡΡΠΈΡ
ΡΠΎΡΡΠΎΡΠ½ΠΈΠΉ ΠΌΠΎΠ³ΡΡ ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ Π² Π»ΡΠ±ΠΎΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ. ΠΠ»Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΉ Π΅ΡΡΡ ΠΏΠΎΠ»Π΅ state
Π² ΡΡΠΎΠΌ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠΈ. Π ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ Π΅Π³ΠΎ Π΄Π»Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ.
select * from pg_stat_activity where state in
('idle in transaction', 'idle in transaction (aborted)';
Π, ΠΊΠ°ΠΊ Ρ ΡΠΆΠ΅ ΡΠΊΠ°Π·Π°Π» Π²ΡΡΠ΅, ΡΡΠΈ Π΄Π²Π° ΡΠΎΡΡΠΎΡΠ½ΠΈΡ idle in transaction ΠΈ idle in transaction (aborted) β ΡΡΠΎ ΠΏΠ»ΠΎΡ ΠΎ. Π§ΡΠΎ ΡΡΠΎ ΡΠ°ΠΊΠΎΠ΅? ΠΡΠΎ ΠΊΠΎΠ³Π΄Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΎΡΠΊΡΡΠ»ΠΎ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ, ΡΠ΄Π΅Π»Π°Π»ΠΎ ΠΊΠ°ΠΊΠΈΠ΅-ΡΠΎ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ ΠΈ ΡΡΠ»ΠΎ ΠΏΠΎ ΡΠ²ΠΎΠΈΠΌ Π΄Π΅Π»Π°ΠΌ. Π’ΡΠ°Π½Π·Π°ΠΊΡΠΈΡ ΠΎΡΡΠ°Π»Π°ΡΡ ΠΎΡΠΊΡΡΡΠ°Ρ. ΠΠ½Π° Π²ΠΈΡΠΈΡ, Π² Π½Π΅ΠΉ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ, ΠΎΠ½Π° Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ ΠΊΠΎΠ½Π½Π΅ΠΊΡ, Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ Π½Π° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½ΡΠ΅ ΡΡΡΠΎΠΊΠΈ ΠΈ ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π»ΡΠ½ΠΎ Π΅ΡΠ΅ ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°Π΅Ρ bloat Π΄ΡΡΠ³ΠΈΡ ΡΠ°Π±Π»ΠΈΡ, ΠΈΠ·-Π·Π° Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ Π΄Π²ΠΈΠΆΠΊΠ° Postrges’Π°. Π ΡΠ°ΠΊΠΈΠ΅ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ ΡΠΎΠΆΠ΅ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΎΡΡΡΡΠ΅Π»ΠΈΠ²Π°ΡΡ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΎΠ½ΠΈ Π²ΡΠ΅Π΄Π½ΡΠ΅ Π²ΠΎΠΎΠ±ΡΠ΅, ΠΏΡΠΈ Π»ΡΠ±ΠΎΠΌ ΡΠ°ΡΠΊΠ»Π°Π΄Π΅.
ΠΡΠ»ΠΈ Π²Ρ Π²ΠΈΠ΄ΠΈΡΠ΅, ΡΡΠΎ ΠΈΡ Ρ Π²Π°Ρ Π² Π±Π°Π·Π΅ Π±ΠΎΠ»ΡΡΠ΅ 5-10-20, ΡΠΎ Π½ΡΠΆΠ½ΠΎ ΡΠΆΠ΅ ΠΎΠ±Π΅ΡΠΏΠΎΠΊΠΎΠΈΡΡΡΡ ΠΈ Π½Π°ΡΠΈΠ½Π°ΡΡ Ρ Π½ΠΈΠΌΠΈ ΡΡΠΎ-ΡΠΎ Π΄Π΅Π»Π°ΡΡ.
ΠΠ΄Π΅ΡΡ ΠΌΡ ΡΠ°ΠΊΠΆΠ΅ Π΄Π»Ρ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ clock_timestamp()
. Π’ΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ ΠΎΡΡΡΡΠ΅Π»ΠΈΠ²Π°Π΅ΠΌ, ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΡΠ΅ΠΌ.
ΠΠ°ΠΊ Ρ ΡΠΆΠ΅ Π³ΠΎΠ²ΠΎΡΠΈΠ» Π²ΡΡΠ΅, Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ β ΡΡΠΎ ΠΊΠΎΠ³Π΄Π° Π΄Π²Π΅ ΠΈ Π±ΠΎΠ»ΡΡΠ΅ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ Π±ΠΎΡΡΡΡΡ Π·Π° ΠΎΠ΄ΠΈΠ½ ΠΈΠ»ΠΈ Π³ΡΡΠΏΠΏΡ ΡΠ΅ΡΡΡΡΠΎΠ². ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ Ρ Π½Π°Ρ Π΅ΡΡΡ ΠΏΠΎΠ»Π΅ waiting
Ρ Π±ΡΠ»Π΅Π²ΡΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ true
ΠΈΠ»ΠΈ false
.
True β ΡΡΠΎ Π·Π½Π°ΡΠΈΡ, ΡΡΠΎ ΠΏΡΠΎΡΠ΅ΡΡ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ Π² ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΈ, Π½ΡΠΆΠ½ΠΎ ΡΡΠΎ-ΡΠΎ Π΄Π΅Π»Π°ΡΡ. ΠΠΎΠ³Π΄Π° ΠΏΡΠΎΡΠ΅ΡΡ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ Π² ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΈ, Π·Π½Π°ΡΠΈΡ, ΠΊΠ»ΠΈΠ΅Π½Ρ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΈΠ½ΠΈΡΠΈΠΈΡΠΎΠ²Π°Π» ΡΡΠΎΡ ΠΏΡΠΎΡΠ΅ΡΡ ΡΠΎΠΆΠ΅ ΠΆΠ΄Π΅Ρ. ΠΠ»ΠΈΠ΅Π½Ρ Π² Π±ΡΠ°ΡΠ·Π΅ΡΠ΅ ΡΠΈΠ΄ΠΈΡ ΠΈ ΡΠΎΠΆΠ΅ ΠΆΠ΄Π΅Ρ.
ΠΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅: _ΠΠ°ΡΠΈΠ½Π°Ρ Ρ Π²Π΅ΡΡΠΈΠΈ Postgres 9.6 ΠΏΠΎΠ»Π΅ waiting
ΡΠ΄Π°Π»Π΅Π½ΠΎ ΠΈ Π²ΠΌΠ΅ΡΡΠΎ Π½Π΅Π³ΠΎ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ Π΄Π²Π° Π±ΠΎΠ»Π΅Π΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠ²Π½ΡΡ
ΠΏΠΎΠ»Ρ wait_event_type
ΠΈ wait_event
._
Π§ΡΠΎ Π΄Π΅Π»Π°ΡΡ? ΠΡΠ»ΠΈ Π²Ρ Π²ΠΈΠ΄ΠΈΡΠ΅ true, Π² ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π΄ΠΎΠ»Π³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΡΠΎ Π·Π½Π°ΡΠΈΡ, ΠΎΡ ΡΠ°ΠΊΠΈΡ Π·Π°ΠΏΡΠΎΡΠΎΠ² Π½Π°Π΄ΠΎ ΠΈΠ·Π±Π°Π²Π»ΡΡΡΡΡ. ΠΡ ΠΏΡΠΎΡΡΠΎ ΡΠ°ΠΊΠΈΠ΅ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ ΠΎΡΡΡΡΠ΅Π»ΠΈΠ²Π°Π΅ΠΌ. Π Π°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°ΠΌ ΠΏΠΈΡΠ΅ΠΌ, ΡΡΠΎ Π½ΡΠΆΠ½ΠΎ ΠΊΠ°ΠΊ-ΡΠΎ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ, ΡΡΠΎΠ±Ρ Π½Π΅ Π±ΡΠ»ΠΎ Π³ΠΎΠ½ΠΊΠΈ Π·Π° ΡΠ΅ΡΡΡΡΠ°ΠΌΠΈ. Π Π΄Π°Π»ΡΡΠ΅ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΡΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΡΡΠΎΠ±Ρ ΡΠ°ΠΊΠΎΠ³ΠΎ Π½Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π»ΠΎ.
Π ΠΊΡΠ°ΠΉΠ½ΠΈΠΉ, Π½ΠΎ ΠΏΡΠΈ ΡΡΠΎΠΌ ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π»ΡΠ½ΠΎ Π½Π΅ ΡΠ°ΡΠ°Π»ΡΠ½ΡΠΉ ΡΠ»ΡΡΠ°ΠΉ β ΡΡΠΎ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠ΅ deadlocks. ΠΠ²Π΅ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ ΠΎΠ±Π½ΠΎΠ²ΠΈΠ»ΠΈ Π΄Π²Π° ΡΠ΅ΡΡΡΡΠ°, ΠΏΠΎΡΠΎΠΌ ΠΎΠ±ΡΠ°ΡΠ°ΡΡΡΡ ΠΊ Π½ΠΈΠΌ ΡΠ½ΠΎΠ²Π°, ΡΠΆΠ΅ ΠΊ ΠΏΡΠΎΡΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½ΡΠΌ ΡΠ΅ΡΡΡΡΠ°ΠΌ. PostgreSQL Π² ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π±Π΅ΡΠ΅Ρ ΠΈ ΡΠ°ΠΌ ΠΎΡΡΡΡΠ΅Π»ΠΈΠ²Π°Π΅Ρ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ, ΡΡΠΎΠ±Ρ Π΄ΡΡΠ³Π°Ρ ΠΌΠΎΠ³Π»Π° ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠΈΡΡ ΡΠ°Π±ΠΎΡΡ. ΠΡΠΎ ΡΡΠΏΠΈΠΊΠΎΠ²Π°Ρ ΡΠΈΡΡΠ°ΡΠΈΡ ΠΈ ΠΎΠ½Π° ΡΠ°ΠΌΠ° Π½Π΅ ΡΠ°Π·Π±ΠΈΡΠ°Π΅ΡΡΡ. ΠΠΎΡΡΠΎΠΌΡ PostgreSQL Π²ΡΠ½ΡΠΆΠ΄Π΅Π½ ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ ΠΊΡΠ°ΠΉΠ½ΠΈΠ΅ ΠΌΠ΅ΡΡ.
Π Π²ΠΎΡ Π΄Π²Π° Π·Π°ΠΏΡΠΎΡΠ°, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°ΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ. ΠΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ pg_locks
, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°ΡΡ ΡΡΠΆΠ΅Π»ΠΎΠ²Π΅ΡΠ½ΡΠ΅ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ.
Π ΠΏΠ΅ΡΠ²Π°Ρ ΡΡΡΠ»ΠΊΠ° β ΡΡΠΎ ΡΠ°ΠΌ ΡΠ΅ΠΊΡΡ Π·Π°ΠΏΡΠΎΡΠ°. ΠΠ½ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ-ΡΠ°ΠΊΠΈ Π΄Π»ΠΈΠ½Π½ΡΠΉ.
Π Π²ΡΠΎΡΠ°Ρ ΡΡΡΠ»ΠΊΠ° β ΡΡΠΎ ΡΡΠ°ΡΡΡ ΠΏΠΎ locks. ΠΠ΅ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ ΠΏΠΎΡΠΈΡΠ°ΡΡ, ΠΎΠ½Π° ΠΎΡΠ΅Π½Ρ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½Π°Ρ.
ΠΡΠ°ΠΊ, ΡΡΠΎ ΠΌΡ Π²ΠΈΠ΄ΠΈΠΌ? ΠΡ Π²ΠΈΠ΄ΠΈΠΌ Π΄Π²Π° Π·Π°ΠΏΡΠΎΡΠ°. Π’ΡΠ°Π½Π·Π°ΠΊΡΠΈΡ Ρ ALTER TABLE
β ΡΡΠΎ Π±Π»ΠΎΠΊΠΈΡΡΡΡΠ°Ρ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ. ΠΠ½Π° Π·Π°ΠΏΡΡΡΠΈΠ»Π°ΡΡ, Π½ΠΎ Π½Π΅ Π·Π°Π²Π΅ΡΡΠΈΠ»Π°ΡΡ ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π°ΠΏΡΡΠΈΠ²ΡΠ΅Π΅ ΡΡΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ Π³Π΄Π΅-ΡΠΎ Π·Π°Π½ΠΈΠΌΠ°Π΅ΡΡΡ Π΄ΡΡΠ³ΠΈΠΌΠΈ Π΄Π΅Π»Π°ΠΌΠΈ. Π Π²ΡΠΎΡΠΎΠΉ Π·Π°ΠΏΡΠΎΡ β update. ΠΠ½ ΠΆΠ΄Π΅Ρ, ΠΊΠΎΠ³Π΄Π° Π·Π°ΠΊΠΎΠ½ΡΠΈΡΡΡ alter table, ΡΡΠΎΠ±Ρ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠΈΡΡ ΡΠ²ΠΎΡ ΡΠ°Π±ΠΎΡΡ.
ΠΠΎΡ ΡΠ°ΠΊ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ Π²ΡΡΡΠ½ΡΡΡ, ΠΊΡΠΎ ΠΊΠΎΠ³ΠΎ Π·Π°Π»ΠΎΡΠΈΠ», Π΄Π΅ΡΠΆΠΈΡ ΠΈ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ°Π·Π±ΠΈΡΠ°ΡΡΡΡ Ρ ΡΡΠΈΠΌ Π΄Π°Π»ΡΡΠ΅.
Π‘Π»Π΅Π΄ΡΡΡΠΈΠΉ ΠΌΠΎΠ΄ΡΠ»Ρ β ΡΡΠΎ pg_stat_statements
. ΠΠ°ΠΊ Ρ ΡΠΆΠ΅ ΡΠΊΠ°Π·Π°Π», ΡΡΠΎ ΠΌΠΎΠ΄ΡΠ»Ρ. Π§ΡΠΎΠ±Ρ ΠΈΠΌ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π½ΡΠΆΠ½ΠΎ ΠΏΠΎΠ΄Π³ΡΡΠ·ΠΈΡΡ Π΅Π³ΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ Π² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ, ΠΏΠ΅ΡΠ΅Π·Π°ΠΏΡΡΡΠΈΡΡ PostgreSQL, ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΠΌΠΎΠ΄ΡΠ»Ρ (ΠΎΠ΄Π½ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ) ΠΈ Π΄Π°Π»ΡΡΠ΅ Ρ Π½Π°Ρ ΠΏΠΎΡΠ²ΠΈΡΡΡ Π½ΠΎΠ²ΠΎΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅.
CΡΠ΅Π΄Π½Π΅Π΅ Π²ΡΠ΅ΠΌΡ Π·Π°ΠΏΡΠΎΡΠ° Π² ΠΌΠΈΠ»ΠΈΡΠ΅ΠΊΡΠ½Π΄Π°Ρ
$ select (sum(total_time) / sum(calls))::numeric(6,3)
from pg_stat_statements;
Π‘Π°ΠΌΡΠ΅ Π°ΠΊΡΠΈΠ²Π½ΠΎ ΠΏΠΈΡΡΡΠΈΠ΅ (Π² shared_buffers) Π·Π°ΠΏΡΠΎΡΡ
$ select query, shared_blks_dirtied
from pg_stat_statements
where shared_blks_dirtied > 0 order by 2 desc;
Π§ΡΠΎ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΡΡΡΠ΄Π° Π²Π·ΡΡΡ? ΠΡΠ»ΠΈ Π³ΠΎΠ²ΠΎΡΠΈΡΡ ΠΎ ΠΏΡΠΎΡΡΡΡ Π²Π΅ΡΠ°Ρ , ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ Π²Π·ΡΡΡ ΡΡΠ΅Π΄Π½Π΅Π΅ Π²ΡΠ΅ΠΌΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π·Π°ΠΏΡΠΎΡΠ°. ΠΡΠ΅ΠΌΡ ΡΠ°ΡΡΠ΅Ρ, Π·Π½Π°ΡΠΈΡ, Ρ Π½Π°Ρ PostgreSQL ΠΎΡΠ²Π΅ΡΠ°Π΅Ρ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ ΠΈ Π½ΡΠΆΠ½ΠΎ ΡΡΠΎ-ΡΠΎ ΠΏΡΠ΅Π΄ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ.
ΠΠΎΠΆΠ΅ΠΌ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ ΡΠ°ΠΌΡΠ΅ Π°ΠΊΡΠΈΠ²Π½ΡΠ΅ ΠΏΠΈΡΡΡΠΈΠ΅ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½ΡΡ , ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠ΅Π½ΡΡΡ Π΄Π°Π½Π½ΡΠ΅ Π² shared buffers. ΠΠΎΡΠΌΠΎΡΡΠ΅ΡΡ, ΠΊΡΠΎ Ρ Π½Π°Ρ ΡΠ°ΠΌ ΠΎΠ±Π½ΠΎΠ²Π»ΡΠ΅Ρ ΠΈΠ»ΠΈ ΡΠ΄Π°Π»ΡΠ΅Ρ Π΄Π°Π½Π½ΡΠ΅.
Π ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡΠΎΡΡΠΎ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ ΡΠ°Π·Π½ΡΡ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΡ ΠΏΠΎ ΡΡΠΈΠΌ Π·Π°ΠΏΡΠΎΡΠ°ΠΌ.
ΠΡ pg_stat_statements
ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ Π΄Π»Ρ ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΡ ΠΎΡΡΠ΅ΡΠΎΠ². Π Π°Π· Π² ΡΡΡΠΊΠΈ ΡΠ±ΡΠ°ΡΡΠ²Π°Π΅ΠΌ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΡ. ΠΠ°ΠΊΠ°ΠΏΠ»ΠΈΠ²Π°Π΅ΠΌ Π΅Π΅. ΠΠ΅ΡΠ΅Π΄ ΡΠ±ΡΠΎΡΠΎΠΌ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠΈ Π² ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΡΠ°Π·, ΡΡΡΠΎΠΈΠΌ ΠΎΡΡΠ΅Ρ. ΠΠΎΡ ΡΡΡΠ»ΠΊΠ° Π½Π° ΠΎΡΡΠ΅Ρ. ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΅Π³ΠΎ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ.
Π§ΡΠΎ ΠΌΡ Π΄Π΅Π»Π°Π΅ΠΌ? ΠΡ ΠΏΠΎΠ΄ΡΡΠΈΡΡΠ²Π°Π΅ΠΌ ΠΎΠ±ΡΡΡ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΡ ΠΏΠΎ Π²ΡΠ΅ΠΌ Π·Π°ΠΏΡΠΎΡΠ°ΠΌ. ΠΠ°ΡΠ΅ΠΌ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π·Π°ΠΏΡΠΎΡΠ° ΠΌΡ ΡΡΠΈΡΠ°Π΅ΠΌ Π΅Π³ΠΎ ΠΈΠ½Π΄ΠΈΠ²ΠΈΠ΄ΡΠ°Π»ΡΠ½ΡΠΉ Π²ΠΊΠ»Π°Π΄ Π² ΡΡΡ ΠΎΠ±ΡΡΡ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΡ.
Π ΡΡΠΎ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ? ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ ΡΡΠΌΠΌΠ°ΡΠ½ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π²ΡΠ΅Ρ Π·Π°ΠΏΡΠΎΡΠΎΠ² ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠ³ΠΎ ΡΠΈΠΏΠ° Π½Π° ΡΠΎΠ½Π΅ Π²ΡΠ΅Ρ ΠΎΡΡΠ°Π»ΡΠ½ΡΡ Π·Π°ΠΏΡΠΎΡΠΎΠ². ΠΠΎΠΆΠ΅ΠΌ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ΅ΡΡΡΡΠΎΠ² ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ° ΠΈ Π²Π²ΠΎΠ΄Π°-Π²ΡΠ²ΠΎΠ΄Π° ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΎΠ±ΡΠ΅ΠΉ ΠΊΠ°ΡΡΠΈΠ½Ρ. Π ΡΠΆΠ΅ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΡΡΠΈ Π·Π°ΠΏΡΠΎΡΡ. ΠΡ ΡΡΡΠΎΠΈΠΌ ΡΠΎΠΏ Π·Π°ΠΏΡΠΎΡΠΎΠ² ΠΏΠΎ ΡΡΠΎΠΌΡ ΠΎΡΡΠ΅ΡΡ ΠΈ ΡΠΆΠ΅ ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ ΠΏΠΈΡΡ Π΄Π»Ρ ΡΠ°Π·ΠΌΡΡΠ»Π΅Π½ΠΈΡ, ΡΡΠΎ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ.
Π§ΡΠΎ Ρ Π½Π°Ρ ΠΎΡΡΠ°Π»ΠΎΡΡ Π·Π° ΠΊΠ°Π΄ΡΠΎΠΌ? ΠΡΡΠ°Π»ΠΎΡΡ Π΅ΡΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ Ρ Π½Π΅ ΡΡΠ°Π» ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Π²ΡΠ΅ΠΌΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΎ.
ΠΡΡΡ pgstattuple
β ΡΡΠΎ ΡΠΎΠΆΠ΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠΉ ΠΌΠΎΠ΄ΡΠ»Ρ ΠΈΠ· ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠ³ΠΎ ΠΏΠ°ΠΊΠ΅ΡΠ° contribs. ΠΠ½ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΎΡΠ΅Π½ΠΈΡΡ bloat
ΡΠ°Π±Π»ΠΈΡΡ, Ρ.Π½. ΡΡΠ°Π³ΠΌΠ΅Π½ΡΠ°ΡΠΈΡ ΡΠ°Π±Π»ΠΈΡΡ. Π Π΅ΡΠ»ΠΈ ΡΡΠ°Π³ΠΌΠ΅Π½ΡΠ°ΡΠΈΡ Π±ΠΎΠ»ΡΡΠ°Ρ, Π½ΡΠΆΠ½ΠΎ Π΅Π΅ ΡΠ±ΠΈΡΠ°ΡΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ°Π·Π½ΡΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ. Π ΡΡΠ½ΠΊΡΠΈΡ pgstattuple
ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π΄ΠΎΠ»Π³ΠΎ. Π ΡΠ΅ΠΌ Π±ΠΎΠ»ΡΡΠ΅ ΡΠ°Π±Π»ΠΈΡ, ΡΠ΅ΠΌ Π΄ΠΎΠ»ΡΡΠ΅ ΠΎΠ½Π° Π±ΡΠ΄Π΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ.
Π‘Π»Π΅Π΄ΡΡΡΠΈΠΉ contrib β ΡΡΠΎ pg_buffercache
. ΠΠ½ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΡΠΎΠ²ΠΎΠ΄ΠΈΡΡ ΠΈΠ½ΡΠΏΠ΅ΠΊΡΠΈΡ shared buffers: Π½Π°ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΈΠ½ΡΠ΅Π½ΡΠΈΠ²Π½ΠΎ ΠΈ ΠΏΠΎΠ΄ ΠΊΠ°ΠΊΠΈΠ΅ ΡΠ°Π±Π»ΠΈΡΡ ΡΡΠΈΠ»ΠΈΠ·ΠΈΡΡΡΡΡΡ ΡΡΡΠ°Π½ΠΈΡΡ Π±ΡΡΠ΅ΡΠ°. Π ΠΏΡΠΎΡΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π·Π°Π³Π»ΡΠ½ΡΡΡ Π² shared buffers ΠΈ ΠΎΡΠ΅Π½ΠΈΡΡ ΠΏΡΠΎΠΈΡΡ
ΠΎΠ΄ΡΡΠ΅Π΅ ΡΠ°ΠΌ.
Π‘Π»Π΅Π΄ΡΡΡΠΈΠΉ ΠΌΠΎΠ΄ΡΠ»Ρ β ΡΡΠΎ pgfincore
. ΠΠ½ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΡΠΎΠ²ΠΎΠ΄ΠΈΡΡ Π½ΠΈΠ·ΠΊΠΎΡΡΠΎΠ²Π½Π΅Π²ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Ρ ΡΠ°Π±Π»ΠΈΡΠ°ΠΌΠΈ ΡΠ΅ΡΠ΅Π· ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠΉ Π²ΡΠ·ΠΎΠ² mincore()
, Ρ. Π΅. ΠΎΠ½ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π·Π°Π³ΡΡΠ·ΠΈΡΡ ΡΠ°Π±Π»ΠΈΡΡ Π² ΡΠ°ΡΠ΅Π΄Π½ΡΠ΅ Π±ΡΡΠ΅ΡΠ°, Π»ΠΈΠ±ΠΎ Π΅Π΅ Π²ΡΠ³ΡΡΠ·ΠΈΡΡ. Π ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΠΎΠΌΠΈΠΌΠΎ ΠΏΡΠΎΡΠ΅Π³ΠΎ ΠΏΡΠΎΠ²ΠΎΠ΄ΠΈΡΡ ΠΈΠ½ΡΠΏΠ΅ΠΊΡΠΈΡ ΡΡΡΠ°Π½ΠΈΡΠ½ΠΎΠ³ΠΎ ΠΊΡΡΠ° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΡ, Ρ. Π΅. Π² ΠΊΠ°ΠΊΠΎΠΌ ΠΎΠ±ΡΠ΅ΠΌΠ΅ Ρ Π½Π°Ρ ΡΠ°Π±Π»ΠΈΡΠ° Π·Π°Π½ΠΈΠΌΠ°Π΅ΠΌ Π² page cache, Π² shared buffers ΠΈ ΠΏΡΠΎΡΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΎΡΠ΅Π½ΠΈΡΡ Π·Π°Π³ΡΡΠΆΠ΅Π½Π½ΠΎΡΡΡ ΡΠ°Π±Π»ΠΈΡΡ.
Π‘Π»Π΅Π΄ΡΡΡΠΈΠΉ ΠΌΠΎΠ΄ΡΠ»Ρ β pg_stat_kcache
. ΠΠ½ ΡΠ°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠΉ Π²ΡΠ·ΠΎΠ² getrusage()
. Π Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ Π΅Π³ΠΎ ΠΏΠ΅ΡΠ΅Π΄ ΠΈ ΠΏΠΎΡΠ»Π΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π·Π°ΠΏΡΠΎΡΠ°. Π Π² ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΠΎΠΉ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠ΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΎΡΠ΅Π½ΠΈΡΡ, ΡΠΊΠΎΠ»ΡΠΊΠΎ Ρ Π½Π°Ρ Π·Π°ΠΏΡΠΎΡ Π·Π°ΡΡΠ°ΡΠΈΠ» Π½Π° Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π΄ΠΈΡΠΊΠΎΠ²ΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π°-Π²ΡΠ²ΠΎΠ΄Π°, Ρ. Π΅. ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Ρ ΡΠ°ΠΉΠ»ΠΎΠ²ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠΎΠΉ ΠΈ ΡΠΌΠΎΡΡΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ°. ΠΠ΄Π½Π°ΠΊΠΎ ΠΌΠΎΠ΄ΡΠ»Ρ ΠΌΠΎΠ»ΠΎΠ΄ΠΎΠΉ (ΠΊΡ
Π΅-ΠΊΡ
Π΅) ΠΈ Π΄Π»Ρ ΡΠ²ΠΎΠ΅ΠΉ ΡΠ°Π±ΠΎΡΡ ΠΎΠ½ ΡΡΠ΅Π±ΡΠ΅Ρ PostgreSQL 9.4 ΠΈ pg_stat_statements, ΠΎ ΠΊΠΎΡΠΎΡΠΎΠΌ Ρ Π³ΠΎΠ²ΠΎΡΠΈΠ» ΡΠ°Π½Π΅Π΅.
-
Π£ΠΌΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠΎΠΉ β ΠΏΠΎΠ»Π΅Π·Π½ΠΎ. ΠΠ°ΠΌ Π½Π΅ Π½ΡΠΆΠ½Ρ ΡΡΠΎΡΠΎΠ½Π½ΠΈΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ. ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ°ΠΌΠΈ Π·Π°Π³Π»ΡΠ½ΡΡΡ, ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ, ΡΡΠΎ-ΡΠΎ ΡΠ΄Π΅Π»Π°ΡΡ, Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ.
-
ΠΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠΎΠΉ Π½Π΅ΡΠ»ΠΎΠΆΠ½ΠΎ, ΡΡΠΎ ΠΎΠ±ΡΡΠ½ΡΠΉ SQL. ΠΡ ΡΠΎΠ±ΡΠ°Π»ΠΈ Π·Π°ΠΏΡΠΎΡ, ΡΠΎΡΡΠ°Π²ΠΈΠ»ΠΈ, ΠΎΡΠΏΡΠ°Π²ΠΈΠ»ΠΈ, ΠΏΠΎΡΠΌΠΎΡΡΠ΅Π»ΠΈ.
-
Π‘ΡΠ°ΡΠΈΡΡΠΈΠΊΠ° ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ ΠΎΡΠ²Π΅ΡΠΈΡΡ Π½Π° Π²ΠΎΠΏΡΠΎΡΡ. ΠΡΠ»ΠΈ Ρ Π²Π°Ρ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡΡ Π²ΠΎΠΏΡΠΎΡΡ, Π²Ρ ΠΎΠ±ΡΠ°ΡΠ°Π΅ΡΠ΅ΡΡ ΠΊ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠ΅ β ΡΠΌΠΎΡΡΠΈΡΠ΅, Π΄Π΅Π»Π°Π΅ΡΠ΅ Π²ΡΠ²ΠΎΠ΄Ρ, Π°Π½Π°Π»ΠΈΠ·ΠΈΡΡΠ΅ΡΠ΅ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ.
-
Π ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΈΡΡΠΉΡΠ΅. ΠΠ°ΠΏΡΠΎΡΠΎΠ² ΠΌΠ½ΠΎΠ³ΠΎ, Π΄Π°Π½Π½ΡΡ ΠΌΠ½ΠΎΠ³ΠΎ. ΠΡΠ΅Π³Π΄Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠ°ΠΊΠΎΠΉ-ΡΠΎ ΡΠΆΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΠΉ Π·Π°ΠΏΡΠΎΡ. ΠΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ ΡΠ²ΠΎΡ Π²Π΅ΡΡΠΈΡ Π·Π°ΠΏΡΠΎΡΠ°, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΈΡ Π²Π°ΠΌ Π±ΠΎΠ»ΡΡΠ΅, ΡΠ΅ΠΌ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π» ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΅Π³ΠΎ.
Π‘ΡΡΠ»ΠΊΠΈ
ΠΠΎΠ΄Π½ΡΠ΅ ΡΡΡΠ»ΠΊΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ Π²ΡΡΡΠ΅ΡΠ°Π»ΠΈΡΡ Π² ΡΡΠ°ΡΡΠ΅, ΠΏΠΎ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»Π°ΠΌ ΠΊΠΎΡΠΎΡΠΎΠΉ, Π±ΡΠ»ΠΈ Π² Π΄ΠΎΠΊΠ»Π°Π΄Π΅.
ΠΠ²ΡΠΎΡ ΠΏΠΈΡΠΈ Π΅ΡΡ
The Statistics Collector
System Administration Functions
Contrib modules
SQL utils and sql code examples
ΠΡΠ΅ΠΌ ΡΠΏΠ°ΡΠΈΠ±ΠΎ Π·Π° Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅!
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com