ืคืึธืจืฉื˜ืขืœื•ื ื’ ืžืึธื ื™ื˜ืึธืจื™ื ื’ ืคื•ืŸ PostgreSQL ืคึฟืจืื’ืŸ. ื˜ื™ื™ืœ 1 - ืจื™ืคึผืึธืจื˜ื™ื ื’

ื™ื ื–ืฉืขื ื™ืจ - ืื™ื‘ืขืจื’ืขื–ืขืฆื˜ ืคึฟื•ืŸ ืœืึทื˜ื™ื™ึทืŸ - ื™ื ืกืคึผื™ื™ืขืจื“.
ืึท ื™ื ื–ืฉืขื ื™ืจ ืงืขื ืขืŸ ื˜ืึธืŸ ืึทืœืฅ. (ื’) ืจ' ื“ื™ื–ืœ.
ืขืคึผื™ื’ืจืึทืคืก.
ืคืึธืจืฉื˜ืขืœื•ื ื’ ืžืึธื ื™ื˜ืึธืจื™ื ื’ ืคื•ืŸ PostgreSQL ืคึฟืจืื’ืŸ. ื˜ื™ื™ืœ 1 - ืจื™ืคึผืึธืจื˜ื™ื ื’
ืึธื“ืขืจ ืึท ื“ืขืจืฆื™ื™ืœื•ื ื’ ื•ื•ืขื’ืŸ ื•ื•ืึธืก ืึท ื“ืึทื˜ืึทื‘ื™ื™ืก ืึทื“ืžื™ื ื™ืกื˜ืจืึทื˜ืึธืจ ื“ืึทืจืฃ ื’ืขื“ืขื ืงืขืŸ ื–ื™ื™ืŸ ืคึผืจืึธื’ืจืึทืžืžื™ื ื’ ืคืึทืจื’ืึทื ื’ืขื ื”ื™ื™ื˜.

ื”ืึทื’ื“ืึธืžืข

ืึทืœืข ื ืขืžืขืŸ ื–ืขื ืขืŸ ื’ืขื‘ื™ื˜ืŸ. ื“ื™ ืฆื•ืคืึทืœืŸ ื–ืขื ืขืŸ ื˜ืจืึทืค. ื“ืขืจ ืžืึทื˜ืขืจื™ืึทืœ ืจืขืคึผืจืึทื–ืขื ืฅ ื‘ืœื•ื™ื– ื“ื™ ืคึผืขืจื–ืขื ืœืขืš ืžื™ื™ื ื•ื ื’ ืคื•ืŸ ื“ืขื ืžื—ื‘ืจ.

ืึธืคึผืœื™ื™ืงืขื ื•ื ื’ ืคื•ืŸ ื•ื•ืึธืจืึทื ื˜ื™ื–: ื“ื™ ืคึผืœืึทื ื ืขื“ ืกืขืจื™ืข ืคื•ืŸ โ€‹โ€‹ืึทืจื˜ื™ืงืœืขืŸ ื•ื•ืขื˜ ื ื™ืฉื˜ ืึทื ื˜ื”ืึทืœื˜ืŸ ืึท ื“ื™ื˜ื™ื™ืœื“ ืื•ืŸ ืคึผื™ื ื˜ืœืขืš ื‘ืึทืฉืจื™ื™ึทื‘ื•ื ื’ ืคื•ืŸ ื“ื™ ื˜ื™ืฉืŸ ืื•ืŸ ืกืงืจื™ืคึผืก ื’ืขื ื™ืฆื˜. ื“ื™ ืžืึทื˜ืขืจื™ืึทืœืก ืงืขื ืขืŸ ื ื™ื˜ ื–ื™ื™ืŸ ื’ืขื•ื•ื™ื™ื ื˜ ืžื™ื“ "ื•ื•ื™ ืื™ื–".
ืขืจืฉื˜ืขืจ, ืจืขื›ื˜ ืฆื• ื“ืขืจ ื’ืจื•ื™ืก ื‘ืึทื ื“ ืคื•ืŸ ืžืึทื˜ืขืจื™ืึทืœ,
ืฆื•ื•ื™ื™ื˜ื ืก, ืจืขื›ื˜ ืฆื• ื“ืขืจ ื ืึธืขื ื˜ ืฉื™ื™ื›ื•ืช ืžื™ื˜ ื“ื™ ืคึผืจืึธื“ื•ืงืฆื™ืข ื‘ืึทื–ืข ืคื•ืŸ โ€‹โ€‹ืึท ืคืึทืงื˜ื™ืฉ ืงื•ื ื”.
ื“ืขืจื™ื‘ืข ืจ ืฐืขืœ ืŸ ื“ ื™ ืืจื˜ื™ืงืœืข ืŸ ืื ื˜ื”ืืœื˜ ืŸ ื ื ืจ ืื™ื“ืขืข ืŸ ืื• ืŸ ื‘ืืฉืจืฒื‘ื•ื ื’ืขืŸ , ืื™ ืŸ ื“ืข ืจ ืืœื’ืขืžืฒื ืข ืจ ืคืืจื .
ืืคึฟืฉืจ ืื™ืŸ ื“ืขืจ ืฆื•ืงื•ื ืคึฟื˜ ื“ื™ ืกื™ืกื˜ืขื ื•ื•ืขื˜ ื•ื•ืึทืงืกืŸ ืฆื• ื“ืขืจ ืžื“ืจื’ื” ืคื•ืŸ ืคึผืึธืกื˜ืขื“ ืื•ื™ืฃ GitHub, ืึธื“ืขืจ ืืคึฟืฉืจ ื ื™ืฉื˜. ืฆื™ื™ื˜ ื•ื•ืขื˜ ื•ื•ื™ื™ึทื–ืŸ.

ื“ืขืจ ืึธื ื”ื™ื™ื‘ ืคื•ืŸ ื“ืขืจ ื’ืขืฉื™ื›ื˜ืข - "ืฆื™ ืื™ืจ ื’ืขื“ืขื ืงืขืŸ ื•ื•ื™ ืขืก ืึทืœืข ืื ื’ืขื”ื•ื™ื‘ืŸ'.
ื•ื•ืึธืก ื’ืขื˜ืจืืคืŸ ื•ื•ื™ ืึท ืจืขื–ื•ืœื˜ืึทื˜, ืื™ืŸ ื“ื™ ืžืขืจืกื˜ ืึทืœื’ืขืžื™ื™ืŸ ื˜ืขืจืžื™ื ืขืŸ - "ืกื™ื ื˜ืขื– ื•ื•ื™ ืื™ื™ื ืขืจ ืคื•ืŸ ื“ื™ ืžืขื˜ื”ืึธื“ืก ืคึฟืึทืจ ื™ืžืคึผืจื•ื•ื•ื™ื ื’ PostgreSQL ืคืึธืจืฉื˜ืขืœื•ื ื’ยป

ืคืืจื•ื•ืืก ื“ืืจืฃ ืื™ืš ื“ืืก ืืœืขืก?

ื ื• , ืขืจืฉื˜ื ืก , ื›ื“ ื™ ื ื™ืฉ ื˜ ืคืืจื’ืขืกืŸ , ื’ืขื“ืขื ืงืข ืŸ ื“ ื™ ื”ืขืจืœืขื› ืข ื˜ืข ื’ ืื™ ืŸ ื“ืข ืจ ืฑื’ื ื˜ .
ืฆื•ื•ื™ื™ื˜ื ืก, ืฆื• ืกื™ืกื˜ืขืžืื˜ื™ื–ื™ืจืŸ ื•ื•ืืก ืžืขืŸ ื”ืื˜ ื’ืขืฉืจื™ื‘ืŸ. ื•ื•ื™ื™ืœ ืื™ืš ื‘ื™ืŸ ืืžืืœ ืื ื”ื™ื™ื‘ืŸ ืฆื• ืฆืขืžื™ืฉื˜ ืื•ืŸ ืคืืจื’ืขืกืŸ ื’ืขื•ื•ื™ืกืข ื˜ื™ื™ืœืŸ.

ื ื•, ืื•ืŸ ื“ื™ ืžืขืจืกื˜ ื•ื•ื™ื›ื˜ื™ืง ื–ืึทืš ืื™ื– ืึทื– ืขืก ืงืขืŸ ืงื•ืžืขืŸ ืื™ืŸ ื”ืึทื ื˜ื™ืง ืคึฟืึทืจ ืขืžืขืฆืขืจ ืื•ืŸ ื”ืขืœืคืŸ ื–ื™ื™ ื•ื™ืกืžื™ื™ื“ืŸ ืจื™ื™ื ื•ื•ืขื ื˜ื™ื ื’ ื“ื™ ืจืึธื“ ืื•ืŸ ื ื™ืฉื˜ ืงืึทืœืขืงื˜ื™ื ื’ ืึท ื’ืจืึทื‘ืœื™ืข. ืื™ืŸ ืื ื“ืขืจืข ื•ื•ืขืจื˜ืขืจ, ืคึฟืึทืจื‘ืขืกืขืจืŸ ื“ื™ื™ืŸ ืงืึทืจืžืึท (ื ื™ืฉื˜ ื›ืึทื‘ืจืึธื•ื• ืก). ื•ื•ื™ื™ึทืœ ื“ื™ ืžืขืจืกื˜ ื•ื•ืขืจื˜ืคื•ืœ ื–ืึทืš ืื™ืŸ ื“ืขืจ ื•ื•ืขืœื˜ ืื™ื– ื’ืขื“ืื ืงืขืŸ. ื“ื™ ื”ื•ื™ืคึผื˜ ื–ืึทืš ืื™ื– ืฆื• ื’ืขืคึฟื™ื ืขืŸ ืึท ื’ืขื“ืึทื ืง. ืึธื‘ืขืจ ืฆื• ืคืึทืจื•ื•ืึทื ื“ืœืขืŸ ืึท ื’ืขื“ืึทื ืง ืื™ืŸ ืคืึทืงื˜ ืื™ื– ืึท ืจื™ื™ืŸ ื˜ืขื›ื ื™ืฉ ืงืฉื™ื.

ืึทื–ื•ื™, ืœืึธืžื™ืจ ืึธื ื”ื™ื™ื‘ืŸ, ื‘ื™ืกืœืขื›ื•ื•ื™ื™ึทื– ...

ืคืึธืจืžื•ืœืึทื˜ื™ืึธืŸ ืคื•ืŸ ื“ื™ ืคึผืจืึธื‘ืœืขื.

ื‘ื ื™ืžืฆื:

PostgreSQL (10.5) ื“ืึทื˜ืึทื‘ื™ื™ืก, ื’ืขืžื™ืฉื˜ ืžืึทืกืข ื˜ื™ืคึผ (OLTP + DSS), ืžื™ื˜ืœ-ืœื™ื›ื˜ ืžืึทืกืข, ืœื™ื’ืŸ ืื™ืŸ ื“ื™ AWS ื•ื•ืึธืœืงืŸ.
ืขืก ืื™ื– ืงื™ื™ืŸ ื“ืึทื˜ืึทื‘ื™ื™ืก ืžืึธื ื™ื˜ืึธืจื™ื ื’; ื™ื ืคืจืึทืกื˜ืจืึทืงื˜ืฉืขืจ ืžืึธื ื™ื˜ืึธืจื™ื ื’ ืื™ื– ืฆื•ื’ืขืฉื˜ืขืœื˜ ืื™ืŸ ื“ื™ ืคืึธืจืขื ืคื•ืŸ ื ืึธืจืžืึทืœ AWS ืžื›ืฉื™ืจื™ื ืื™ืŸ ืึท ืžื™ื ื™ืžืึทืœ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ.

ืขืก ืื™ื– ืคืืจืœืื ื’ื˜:

ืžืึธื ื™ื˜ืึธืจ ื“ื™ ืคืึธืจืฉื˜ืขืœื•ื ื’ ืื•ืŸ ืกื˜ืึทื˜ื•ืก ืคื•ืŸ ื“ื™ ื“ืึทื˜ืึทื‘ื™ื™ืก, ื’ืขืคึฟื™ื ืขืŸ ืื•ืŸ ื”ืึธื‘ืŸ ืขืจืฉื˜ ืื™ื ืคึฟืึธืจืžืึทืฆื™ืข ืคึฟืึทืจ ืึธืคึผื˜ื™ืžื™ื–ื™ื ื’ ืฉื•ื•ืขืจ ื“ืึทื˜ืึทื‘ื™ื™ืก ืคึฟืจืื’ืŸ.

ืงื•ืจืฅ ื”ืงื“ืžื” ืึธื“ืขืจ ืึทื ืึทืœื™ืกื™ืก ืคื•ืŸ ืœื™ื™ื–ื•ื ื’ ืึธืคึผืฆื™ืขืก

ืฆื• ืึธื ื”ื™ื™ื‘ืŸ ืžื™ื˜, ืœืึธืžื™ืจ ืคึผืจื•ื‘ื™ืจืŸ ืฆื• ืึทื ืึทืœื™ื™ื– ื“ื™ ืึธืคึผืฆื™ืขืก ืคึฟืึทืจ ืกืึธืœื•ื•ืข ื“ืขื ืคึผืจืึธื‘ืœืขื ืคึฟื•ืŸ ื“ื™ ืคื•ื ื˜ ืคื•ืŸ ืžื™ื™ื ื•ื ื’ ืคื•ืŸ ืึท ืงืึธืžืคึผืึทืจืึทื˜ื™ื•ื•ืข ืึทื ืึทืœื™ืกื™ืก ืคื•ืŸ ื“ื™ ื‘ืขื ืขืคื™ืฅ ืื•ืŸ ื“ื™ืกืึทื“ื•ื•ืึทื ื˜ื™ื“ื–ืฉื™ื– ืคึฟืึทืจ ื“ื™ ื™ื ื–ืฉืขื ื™ืจ, ืื•ืŸ ืœืึธื–ืŸ ื“ื™ ื•ื•ืึธืก ื–ืขื ืขืŸ ืขื ื˜ื™ื™ื˜ืึทืœื“ ืฆื• ืขืก ืœื•ื™ื˜ ื“ื™ ืกื˜ืึทืคืคื™ื ื’ ืคึผืœืึทืŸ, ื”ืึทื ื“ืœืขืŸ ืžื™ื˜ ื“ื™ ื‘ืขื ืขืคื™ืฅ ืื•ืŸ ืœืึธืกืกืขืก ืคื•ืŸ ืคืึทืจื•ื•ืึทืœื˜ื•ื ื’.

ืึธืคึผืฆื™ืข 1 - "ืืจื‘ืขื˜ืŸ ืื•ื™ืฃ ืคืึธื“ืขืจื•ื ื’"

ืžื™ืจ ืœืึธื–ืŸ ืึทืœืฅ ื•ื•ื™ ืขืก ืื™ื–. ืื•ื™ื‘ ื“ืขืจ ืงื•ื ื” ืื™ื– ื ื™ืฉื˜ ืฆื•ืคึฟืจื™ื“ืŸ ืžื™ื˜ ืขืคึผืขืก ืื™ืŸ ื“ื™ ืคืึทื ื’ืงืฉืึทื ืึทืœื™ื˜ื™, ืคืึธืจืฉื˜ืขืœื•ื ื’ ืคื•ืŸ ื“ื™ ื“ืึทื˜ืึทื‘ื™ื™ืก ืึธื“ืขืจ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ, ืขืจ ื•ื•ืขื˜ ื’ืขื‘ื  ืฆื• ื•ื•ื™ืกืŸ ื“ื™ ื“ื‘ืึท ืขื ื“ื–ืฉืึทื ื™ืจื– ื“ื•ืจืš E- ืคึผืึธืกื˜ ืึธื“ืขืจ ื“ื•ืจืš ืฉืึทืคึฟืŸ ืึทืŸ ืื™ื ืฆื™ื“ืขื ื˜ ืื™ืŸ ื“ื™ ื‘ื™ืœืขื˜ ื˜ืึทืฅ.
ื“ืขืจ ื™ื ื–ืฉืขื ื™ืจ, ื ืึธืš ื‘ืืงื•ืžืขืŸ ื“ื™ ืึธื ื–ืึธื’, ื•ื•ืขื˜ ืคึฟืึทืจืฉื˜ื™ื™ืŸ ื“ืขื ืคึผืจืึธื‘ืœืขื, ืคืึธืจืฉืœืึธื’ืŸ ืึท ืœื™ื™ื–ื•ื ื’ ืึธื“ืขืจ ืฉื˜ืขืœืŸ ื“ืขื ืคึผืจืึธื‘ืœืขื ืื•ื™ืฃ ื“ื™ ืฆื•ืจื™ืง ื‘ื•ืจื ืขืจ, ื›ืึธื•ืคึผื™ื ื’ ืึทื– ืึทืœืฅ ื•ื•ืขื˜ ื‘ืึทืฉืœื™ืกืŸ ื–ื™ืš, ืื•ืŸ ืกื™ื™ึท ื•ื•ื™ ืกื™ื™ึท, ืึทืœืฅ ื•ื•ืขื˜ ื‘ืึทืœื“ ื•ื•ืขืจืŸ ืคืืจื’ืขืกืŸ.
ื’ื™ื ื’ืขืจื‘ืจืขืึทื“ ืื•ืŸ ื“ืึธื•ื ืึทืฅ, ื‘ืจื•ื–ืึทื– ืื•ืŸ ื‘ืึทืžืคึผืกื’ื™ื ื’ืขืจื‘ืจืขืึทื“ ืื•ืŸ ื“ืึธื•ื ืึทืฅ:
1. ืขืก ืื™ื– ื ื™ื˜ ื“ืึทืจืคึฟืŸ ืฆื• ื˜ืึธืŸ ืขืคึผืขืก ืขืงืกื˜ืจืข.
2. ืขืก ืื™ื– ืฉื˜ืขื ื“ื™ืง ื“ื™ ื’ืขืœืขื’ื ื”ื™ื™ื˜ ืฆื• ืžืึทื›ืŸ ื™ืงืกืงื™ื•ืกื™ื– ืื•ืŸ ืฉืจื•ื™ืฃ.
3. ื ืคึผืœืึทืฅ ืคื•ืŸ ืฆื™ื™ึทื˜ ืึทื– ืื™ืจ ืงืขื ืขืŸ ืคืึทืจื‘ืจืขื ื’ืขืŸ ืื™ืŸ ื“ื™ื™ืŸ ืื™ื™ื’ืŸ ื“ื™ืกืงืจืขืฉืึทืŸ.
ื‘ืจื•ื–ืึทื– ืื•ืŸ ื‘ืึทืžืคึผืก:
1. ื’ื™ื›ืขืจ ืึธื“ืขืจ ืฉืคึผืขื˜ืขืจ, ื“ืขืจ ืงื•ื ื” ื•ื•ืขื˜ ื˜ืจืึทื›ื˜ืŸ ื•ื•ืขื’ืŸ ื“ื™ ืขืกืึทื ืก ืคื•ืŸ ืขืงื–ื™ืกื˜ืขื ืฅ ืื•ืŸ ื•ื ื™ื•ื•ืขืจืกืึทืœ ื™ื•ืฉืจ ืื™ืŸ ื“ืขื ื•ื•ืขืœื˜ ืื•ืŸ ืึทืžืึธืœ ื•ื•ื™ื“ืขืจ ืคืจืขื’ืŸ ื–ื™ืš ื“ื™ ืงืฉื™ื - ื•ื•ืึธืก ื˜ืึธืŸ ืื™ืš ื‘ืึทืฆืึธืœืŸ ื–ื™ื™ ืžื™ื™ืŸ ื’ืขืœื˜? ื“ื™ ืงืึทื ืกืึทืงื•ื•ืึทื ืก ืื™ื– ืฉื˜ืขื ื“ื™ืง ื“ื™ ื–ืขืœื‘ืข - ื“ื™ ื‘ืœื•ื™ื– ืงืฉื™ื ืื™ื– ื•ื•ืขืŸ ื“ืขืจ ืงื•ื ื” ื•ื•ืขื˜ ื‘ืึทืงื•ืžืขืŸ ื‘ืึธืจื“ ืื•ืŸ ื›ื•ื•ืึทืœื™ืข ื–ื™ื™ึท ื’ืขื–ื•ื ื˜. ืื•ืŸ ื“ืขืจ ืคื™ื“ืขืจ ื•ื•ืขื˜ ื–ื™ื™ืŸ ืœื™ื™ื“ื™ืง. ืขืก ืื™ื– ื˜ืจื•ื™ืขืจื™ืง.
2. ื™ื ื–ืฉืขื ื™ืจ ืึทื ื˜ื•ื•ื™ืงืœื•ื ื’ - ื ื•ืœ.
3. ืฉื•ื•ืขืจื™ืงื™ื™ื˜ืŸ ืื™ืŸ ืคึผืœืึทื ื™ืจื•ื ื’ ืึทืจื‘ืขื˜ ืื•ืŸ ืœืึธื•ื“ื™ื ื’

ืึธืคึผืฆื™ืข 2- "ื“ืึทื ืกื™ื ื’ ืžื™ื˜ ื˜ืึทืžื‘ื•ืจื™ื ื–, ืกื˜ื™ืžื™ื ื’ ืื•ืŸ ืึธื ื˜ืึธืŸ ืฉื™ื›ืœืขืš"

ืคึผืึทืจืึทื’ืจืึทืฃ ืงืกื ื•ืžืงืก- ื•ื•ืึธืก ื˜ืึธืŸ ืžื™ืจ ื“ืึทืจืคึฟืŸ ืึท ืžืึธื ื™ื˜ืึธืจื™ื ื’ ืกื™ืกื˜ืขื, ืžื™ืจ ื•ื•ืขืœืŸ ื‘ืึทืงื•ืžืขืŸ ืึทืœืฅ ืžื™ื˜ ืจื™ืงื•ื•ืขืก. ืžื™ืจ ืคื™ืจืŸ ืึท ืคึผืœืึทืฅ ืคื•ืŸ ืึทืœืข ืกืึธืจืฅ ืคื•ืŸ ืคึฟืจืื’ืŸ ืฆื• ื“ื™ ื“ืึทื˜ืŸ ื•ื•ืขืจื˜ืขืจื‘ื•ืš ืื•ืŸ ื“ื™ื ืึทืžื™ืฉ ืงื•ืงืŸ, ืงืขืจ ืื•ื™ืฃ ืึทืœืข ืกืึธืจืฅ ืคื•ืŸ ืงืึธื•ื ื˜ืขืจืก, ืฉื˜ืขืœืŸ ืึทืœืฅ ืื™ืŸ ื˜ื™ืฉืŸ ืื•ืŸ ืคึผื™ืจื™ืึทื“ื™ืงืœื™ ืึทื ืึทืœื™ื™ื– ืจืฉื™ืžื•ืช ืื•ืŸ ื˜ื™ืฉืŸ. ื•ื•ื™ ืึท ืจืขื–ื•ืœื˜ืึทื˜, ืžื™ืจ ื”ืึธื‘ืŸ ืฉื™ื™ืŸ ืึธื“ืขืจ ื ื™ืฉื˜ ืึทื–ื•ื™ ืฉื™ื™ืŸ ื’ืจืึทืคืก, ื˜ื™ืฉืŸ, ืจื™ืคึผืึธืจืฅ. ื“ื™ ื”ื•ื™ืคึผื˜ ื–ืึทืš ืื™ื– ืฆื• ื”ืึธื‘ืŸ ืžืขืจ, ืžืขืจ.
ืคึผืึทืจืึทื’ืจืึทืฃ ืงืกื ื•ืžืงืก-ืžื™ืจ ื“ื–ืฉืขื ืขืจื™ื™ื˜ ื˜ืขื˜ื™ืงื™ื™ื˜ ืื•ืŸ ืงืึทื˜ืขืจ ื“ื™ ืึทื ืึทืœื™ืกื™ืก ืคื•ืŸ ืึทืœืข ื“ืขื.
ืคึผืึทืจืึทื’ืจืึทืฃ ืงืกื ื•ืžืงืก-ืžื™ืจ ื’ืจื™ื™ื˜ืŸ ืึท ื–ื™ื›ืขืจ ื“ืึธืงื•ืžืขื ื˜, ืžื™ืจ ืจื•ืคืŸ ื“ืขื ื“ืึธืงื•ืžืขื ื˜ ืคืฉื•ื˜ - "ื•ื•ื™ ื–ืึธืœ ืžื™ืจ ืฉื˜ืขืœืŸ ืึทืจื•ื™ืฃ ืึท ื“ืึทื˜ืึทื‘ื™ื™ืก."
ืคึผืึทืจืึทื’ืจืึทืฃ ืงืกื ื•ืžืงืกโ€”ื“ืขืจ ืงืืกื˜ื•ืžืขืจ , ื“ืขืจื–ืขืขื ื“ื™ ืง ื“ืข ื ื’ืื ืฆ ืŸ ืคืจืื›ื˜ ืŸ ืคื• ืŸ ื’ืจืืค ืŸ ืื• ืŸ ืฆื™ืคืขืจืŸ , ืื™ ื– ืื™ ืŸ ืงื™ื ื“ืขืจื™ืฉ ืŸ ื ืื™ืฐ ืŸ ื‘ื˜ื—ื•ืŸ , โ€” ืื™ืฆ ื˜ ืฐืข ื˜ ืืœ ืฅ ืคื ืจ ืื•ื ื“ื– , ื‘ืืœ ื“ ืืจื‘ืขื˜ . ืื•ืŸ ืขืจ ื˜ื™ื™ืœื˜ ื–ื™ืš ืœื™ื™ื›ื˜ ืื•ืŸ ืคึผื™ื™ื ืœืึทืกืœื™ ืžื™ื˜ ื–ื™ื™ืŸ ืคื™ื ืึทื ืฆื™ืขืœ ืจืขืกื•ืจืกืŸ. ื“ื™ ืคืึทืจื•ื•ืึทืœื˜ื•ื ื’ ืื™ื– ืื•ื™ืš ื–ื™ื›ืขืจ ืึทื– ืื•ื ื“ื–ืขืจ ืขื ื“ื–ืฉืึทื ื™ืจื– ืึทืจื‘ืขื˜ ื’ืจื•ื™ืก. ืœืึธื•ื“ื™ื ื’ ื‘ื™ื™ึท ืžืึทืงืกื™ืžื•ื.
ืคึผืึทืจืึทื’ืจืึทืฃ ืงืกื ื•ืžืงืก- ืื™ื‘ืขืจื—ื–ืจืŸ ืฉืจื™ื˜ 1 ืงืขืกื™ื™ื“ืขืจ.
ื’ื™ื ื’ืขืจื‘ืจืขืึทื“ ืื•ืŸ ื“ืึธื•ื ืึทืฅ, ื‘ืจื•ื–ืึทื– ืื•ืŸ ื‘ืึทืžืคึผืกื’ื™ื ื’ืขืจื‘ืจืขืึทื“ ืื•ืŸ ื“ืึธื•ื ืึทืฅ:
1. ื“ื™ ืœืขื‘ืŸ ืคื•ืŸ ืžืึทื ืึทื“ื–ืฉืขืจื– ืื•ืŸ ืขื ื“ื–ืฉืึทื ื™ืจื– ืื™ื– ืคึผืฉื•ื˜, ืคึผืจื™ื“ื™ืงื˜ืึทื‘ืึทืœ ืื•ืŸ ืึธื ื’ืขืคื™ืœื˜ ืžื™ื˜ ื˜ืขื˜ื™ืงื™ื™ื˜. ืืœืขืก ื‘ืจื•ืžื˜, ื™ืขื“ืขืจ ืื™ื– ืคืืจื ื•ืžืขืŸ.
2. ื“ืขืจ ืงื•ื ื” ืก ืœืขื‘ืŸ ืื™ื– ืื•ื™ืš ื ื™ืฉื˜ ืฉืœืขื›ื˜ - ืขืจ ืื™ื– ืฉื˜ืขื ื“ื™ืง ื–ื™ื›ืขืจ ืึทื– ืขืจ ื ืึธืจ ื“ืึทืจืฃ ืฆื• ื–ื™ื™ืŸ ื’ืขื“ื•ืœื“ื™ืง ืึท ื‘ื™ืกืœ ืื•ืŸ ืึทืœืฅ ื•ื•ืขื˜ ืึทืจื‘ืขื˜ ืื•ื™ืก. ืขืก ื•ื•ืขืจื˜ ื ื™ืฉื˜ ื‘ืขืกืขืจ, ื ื•, ื“ื™ ื•ื•ืขืœื˜ ืื™ื– ื•ืžื™ื•ื™ืฉืขืจื“ื™ืง, ืื™ืŸ ื“ืขืจ ื•ื•ื™ื™ึทื˜ืขืจ ืœืขื‘ืŸ ืื™ืจ ื•ื•ืขื˜ ื–ื™ื™ืŸ ืžืึทื–ืœื“ื™ืง.
ื‘ืจื•ื–ืึทื– ืื•ืŸ ื‘ืึทืžืคึผืก:
1. ื’ื™ื›ืขืจ ืึธื“ืขืจ ืฉืคึผืขื˜ืขืจ, ืขืก ื•ื•ืขื˜ ื–ื™ื™ืŸ ืึท ืคืึทืกื˜ืขืจ ืฉืคึผื™ื™ึทื–ืขืจ ืคื•ืŸ ืึท ืขื ืœืขืš ื“ื™ื ืกื˜ ื•ื•ืึธืก ื•ื•ืขื˜ ื˜ืึธืŸ ื“ื™ ื–ืขืœื‘ืข ื–ืึทืš, ืึธื‘ืขืจ ืึท ื‘ื™ืกืœ ื˜ืฉื™ืคึผืขืจ. ืื•ืŸ ืื•ื™ื‘ ื“ืขืจ ืจืขื–ื•ืœื˜ืึทื˜ ืื™ื– ื“ื™ ื–ืขืœื‘ืข, ื•ื•ืึธืก ืฆืึธืœืŸ ืžืขืจ. ื•ื•ืึธืก ื•ื•ืขื˜ ื•ื•ื™ื“ืขืจ ืคื™ืจืŸ ืฆื• ื“ื™ ื“ื™ืกืึทืคึผื™ืจืึทื ืก ืคื•ืŸ ื“ื™ ืคื™ื“ืขืจ.
2. ืขืก ืก ื ื•ื“ื ืข. ื•ื•ื™ ื ื•ื“ื ืข ืงื™ื™ืŸ ืžื™ื ื™ื ื’ืœืึทืก ื˜ืขื˜ื™ืงื™ื™ื˜ ืื™ื–.
3. ื•ื•ื™ ืื™ืŸ ื“ื™ ืคืจื™ืขืจื“ื™ืงืข ื•ื•ืขืจืกื™ืข, ืขืก ืื™ื– ืงื™ื™ืŸ ืึทื ื˜ื•ื•ื™ืงืœื•ื ื’. ืึธื‘ืขืจ ืคึฟืึทืจ ืึท ื™ื ื–ืฉืขื ื™ืจ, ื“ื™ ื“ืึทื•ื ืกื™ื™ื“ ืื™ื– ืึทื–, ื ื™ื˜ ืขื ืœืขืš ื“ืขืจ ืขืจืฉื˜ืขืจ ืึธืคึผืฆื™ืข, ืื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ืงืขืกื™ื™ื“ืขืจ ื“ื–ืฉืขื ืขืจื™ื™ื˜ ืึทืŸ ื™ื‘ื“. ืื•ืŸ ื“ืึธืก ื ืขืžื˜ ืฆื™ื™ื˜. ื•ื•ืึธืก ืื™ืจ ืงืขื ืขืŸ ืคืึทืจื‘ืจืขื ื’ืขืŸ ืคึฟืึทืจ ื“ื™ ื ื•ืฅ ืคื•ืŸ ื“ื™ื™ืŸ ืœื™ื‘ ื’ืขื”ืื˜ ืื™ื™ื ืขืจ. ื•ื•ื™ื™ึทืœ ืื™ืจ ืงืขื ืขืŸ ื ื™ืฉื˜ ื ืขืžืขืŸ ืงืขื™ืจ ืคื•ืŸ ื–ื™ืš, ืงื™ื™ืŸ ืื™ื™ื ืขืจ ื’ื™ื˜ ืึท ืคืึทืจืฉื™ืœื˜ืŸ ื•ื•ืขื’ืŸ ืื™ืจ.

ืึธืคึผืฆื™ืข 3 - ืื™ืจ ื˜ืึธืŸ ื ื™ื˜ ื“ืึทืจืคึฟืŸ ืฆื• ืื•ื™ืกื˜ืจืึทื›ื˜ืŸ ืึท ื•ื•ืขืœืึธืกื™ืคึผืขื“, ืื™ืจ ื ืึธืจ ื“ืึทืจืคึฟืŸ ืฆื• ืงื•ื™ืคืŸ ืขืก ืื•ืŸ ืคืึธืจ ืขืก.

ืขืก ืื™ื– ื ื™ืฉื˜ ืคึฟืึทืจ ื’ืึธืจื ื™ืฉื˜ ืึทื– ืขื ื“ื–ืฉืึทื ื™ืจื– ืคื•ืŸ ืื ื“ืขืจืข ืงืึธืžืคึผืึทื ื™ืขืก ืขืกืŸ ืคึผื™ืฆืข ืžื™ื˜ ื‘ื™ืจ (ืึธื”, ื“ื™ ื›ื‘ื•ื“ ื˜ืขื’ ืคื•ืŸ ืกื˜ ืคืขื˜ืขืจื‘ื•ืจื’ ืื™ืŸ ื“ื™ 90 ืก). ืœืึธืžื™ืจ ื ื•ืฆืŸ ืžืึธื ื™ื˜ืึธืจื™ื ื’ ืกื™ืกื˜ืขืžืขืŸ ื•ื•ืึธืก ื–ืขื ืขืŸ ื’ืขืžืื›ื˜, ื“ื™ื‘ืึทื’ื“ ืื•ืŸ ืืจื‘ืขื˜ืŸ, ืื•ืŸ ืื™ืŸ ืึทืœื’ืขืžื™ื™ืŸ, ื ื•ืฅ (ื ื•, ืื™ืŸ ืžื™ื ื“ืกื˜ืขืจ ืฆื• ื–ื™ื™ืขืจ ืงืจื™ื™ื™ื˜ืขืจื–).
ื’ื™ื ื’ืขืจื‘ืจืขืึทื“ ืื•ืŸ ื“ืึธื•ื ืึทืฅ, ื‘ืจื•ื–ืึทื– ืื•ืŸ ื‘ืึทืžืคึผืกื’ื™ื ื’ืขืจื‘ืจืขืึทื“ ืื•ืŸ ื“ืึธื•ื ืึทืฅ:
1. ืขืก ืื™ื– ื ื™ื˜ ื“ืึทืจืคึฟืŸ ืฆื• ื•ื•ื™ืกื˜ ืฆื™ื™ื˜ ืฆื• ืงื•ืžืขืŸ ืึทืจื•ื™ืฃ ืžื™ื˜ ืขืคึผืขืก ื•ื•ืึธืก ืื™ื– ืฉื•ื™ืŸ ื™ื ื•ื•ืขื ื˜ืึทื“. ื ืขืžืขืŸ ืขืก ืื•ืŸ ื ื•ืฆืŸ ืขืก.
2. ืžืึธื ื™ื˜ืึธืจื™ื ื’ ืกื™ืกื˜ืขืžืขืŸ ื–ืขื ืขืŸ ื ื™ืฉื˜ ื’ืขืฉืจื™ื‘ืŸ ื“ื•ืจืš ืคืึธืึธืœืก ืื•ืŸ ื–ื™ื™ ื–ืขื ืขืŸ, ืคื•ืŸ ืงื•ืจืก, ื ื•ืฆื™ืง.
3. ืืจื‘ืขื˜ืŸ ืžืึธื ื™ื˜ืึธืจื™ื ื’ ืกื™ืกื˜ืขืžืขืŸ ื™ื•ื–ืฉืึทื•ื•ืึทืœื™ ืฆื•ืฉื˜ืขืœืŸ ื ื•ืฆื™ืง ืคื™ืœื˜ืขืจื“ ืื™ื ืคึฟืึธืจืžืึทืฆื™ืข.
ื‘ืจื•ื–ืึทื– ืื•ืŸ ื‘ืึทืžืคึผืก:
1. ื“ืขืจ ื™ื ื–ืฉืขื ื™ืจ ืื™ืŸ ื“ืขื ืคืึทืœ ืื™ื– ื ื™ืฉื˜ ืึท ื™ื ื–ืฉืขื ื™ืจ, ืึธื‘ืขืจ ื ืึธืจ ืึท ื‘ืึทื ื™ืฆืขืจ ืคื•ืŸ ืขืžืขืฆืขืจ ืึทื ื“ืขืจืฉ ืก ืคึผืจืึธื“ื•ืงื˜. ืึธื“ืขืจ ืึท ื‘ืึทื ื™ืฆืขืจ.
2. ื“ืขืจ ืงื•ื ื” ืžื•ื– ืื™ื‘ืขืจืฆื™ื™ื’ื˜ ื•ื•ืขืจืŸ ืคื•ืŸ ื“ืขื ื ื•ื™ื˜ื™ื’ืงื™ื™ื˜ ืฆื• ืงื•ื™ืคืŸ ืขืคืขืก ื•ื•ืืก ืขืจ ื•ื•ื™ืœ, ื‘ื›ืœืœ ื’ืขืจืขื“ื˜, ื ื™ืฉื˜ ืคืืจืฉื˜ื™ื™ืŸ, ืื•ืŸ ื“ืืจืฃ ื ื™ืฉื˜, ืื•ืŸ ื‘ื›ืœืœ ืื™ื– ื“ืขืจ ื‘ื•ื“ื–ืฉืขื˜ ืคืืจ ื“ื™ ื™ืืจ ื‘ืืฉื˜ืขื˜ื™ื’ื˜ ื’ืขื•ื•ืืจืŸ ืื•ืŸ ื•ื•ืขื˜ ื–ื™ืš ื ื™ืฉื˜ ื˜ื•ื™ืฉืŸ. ื“ืขืจื ืึธืš ืื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ืึทืœืึทืงื™ื™ื˜ ืึท ื‘ืึทื–ื•ื ื“ืขืจ ืžื™ื˜ืœ ืื•ืŸ ืงืึทื ืคื™ื’ื™ืขืจ ืขืก ืคึฟืึทืจ ืึท ืกืคึผืขืฆื™ืคื™ืฉ ืกื™ืกื˜ืขื. ื™ืขื ืข. ืขืจืฉื˜ืขืจ ืื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ื‘ืึทืฆืึธืœืŸ, ื‘ืึทืฆืึธืœืŸ ืื•ืŸ ื‘ืึทืฆืึธืœืŸ ื•ื•ื™ื“ืขืจ. ืื•ืŸ ื“ืขืจ ืงื•ื ื” ืื™ื– ืงืึทืจื’. ื“ืืก ืื™ื– ื“ื™ ืงืœืึทืœ ืคื•ืŸ ื“ืขื ืœืขื‘ืŸ.

ื•ื•ืึธืก ืฆื• ื˜ืึธืŸ - ื˜ืฉืขืจื ื™ืฉืขื•ื•ืกืงื™? ื“ื™ื™ืŸ ืงืฉื™ื ืื™ื– ื–ื™ื™ืขืจ ื•ื•ื™ื›ื˜ื™ืง. (ืžื™ื˜)

ืื™ืŸ ื“ืขื ื‘ืึทื–ื•ื ื“ืขืจ ืคืึทืœ ืื•ืŸ ื“ื™ ืงืจืึทื ื˜ ืกื™ื˜ื•ืึทืฆื™ืข, ืื™ืจ ืงืขื ืขืŸ ื˜ืึธืŸ ื“ืึธืก ืึท ื‘ื™ืกืœ ืึทื ื“ืขืจืฉ - ืœืึธื–ืŸ ืื•ื ื“ื– ืžืึทื›ืŸ ืื•ื ื“ื–ืขืจ ืื™ื™ื’ืขื ืข ืžืึธื ื™ื˜ืึธืจื™ื ื’ ืกื™ืกื˜ืขื.
ืคืึธืจืฉื˜ืขืœื•ื ื’ ืžืึธื ื™ื˜ืึธืจื™ื ื’ ืคื•ืŸ PostgreSQL ืคึฟืจืื’ืŸ. ื˜ื™ื™ืœ 1 - ืจื™ืคึผืึธืจื˜ื™ื ื’
ื ื•, ื ื™ื˜ ืึท ืกื™ืกื˜ืขื, ืคื•ืŸ ืงื•ืจืก, ืื™ืŸ ื“ื™ ืคื•ืœ ื–ื™ื ืขืŸ ืคื•ืŸ ื“ืขื ื•ื•ืึธืจื˜, ื“ืึธืก ืื™ื– ืฆื• ื”ื•ื™ืš ืื•ืŸ ืคึผืจื™ืกื•ืžืคึผื˜ืฉื•ืึทืก, ืึธื‘ืขืจ ืื™ืŸ ืžื™ื ื“ืกื˜ืขืจ ืขืคืขืก ืžืึทื›ืŸ ื“ื™ื™ืŸ ืึทืจื‘ืขื˜ ื’ืจื™ื ื’ืขืจ ืื•ืŸ ืงืœื™ื™ึทื‘ืŸ ืžืขืจ ืื™ื ืคึฟืึธืจืžืึทืฆื™ืข ืฆื• ืกืึธืœื•ื•ืข ืคืึธืจืฉื˜ืขืœื•ื ื’ ื™ื ืกืึทื“ืึทื ืฅ. ืื™ืŸ ืกื“ืจ ื ื™ืฉื˜ ืฆื• ื’ืขืคึฟื™ื ืขืŸ ื–ื™ืš ืื™ืŸ ืึท ืกื™ื˜ื•ืึทืฆื™ืข - "ื’ื™ื™ืŸ ื“ืึธืจื˜, ืื™ืš ื˜ืึธืŸ ื ื™ื˜ ื•ื•ื™ืกืŸ ื•ื•ื•, ื’ืขืคึฟื™ื ืขืŸ ืขืคึผืขืก, ืื™ืš ื˜ืึธืŸ ื ื™ื˜ ื•ื•ื™ืกืŸ ื•ื•ืึธืก."

ื•ื•ืึธืก ื–ืขื ืขืŸ ื“ื™ ืคึผืจืึธืก ืื•ืŸ ืงืึธื ืก ืคื•ืŸ ื“ืขื ืึธืคึผืฆื™ืข:

ืคึผืจืึธืก:
1. ื“ืึธืก ืื™ื– ื˜ืฉื™ืงืึทื•ื•ืข. ื ื•, ืื™ืŸ ืžื™ื ื“ืกื˜ืขืจ ืขืก ืื™ื– ืžืขืจ ื˜ืฉื™ืงืึทื•ื•ืข ื•ื•ื™ ื“ื™ ืงืขืกื™ื™ื“ืขืจื“ื™ืง "ื™ื™ึทื ืฉืจื•ืžืคึผืŸ ื“ืึทื˜ืึท ื˜ืขืงืข, ื˜ื•ื™ืฉืŸ ื˜ื™ืฉ ืคึผืœืึทืฅ, ืขื˜ืง."
2. ื“ืืก ื–ืขื ืขืŸ ื ื™ื™ึทืข ืกืงื™ืœื– ืื•ืŸ ื ื™ื™ึทืข ืึทื ื˜ื•ื•ื™ืงืœื•ื ื’. ื•ื•ืึธืก, ื’ื™ื›ืขืจ ืึธื“ืขืจ ืฉืคึผืขื˜ืขืจ, ื•ื•ืขื˜ ื’ืขื‘ืŸ ืื™ืจ ื’ืขื–ื•ื ื˜-ื“ื™ื–ืขืจื•ื•ื“ ื’ื™ื ื’ืขืจื‘ืจืขืึทื“ ืื•ืŸ ื“ืึธื•ื ืึทืฅ.
ืงืึธื ืก:
1. ืื™ืจ ื•ื•ืขื˜ ื”ืึธื‘ืŸ ืฆื• ืึทืจื‘ืขื˜ืŸ. ืืจื‘ื™ื™ื˜ ืฉื•ื•ืขืจ.
2. ืื™ืจ ื•ื•ืขื˜ ื”ืึธื‘ืŸ ืฆื• ืงืขืกื™ื™ื“ืขืจ ื“ืขืจืงืœืขืจืŸ ื“ื™ ื˜ื™ื™ึทื˜ืฉ ืื•ืŸ ืคึผืจืึทืกืคึผืขืงืก ืคื•ืŸ ืึทืœืข ืึทืงื˜ื™ื•ื•ื™ื˜ืขื˜ืŸ.
3. ืขืคืขืก ื•ื•ืขื˜ ืžืขืŸ ื“ืืจืคืŸ ืžืงืจื™ื‘ ื–ื™ื™ืŸ, ื•ื•ื™ื™ืœ ื“ื™ ืื™ื™ื ืฆื™ื’ืกื˜ืข ืžื™ื˜ืœ ื•ื•ืืก ืื™ื– ืคืืจืืŸ ืคืืจ ืืŸ ืื™ื ื–ืฉืขื ื™ืจ - ืฆื™ื™ื˜ - ืื™ื– ื‘ืื’ืจืขื ืขืฆื˜ ื“ื•ืจืš ื“ื™ ื•ื ื™ื•ื•ืขืจืกืข.
4. ื“ื™ ืขืจื’ืกื˜ ืื•ืŸ ืžืขืจืกื˜ ืคึผืจื™ืงืจืข ื–ืึทืš - ื“ืขืจ ืจืขื–ื•ืœื˜ืึทื˜ ืงืขืŸ ื–ื™ื™ืŸ ื‘ื•ืœืฉื™ื˜ ื•ื•ื™ "ื ื™ื˜ ืึท ืžื•ื™ื–, ื ื™ืฉื˜ ืึท ื–ืฉืึทื‘ืข, ืึธื‘ืขืจ ืึทืŸ ืื•ืžื‘ืึทืงืึทื ื˜ ื›ื™ื™ึทืข."

ื“ื™ ื•ื•ืืก ื ืขืžืขืŸ ื ื™ืฉื˜ ืจื™ื–ื™ืงื™ืจืŸ, ื˜ืจื™ื ืงืขืŸ ื ื™ืฉื˜ ืฉืึทืžืคึผืึทื ื™ืขืจ.
ืึทื–ื•ื™ - ื“ืขืจ ืฉืคึผืึทืก ื”ื™ื™ื‘ื˜.

ืึทืœื’ืขืžื™ื™ื ืข ื’ืขื“ืึทื ืง - ืกื›ืขืžืึทื˜ื™ืฉ

ืคืึธืจืฉื˜ืขืœื•ื ื’ ืžืึธื ื™ื˜ืึธืจื™ื ื’ ืคื•ืŸ PostgreSQL ืคึฟืจืื’ืŸ. ื˜ื™ื™ืœ 1 - ืจื™ืคึผืึธืจื˜ื™ื ื’
(ืื™ืœื•ืกื˜ืจืืฆื™ืข ื’ืขื ื•ืžืขืŸ ืคื•ืŸ ื“ืขื ืึทืจื˜ื™ืงืœ ยซืกื™ื ื˜ืขื– ื•ื•ื™ ืื™ื™ื ืขืจ ืคื•ืŸ ื“ื™ ืžืขื˜ื”ืึธื“ืก ืคึฟืึทืจ ื™ืžืคึผืจื•ื•ื•ื™ื ื’ PostgreSQL ืคืึธืจืฉื˜ืขืœื•ื ื’")

ื“ืขืจืงืœืขืจื•ื ื’:

  • ื“ืขืจ ื ืึธืจืžืึทืœ PostgreSQL ืคืึทืจืœืขื ื’ืขืจื•ื ื’ "pg_stat_statements" ืื™ื– ืื™ื ืกื˜ืึทืœื™ืจืŸ ืื™ืŸ ื“ื™ ืฆื™ืœ ื“ืึทื˜ืึทื‘ื™ื™ืก.
  • ืื™ืŸ ื“ื™ ืžืึธื ื™ื˜ืึธืจื™ื ื’ ื“ืึทื˜ืึทื‘ื™ื™ืก, ืžื™ืจ ืžืึทื›ืŸ ืึท ื’ืึทื ื’ ืคื•ืŸ ืกืขืจื•ื•ื™ืก ื˜ื™ืฉืŸ ืคึฟืึทืจ ืกื˜ืึธืจื™ื ื’ ื“ื™ ื’ืขืฉื™ื›ื˜ืข ืคื•ืŸ โ€‹โ€‹โ€‹โ€‹pg_stat_statements ืื™ืŸ ื“ืขืจ ืขืจืฉื˜ ื‘ื™ื ืข ืื•ืŸ ืคึฟืึทืจ ื‘ืึทืฉื˜ืขื˜ื™ืงืŸ ืžืขื˜ืจื™ืงืก ืื•ืŸ ืžืึธื ื™ื˜ืึธืจื™ื ื’ ืื™ืŸ ื“ืขืจ ืฆื•ืงื•ื ืคึฟื˜.
  • ืื•ื™ืฃ ื“ื™ ืžืึธื ื™ื˜ืึธืจื™ื ื’ ื‘ืึทืœืขื‘ืึธืก, ืžื™ืจ ืžืึทื›ืŸ ืึท ืกื›ื•ื ืคื•ืŸ ื‘ืึทืฉ ืกืงืจื™ืคึผืก, ืึทืจื™ื™ึทื ื’ืขืจืขื›ื ื˜ ื“ื™ ืคึฟืึทืจ ื“ื–ืฉืขื ืขืจื™ื™ื˜ื™ื ื’ ื™ื ืกืึทื“ืึทื ืฅ ืื™ืŸ ื“ื™ ื‘ื™ืœืขื˜ ืกื™ืกื˜ืขื.

ืกืขืจื•ื•ื™ืก ื˜ื™ืฉืŸ

ืขืจืฉื˜ืขืจ, ืึท ืกื›ืขืžืึทื˜ื™ืฉ ืกื™ืžืคึผืœืึทืคื™ื™ื“ ERD, ื•ื•ืึธืก ื’ืขื˜ืจืืคืŸ ืื™ืŸ ื“ื™ ืกื•ืฃ:
ืคืึธืจืฉื˜ืขืœื•ื ื’ ืžืึธื ื™ื˜ืึธืจื™ื ื’ ืคื•ืŸ PostgreSQL ืคึฟืจืื’ืŸ. ื˜ื™ื™ืœ 1 - ืจื™ืคึผืึธืจื˜ื™ื ื’
ืงื•ืจืฅ ื‘ืึทืฉืจื™ื™ึทื‘ื•ื ื’ ืคื•ืŸ ื˜ื™ืฉืŸืขื ื“ืคึผื•ื™ื ื˜ - ื‘ืึทืœืขื‘ืึธืก, ืคื•ื ื˜ ืคื•ืŸ ืงืฉืจ ืฆื• ื“ืขื ื‘ื™ื™ึทืฉืคึผื™ืœ
ื“ืึทื˜ืึทื‘ื™ื™ืก - ื“ื™ื™ื˜ืึทื‘ื™ื™ืก ืคึผืึทืจืึทืžืขื˜ืขืจืก
pg_stat_history - ืึท ื”ื™ืกื˜ืืจื™ืฉืข ื˜ื™ืฉ ืคึฟืึทืจ ืกื˜ืึธืจื™ื ื’ ืฆื™ื™ึทื˜ื•ื•ื™ื™ึทืœื™ืง ืกื ืึทืคึผืฉืึทืฅ ืคื•ืŸ ื“ื™ pg_stat_statements ืžื™ื™ื ื•ื ื’ ืคื•ืŸ ื“ื™ ืฆื™ืœ ื“ืึทื˜ืึทื‘ื™ื™ืก
ืžืขื˜ืจื™ืง_ื’ืœืึธืกืึทืจ - ื•ื•ืขืจื˜ืขืจื‘ื•ืš ืคื•ืŸ ืคืึธืจืฉื˜ืขืœื•ื ื’ ืžืขื˜ืจื™ืงืก
metric_config - ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ืคื•ืŸ ื™ื—ื™ื“ ืžืขื˜ืจื™ืงืก
ืžืขื˜ืจื™ืง - ืึท ืกืคึผืขืฆื™ืคื™ืฉ ืžืขื˜ืจื™ืง ืคึฟืึทืจ ื“ื™ ื‘ืขื˜ืŸ ื•ื•ืึธืก ืื™ื– ืžืึธื ื™ื˜ืึธืจืขื“
metric_alert_history - ื’ืขืฉื™ื›ื˜ืข ืคื•ืŸ โ€‹โ€‹ืคืึธืจืฉื˜ืขืœื•ื ื’ ื•ื•ืึธืจื ื™ื ื’ื–
log_query - ืึท ืกืขืจื•ื•ื™ืก ื˜ื™ืฉ ืคึฟืึทืจ ืกื˜ืึธืจื™ื ื’ ืคึผืึทืจืกืขื“ ืจืขืงืึธืจื“ืก ืคึฟื•ืŸ ืึท ืคึผืึธืกื˜ื’ืจืขืกืงืœ ืœืึธื’ ื˜ืขืงืข ื“ืึทื•ื ืœืึธื•ื“ื™ื“ ืคึฟื•ืŸ AWS
baseline - ืคึผืึทืจืึทืžืขื˜ืขืจืก ืคื•ืŸ ื“ื™ ืฆื™ื™ื˜ ืคึผื™ืจื™ืึทื“ื– ื’ืขื ื™ืฆื˜ ื•ื•ื™ ื“ื™ ื‘ืึทื–ืข
ื˜ืฉืขืงืคึผื•ื™ื ื˜ - ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ืคื•ืŸ ืžืขื˜ืจื™ืงืก ืคึฟืึทืจ ืงืึธื ื˜ืจืึธืœื™ืจื•ื ื’ ื“ื™ ืกื˜ืึทื˜ื•ืก ืคื•ืŸ ื“ื™ ื“ืึทื˜ืึทื‘ื™ื™ืก
checkpoint_alert_history - ื•ื•ืืจืขื ื•ื ื’ ื’ืขืฉื™ื›ื˜ืข ืคื•ืŸ โ€‹โ€‹ื“ืึทื˜ืึทื‘ื™ื™ืก ื’ืขื–ื•ื ื˜ ื˜ืฉืขืง ืžืขื˜ืจื™ืงืก
pg_stat_db_queries - ื“ื™ื ืกื˜ ื˜ื™ืฉ ืคื•ืŸ ืึทืงื˜ื™ื•ื• ืจื™ืงื•ื•ืขืก
ืึทืงื˜ื™ื•ื•ื™ื˜ื™_ืœืึธื’ - ื˜ืขื˜ื™ืงื™ื™ื˜ ืงืœืึธืฅ ื“ื™ื ืกื˜ ื˜ื™ืฉ
trap_oid - ื˜ืจืึทืคึผ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ื“ื™ื ืกื˜ ื˜ื™ืฉ

ืกื˜ืึทื’ืข 1 - ืงืœื™ื™ึทื‘ืŸ ืกื˜ืึทื˜ื™ืกื˜ื™ืฉ ืื™ื ืคึฟืึธืจืžืึทืฆื™ืข ื•ื•ืขื’ืŸ ืคืึธืจืฉื˜ืขืœื•ื ื’ ืื•ืŸ ื‘ืึทืงื•ืžืขืŸ ืจื™ืคึผืึธืจืฅ

ื ื˜ื™ืฉ ืื™ื– ื’ืขื ื™ืฆื˜ ืฆื• ืงืจืึธื ืกื˜ืึทื˜ื™ืกื˜ื™ืฉ ืื™ื ืคึฟืึธืจืžืึทืฆื™ืข pg_stat_history
ืคึผื’_ืกื˜ืึทื˜_ื”ื™ืกื˜ืึธืจื™ ื˜ื™ืฉ ืกื˜ืจื•ืงื˜ื•ืจ

                                          ื˜ื™ืฉ "public.pg_stat_history" ื–ื™ื™ึทืœ | ื˜ื™ืคึผ | ืžืึธื“ื™ืคื™ืขืจืก---------------------- -+------------------------------------------------ ืฉื™ื™ึทืŸ | ื’ืึทื ืฅ ื ื•ืžืขืจ | ื ื™ื˜ ื ืึทืœ ืคืขืœื™ืงื™ื™ึทื˜ Nextval ('pg_stat_history_id_seq'::regclass) snapshot_timestamp | ืฆื™ื™ื˜ ืฉื˜ืขืžืคึผืœ ืึธืŸ ืฆื™ื™ื˜ ื–ืึธื ืข | database_id | ื’ืึทื ืฅ ื ื•ืžืขืจ | ื“ื‘ื™ื“ | oid | userid | oid | queryid | bigint | ืึธื ืคึฟืจืขื’ | ื˜ืขืงืกื˜ | ืจื•ืคื˜ | bigint | total_time | ื˜ืึธืคึผืœ ืคึผื™ื ื˜ืœืขื›ืงื™ื™ึทื˜ | min_time | ื˜ืึธืคึผืœ ืคึผื™ื ื˜ืœืขื›ืงื™ื™ึทื˜ | max_time | ื˜ืึธืคึผืœ ืคึผื™ื ื˜ืœืขื›ืงื™ื™ึทื˜ | mean_time | ื˜ืึธืคึผืœ ืคึผื™ื ื˜ืœืขื›ืงื™ื™ึทื˜ | stddev_time | ื˜ืึธืคึผืœ ืคึผื™ื ื˜ืœืขื›ืงื™ื™ึทื˜ | ืจืึธื•ื– | 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 | ื˜ืึธืคึผืœ ืคึผื™ื ื˜ืœืขื›ืงื™ื™ึทื˜ | blk_write_time | ื˜ืึธืคึผืœ ืคึผื™ื ื˜ืœืขื›ืงื™ื™ึทื˜ | baseline_id | ื’ืึทื ืฅ ื ื•ืžืขืจ | ื™ื ื“ืขืงืกื™ื–: "pg_stat_history_pkey" ืขืจืฉื˜ื™ืง ืฉืœื™ืกืœ, btree (id) "ื“ืึทื˜ืึทื‘ื™ื™ืก_ื™ื“ืงืก" btree (ื“ืึทื˜ืึทื‘ื™ื™ืก_ื™ื“) "queryid_idx" btree (queryid) "Snapshot_timestamp_idx" btree (snapshot_timestamp) ืคืจืขืžื“ ืฉืœื™ืกืœ ืงืึทื ืกื˜ืจื™ื™ื ืฅ: "ื“ืึทื˜ืึทื‘ืึทืกืข_ื™ื“_ื“_ืคืขื™ืก" (ื“ืึทื˜ืึทื‘ืึทืกืข_ื™ื“_ืคื™ื™ึทืง) ) ืื•ื™ืฃ ื•ื™ืกืžืขืงืŸ ืงืึทืกืงื™ื™ื“

ื•ื•ื™ ืื™ืจ ืงืขื ืขืŸ ื–ืขืŸ, ื“ื™ ื˜ื™ืฉ ืื™ื– ื‘ืœื•ื™ื– ื“ื™ ืงื™ื•ืžื™ืึทืœืึทื˜ื™ื•ื• ืžื™ื™ื ื•ื ื’ ื“ืึทื˜ืŸ pg_stat_statements ืื™ืŸ ื“ื™ ืฆื™ืœ ื“ืึทื˜ืึทื‘ื™ื™ืก.

ื ื™ืฆืŸ ื“ืขื ื˜ื™ืฉ ืื™ื– ื–ื™ื™ืขืจ ืคึผืฉื•ื˜

pg_stat_history ื•ื•ืขื˜ ืคืึธืจืฉื˜ืขืœืŸ ืึทืงื™ื•ืžื™ืึทืœื™ื™ื˜ื™ื“ ืกื˜ืึทื˜ื™ืกื˜ื™ืง ืคื•ืŸ ืึธื ืคึฟืจืขื’ ื“ื•ืจื›ืคื™ืจื•ื ื’ ืคึฟืึทืจ ื™ืขื“ืขืจ ืฉืขื”. ืื™ืŸ ื“ื™ ืึธื ื”ื™ื™ื‘ ืคื•ืŸ ื™ืขื“ืขืจ ืฉืขื”, ื ืึธืš ืคื™ืœื•ื ื’ ื“ื™ ื˜ื™ืฉ, ืกื˜ืึทื˜ื™ืกื˜ื™ืง pg_stat_statements ื‘ืึทืฉื˜ืขื˜ื™ืง ืžื™ื˜ pg_stat_statements_reset().
ื‘ืึทืžืขืจืงื•ื ื’: ืกื˜ืึทื˜ื™ืกื˜ื™ืง ื–ืขื ืขืŸ ื’ืขื–ืืžืœื˜ ืคึฟืึทืจ ืงื•ื•ื™ืจื™ื– ืžื™ื˜ ื“ื•ืจื›ืคื™ืจื•ื ื’ ื’ืขื“ื•ื™ืขืจ ืคื•ืŸ ืžืขืจ ื•ื•ื™ 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 ;

ื“ื‘ ืฆื™ื™ื˜

to_char (ืžืขื”ืึทืœืขืš '1 ืžื™ืœื™ืกืขืงืึทื ื“' * pg_total_stat_history_rec.total_time, 'HH24:MI:SS.MS')

ืื™ืš / ืึธ ืฆื™ื™ื˜

to_char (ืžืขื”ืึทืœืขืš '1 ืžื™ืœื™ืกืขืงืึทื ื“' * (pg_total_stat_history_rec.blk_read_time + pg_total_stat_history_rec.blk_write_time), 'HH24:MI:SS.MS')

TOP10 SQL ื“ื•ืจืš 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 ืœื•ื™ื˜ ื’ืึทื ืฅ ื“ื•ืจื›ืคื™ืจื•ื ื’ ืฆื™ื™ื˜ | #| queryid| ืจื•ืคื˜| ืจื•ืคื˜ ื–ื™ืš total_time (ms) | ื“ื‘ื˜ื™ื™ื % +---------------------------+ ------ --------------------------+---------- | 1| 821760255| 2| .00001|00:03:23.141( 203141.681 ืžื™ื–.)| 5.42 | 2| 4152624390| 2| .00001|00:03:13.929( 193929.215 ืžื™ื–.)| 5.17 | 3| 1484454471| 4| .00001|00:02:09.129( 129129.057 ืžื™ื–.)| 3.44 | 4| 655729273| 1| .00000|00:02:01.869( 121869.981 ืžื™ื–.)| 3.25 | 5| 2460318461| 1| .00000|00:01:33.113( 93113.835 ืžื™ื–)| 2.48 | 6| 2194493487| 4| .00001|00:00:17.377( 17377.868 ืžื™ื–)| .46 | 7| 1053044345| 1| .00000|00:00:06.156( 6156.352 ืžื™ื–.)| .16 | 8| 3644780286| 1| .00000|00:00:01.063( 1063.830 ืžื™ื–)| .03

TOP10 SQL ืœื•ื™ื˜ ื’ืึทื ืฅ ื™ / ืึธ ืฆื™ื™ื˜

ื‘ืขื˜ืŸ

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 ืœื•ื™ื˜ ื’ืึทื ืฅ ื™ / ืึธ ืฆื™ื™ื˜ | #| queryid| ืจื•ืคื˜| ืจื•ืคื˜ ื–ื™ืš I/O ืฆื™ื™ื˜ (ืžืก)|ื“ื‘ I/O ืฆื™ื™ื˜ % +----+-------+------------- ----------+--------------------------------+---- ------ -- | 1| 4152624390| 2| .00001|00:08:31.616( 511616.592 ืžื™ื–.)| 31.06 | 2| 821760255| 2| .00001|00:08:27.099( 507099.036 ืžื™ื–.)| 30.78 | 3| 655729273| 1| .00000|00:05:02.209( 302209.137 ืžื™ื–.)| 18.35 | 4| 2460318461| 1| .00000|00:04:05.981( 245981.117 ืžื™ื–.)| 14.93 | 5| 1484454471| 4| .00001|00:00:39.144( 39144.221 ืžื™ื–.)| 2.38 | 6| 2194493487| 4| .00001|00:00:18.182( 18182.816 ืžื™ื–.)| 1.10 | 7| 1053044345| 1| .00000|00:00:16.611( 16611.722 ืžื™ื–.)| 1.01 | 8| 3644780286| 1| .00000|00:00:00.436(436.205 ืžื™ื–)| .03

TOP10 SQL ืœื•ื™ื˜ ื“ื™ ืžืึทืงืกื™ืžื•ื ืฆื™ื™ื˜ ืคื•ืŸ ื“ื•ืจื›ืคื™ืจื•ื ื’

ื‘ืขื˜ืŸ

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 ื“ื•ืจืš ืžืึทืงืกื™ืžื•ื ื“ื•ืจื›ืคื™ืจื•ื ื’ ืฆื™ื™ื˜ | #| ืžืึธืžืขื ื˜ื‘ื™ืœื“| snapshotID| queryid| ืžืึทืงืก_ืฆื™ื™ื˜ (ืžืก) +----+-------------------+-----+--- --+---------------------------------------------- | 1| 05.04.2019/01/03 4169:655729273| 00| 02| 01.869:121869.981:2( 04.04.2019 ืžื™ื–) | 17| 00/4153/821760255 00:01| 41.570| 101570.841| 3:04.04.2019:16( 00 ืžื™ื–) | 4146| 821760255/00/01 41.570:101570.841| 4| 04.04.2019| 16:00:4144( 4152624390 ืžื™ื–) | 00| 01/36.964/96964.607 5:04.04.2019| 17| 00| 4151:4152624390:00(01 ืžื™ื–) | 36.964| 96964.607/6/05.04.2019 10:00| 4188| 1484454471| 00:01:33.452(93452.150 ืžื™ื–) | 7| 04.04.2019/17/00 4150:2460318461| 00| 01| 33.113:93113.835:8( 04.04.2019 ืžื™ื–) | 15| 00/4140/1484454471 00:00| 11.892| 11892.302| 9:04.04.2019:16(00 ืžื™ื–) | 4145| 1484454471/00/00 11.892:11892.302| 10| 04.04.2019| 17:00:4152( 1484454471 ืžื™ื–) | 00| 00/11.892/11892.302 XNUMX:XNUMX| XNUMX| XNUMX| XNUMX:XNUMX:XNUMX( XNUMX ืžื™ื–) | XNUMX| XNUMX/XNUMX/XNUMX XNUMX:XNUMX| XNUMX| XNUMX| XNUMX:XNUMX:XNUMX(XNUMX ืžื™ื–.)

TOP10 SQL ื“ื•ืจืš ืฉืขืจื“ ื‘ืึทืคืขืจ ืœื™ื™ืขื ืขืŸ / ืฉืจื™ื™ึทื‘ืŸ

ื‘ืขื˜ืŸ

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 ื“ื•ืจืš ืฉืขืจื“ ื‘ืึทืคืขืจ ืœื™ื™ืขื ืขืŸ / ืฉืจื™ื™ึทื‘ืŸ | #| ืžืึธืžืขื ื˜ื‘ื™ืœื“| snapshotID| queryid| ืฉืขืจื“ ื‘ืœืึทืงืก ืœื™ื™ืขื ืขืŸ| ืฉืขืจื“ ื‘ืœืึทืงืก ืฉืจื™ื™ึทื‘ืŸ +----+-------------------+--------+-------- -+---------------------+--------------------- | 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 | XNUMX| XNUMX/XNUMX/XNUMX XNUMX:XNUMX| XNUMX| XNUMX| XNUMX| XNUMX | XNUMX| XNUMX/XNUMX/XNUMX XNUMX:XNUMX| XNUMX| XNUMX| XNUMX| XNUMX -------------------------------------------------- ------------------------------------------

ื”ื™ืกื˜ืึธื’ืจืึทื ืคื•ืŸ ืจื™ืงื•ื•ืขืก ืคืึทืจืฉืคึผืจื™ื™ื˜ื•ื ื’ ื“ื•ืจืš ืžืึทืงืกื™ืžื•ื ื“ื•ืจื›ืคื™ืจื•ื ื’ ืฆื™ื™ื˜

ืจื™ืงื•ื•ืขืก

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 | ื’ืึทื ืฅ ืงืึทืœืœืก: 33851920 | ืžื™ืŸ ืฆื™ื™ื˜: 00:00:01.063 | ืžืึทืงืกื™ืžื•ื ืฆื™ื™ื˜: 00:02:01.869 ------------------------------------------ -------------------------------------------- | ืžื™ืŸ ื’ืขื“ื•ื™ืขืจ| ืžืึทืงืกื™ืžื•ื ื’ืขื“ื•ื™ืขืจ| ืจื•ืคื˜ +--------------------------------+------- ----------------------+---------- | 00:00:01.063( 1063.830 ืžื™ื–) | 00:00:13.144( 13144.445 ืžื™ื–) | 9 | 00:00:13.144( 13144.445 ืžื™ื–) | 00:00:25.225( 25225.060 ืžื™ื–) | 0 | 00:00:25.225( 25225.060 ืžื™ื–) | 00:00:37.305( 37305.675 ืžื™ื–) | 0 | 00:00:37.305( 37305.675 ืžื™ื–) | 00:00:49.386(49386.290 ืžื™ื–) | 0 | 00:00:49.386(49386.290 ืžื™ื–) | 00:01:01.466(61466.906 ืžื™ื–) | 0 | 00:01:01.466(61466.906 ืžื™ื–) | 00:01:13.547( 73547.521 ืžื™ื–) | 0 | 00:01:13.547( 73547.521 ืžื™ื–) | 00:01:25.628( 85628.136 ืžื™ื–) | 0 | 00:01:25.628( 85628.136 ืžื™ื–) | 00:01:37.708( 97708.751 ืžื™ื–) | 4 | 00:01:37.708( 97708.751 ืžื™ื–) | 00:01:49.789( 109789.366 ืžื™ื–) | 2 | 00:01:49.789( 109789.366 ืžื™ื–) | 00:02:01.869( 121869.981 ืžื™ื–) | 0

TOP10 ืกื ืึทืคึผืฉืึทืฅ ื“ื•ืจืš ืึธื ืคึฟืจืขื’ ืคึผืขืจ ืกืขืงื•ื ื“ืข

ืจื™ืงื•ื•ืขืก

--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 ืกื ืึทืคึผืฉืึทืฅ ืึธืจื“ืขืจื“ ื“ื•ืจืš QueryPerSeconds ื ื•ืžืขืจืŸ -------------------------------------------- ------------------------------------------ -------------------------------------------------- | #| ืžืึธืžืขื ื˜ื‘ื™ืœื“| snapshotID| ืจื•ืคื˜| ื’ืึทื ืฅ ื“ื‘ื˜ื™ืžืข| QPS| I/O ืฆื™ื™ื˜| I/O ืฆื™ื™ื˜ % +----+---------------------+--------+------- ----+---------------------------------+---------- -+------------------------+---------------- | 1| 04.04.2019/20/04 4161:5758631| 00| 06| 30.513:390513.926:1573.396( 00 ืžื™ื–)| 00| 01.470:1470.110:376( 2 ืžื™ื–)| .04.04.2019 | 17| 00/4149/3529197 00:11| 48.830| 708830.618| 980.332:00:12( 47.834 ืžื™ื–)| 767834.052| 108.324:3:04.04.2019(16 ืžื™ื–)| 00 | 4143| 3525360/00/10 13.492:613492.351| 979.267| 00| 08:41.396:521396.555( 84.988 ืžื™ื–)| 4| 04.04.2019:21:03(4163 ืžื™ื–)| 2781536 | 00| 03/06.470/186470.979 785.745:00| 00| 00.249| 249.865:134:5( 04.04.2019 ืžื™ื–)| 19| 03:4159:2890362(00 ืžื™ื–)| .03 | 16.784| 196784.755/776.979/00 00:01.441| 1441.386| 732| 6:04.04.2019:14( 00 ืžื™ื–)| 4137| 2397326:00:04( 43.033 ืžื™ื–)| .283033.854 | 665.924| 00/00/00.024 24.505:009| 7| 04.04.2019| 15:00:4139(2394416 ืžื™ื–)| 00| 04:51.435:291435.010(665.116 ืžื™ื–)| .00 | 00| 12.025/12025.895/4.126 8:04.04.2019| 13| 00| 4135:2373043:00( 04 ืžื™ื–)| 26.791| 266791.988:659.179:00( 00 ืžื™ื–)| 00.064 | 64.261| 024/9/05.04.2019 01:03| 4167| 4387191| 00:06:51.380(411380.293 ืžื™ื–)| 609.332| 00:05:18.847( 318847.407 ืžื™ื–)| .77.507 | 10| 04.04.2019/18/01 4157:1145596| 00| 01| 19.217:79217.372:313.004( 00 ืžื™ื–)| 00| 01.319:1319.676:1.666( XNUMX ืžื™ื–)| XNUMX | XNUMX| XNUMX/XNUMX/XNUMX XNUMX:XNUMX| XNUMX| XNUMX| XNUMX:XNUMX:XNUMX( XNUMX ืžื™ื–)| XNUMX| XNUMX:XNUMX:XNUMX( XNUMX ืžื™ื–)| XNUMX

ืึทื•ืจืœื™ ื“ื•ืจื›ืคื™ืจื•ื ื’ ื’ืขืฉื™ื›ื˜ืข ืžื™ื˜ QueryPerSeconds ืื•ืŸ I/O ืฆื™ื™ื˜

ื‘ืขื˜ืŸ

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

ื˜ืขืงืกื˜ ืคื•ืŸ ืึทืœืข ืกืงืœ-ืกืึทืœืขืงืฅ

ื‘ืขื˜ืŸ

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 - ืจื™ืคึผืึธืจื˜ื™ื ื’

ืึธื‘ืขืจ ื“ืึธืก ืื™ื– ืึท ื’ืึธืจ ืึทื ื“ืขืจืฉ ื’ืขืฉื™ื›ื˜ืข.

ืฆื• ืคืึธืจื–ืขืฆืŸ ...

ืžืงื•ืจ: www.habr.com

ืœื™ื™ื’ืŸ ืึท ื‘ืึทืžืขืจืงื•ื ื’