ื ื™ื˜ื•ืจ ื‘ื™ืฆื•ืขื™ื ืฉืœ ืฉืื™ืœืชื•ืช PostgreSQL. ื—ืœืง 1 - ื“ื™ื•ื•ื—

ืžื”ื ื“ืก - ืชื•ืจื’ื ืžืœื˜ื™ื ื™ืช - ื‘ื”ืฉืจืืช.
ืžื”ื ื“ืก ื™ื›ื•ืœ ืœืขืฉื•ืช ื”ื›ืœ. (ื’) ืจ' ื“ื™ื–ืœ.
ืืคื™ื’ืจืฃ.
ื ื™ื˜ื•ืจ ื‘ื™ืฆื•ืขื™ื ืฉืœ ืฉืื™ืœืชื•ืช PostgreSQL. ื—ืœืง 1 - ื“ื™ื•ื•ื—
ืื• ืกื™ืคื•ืจ ืขืœ ืžื“ื•ืข ืžื ื”ืœ ืžืกื“ ื ืชื•ื ื™ื ืฆืจื™ืš ืœื–ื›ื•ืจ ืืช ืขื‘ืจื• ื”ืชื›ื ื•ืชื™.

ืคึฐึผืชึดื™ื—ึท

ื›ืœ ื”ืฉืžื•ืช ืฉื•ื ื•. ื”ืชืืžื•ืช ื”ืŸ ืืงืจืื™ื•ืช. ื”ื—ื•ืžืจ ื”ื•ื ื“ืขืชื• ื”ืื™ืฉื™ืช ืฉืœ ื”ืžื—ื‘ืจ ื‘ืœื‘ื“.

ื•ื™ืชื•ืจ ืขืœ ืื—ืจื™ื•ืช: ื‘ืกื“ืจืช ื”ืžืืžืจื™ื ื”ืžืชื•ื›ื ื ืช ืœื ื™ื”ื™ื” ืชื™ืื•ืจ ืžืคื•ืจื˜ ื•ืžื“ื•ื™ืง ืฉืœ ื”ื˜ื‘ืœืื•ืช ื•ื”ืชืกืจื™ื˜ื™ื ืฉื‘ื”ื ื ืขืฉื” ืฉื™ืžื•ืฉ. ืœื ื ื™ืชืŸ ืœื”ืฉืชืžืฉ ื‘ื—ื•ืžืจื™ื ืžื™ื“ "ื›ืžื•ืช ืฉื”ื".
ืจืืฉื™ืช, ื‘ืฉืœ ื›ืžื•ืช ื”ื—ื•ืžืจ ื”ื’ื“ื•ืœื”,
ืฉื ื™ืช, ื‘ื’ืœืœ ื”ื—ื“ื•ืช ืขื ื‘ืกื™ืก ื”ื™ื™ืฆื•ืจ ืฉืœ ืœืงื•ื— ืืžื™ืชื™.
ืœื›ืŸ, ืจืง ืจืขื™ื•ื ื•ืช ื•ืชื™ืื•ืจื™ื ื‘ืฆื•ืจื” ื”ื›ืœืœื™ืช ื‘ื™ื•ืชืจ ื™ื™ื ืชื ื• ื‘ืžืืžืจื™ื.
ืื•ืœื™ ื‘ืขืชื™ื“ ื”ืžืขืจื›ืช ืชื’ื“ืœ ืœืจืžืช ืคืจืกื•ื ื‘- GitHub, ืื• ืื•ืœื™ ืœื. ื”ื–ืžืŸ ื™ืจืื”.

ืชื—ื™ืœืช ื”ืกื™ืคื•ืจ-ืืชื” ื–ื•ื›ืจ ืื™ืš ื”ื›ืœ ื”ืชื—ื™ืœ".
ืžื” ืงืจื” ื›ืชื•ืฆืื” ืžื›ืš, ื‘ืžื•ื ื—ื™ื ื›ืœืœื™ื™ื ื‘ื™ื•ืชืจ - "ืกื™ื ืชื–ื” ื›ืื—ืช ื”ืฉื™ื˜ื•ืช ืœืฉื™ืคื•ืจ ื‘ื™ืฆื•ืขื™ PostgreSQLยป

ืœืžื” ืื ื™ ืฆืจื™ืš ืืช ื›ืœ ื–ื”?

ื•ื‘ื›ืŸ, ืจืืฉื™ืช, ื›ื“ื™ ืœื ืœืฉื›ื•ื— ืืช ืขืฆืžืš, ืœื–ื›ื•ืจ ืืช ื™ืžื™ ื”ื–ื•ื”ืจ ื‘ืคื ืกื™ื”.
ืฉื ื™ืช, ืœืกื“ืจ ืืช ืžื” ืฉื ื›ืชื‘. ื›ื‘ืจ ืœืขืฆืžื™, ืœืคืขืžื™ื ืื ื™ ืžืชื—ื™ืœ ืœื”ืชื‘ืœื‘ืœ ื•ืœืฉื›ื•ื— ื—ืœืงื™ื ื ืคืจื“ื™ื.

ื•ื‘ื›ืŸ, ื•ื”ื›ื™ ื—ืฉื•ื‘ - ืคืชืื•ื ื–ื” ื™ื›ื•ืœ ืœื”ื•ืขื™ืœ ืœืžื™ืฉื”ื• ื•ืœืขื–ื•ืจ ืœื ืœื”ืžืฆื™ื ืืช ื”ื’ืœื’ืœ ืžื—ื“ืฉ ื•ืœื ืœืืกื•ืฃ ืžื’ืจืคื”. ื‘ืžื™ืœื™ื ืื—ืจื•ืช, ืฉืคืจื• ืืช ื”ืงืืจืžื” ืฉืœื›ื (ืœื ื—ื‘ืจื•ื‘ืกืงื™). ื›ื™ ื”ื“ื‘ืจ ื”ื›ื™ ื™ืงืจ ื‘ืขื•ืœื ื”ื–ื” ื”ื•ื ืจืขื™ื•ื ื•ืช. ื”ืขื™ืงืจ ืœืžืฆื•ื ืจืขื™ื•ืŸ. ื•ืœืชืจื’ื ืืช ื”ืจืขื™ื•ืŸ ืœืžืฆื™ืื•ืช ื–ื• ื›ื‘ืจ ื‘ืขื™ื” ื˜ื›ื ื™ืช ื’ืจื™ื“ื.

ืื– ื‘ื•ืื• ื ืชื—ื™ืœ ืœืื˜...

ื ื™ืกื•ื— ื”ื‘ืขื™ื”.

ื–ืžื™ืŸ:

PostgreSQL(10.5), ืขื•ืžืก ืžืขื•ืจื‘ (OLTP+DSS), ืขื•ืžืก ื‘ื™ื ื•ื ื™ ืขื“ ืงืœ, ืžืชืืจื— ื‘ืขื ืŸ AWS.
ืื™ืŸ ื ื™ื˜ื•ืจ ืžืกื“ ื ืชื•ื ื™ื, ื ื™ื˜ื•ืจ ืชืฉืชื™ื•ืช ืžื•ืฆื’ ื›ื›ืœื™ AWS ืกื˜ื ื“ืจื˜ื™ื™ื ื‘ืชืฆื•ืจื” ืžื™ื ื™ืžืœื™ืช.

ื ื“ืจืฉ:

ืขืงื•ื‘ ืื—ืจ ื”ื‘ื™ืฆื•ืขื™ื ื•ื”ืกื˜ื˜ื•ืก ืฉืœ ืžืกื“ ื”ื ืชื•ื ื™ื, ืžืฆื ื•ืงื‘ืœ ืžื™ื“ืข ืจืืฉื•ื ื™ ื›ื“ื™ ืœื™ื™ืขืœ ืฉืื™ืœืชื•ืช ืžืกื“ ื ืชื•ื ื™ื ื›ื‘ื“ื•ืช.

ื”ืงื“ืžื” ืงืฆืจื” ืื• ื ื™ืชื•ื— ืคืชืจื•ื ื•ืช

ืจืืฉื™ืช, ื ื ืกื” ืœื ืชื— ืืช ื”ืืคืฉืจื•ื™ื•ืช ืœืคืชืจื•ืŸ ื”ื‘ืขื™ื” ืžื ืงื•ื“ืช ืžื‘ื˜ ืฉืœ ื ื™ืชื•ื— ื”ืฉื•ื•ืืชื™ ืฉืœ ื”ื™ืชืจื•ื ื•ืช ื•ื”ืฆืจื•ืช ืœืžื”ื ื“ืก, ื•ืœืชืช ืœืžื™ ืฉืืžื•ืจ ืœื”ื™ื•ืช ื‘ืจืฉื™ืžืช ื”ืฆื•ื•ืช ืœื”ืชืžื•ื“ื“ ืขื ื”ื™ืชืจื•ื ื•ืช ื•ื”ื”ืคืกื“ื™ื. ืฉืœ ื”ื ื™ื”ื•ืœ.

ืืคืฉืจื•ืช 1 - "ืขื‘ื•ื“ื” ืœืคื™ ื“ืจื™ืฉื”"

ืื ื—ื ื• ืžืฉืื™ืจื™ื ื”ื›ืœ ื›ืžื• ืฉื”ื•ื. ื‘ืžื™ื“ื” ื•ื”ืœืงื•ื— ืœื ืžืจื•ืฆื” ืžืžืฉื”ื• ื‘ืžืฆื‘ ื”ื‘ืจื™ืื•ืชื™, ื”ื‘ื™ืฆื•ืขื™ื ืฉืœ ื‘ืกื™ืก ื”ื ืชื•ื ื™ื ืื• ื”ืืคืœื™ืงืฆื™ื”, ื”ื•ื ื™ื•ื“ื™ืข ืขืœ ื›ืš ืœืžื”ื ื“ืกื™ ื”-DBA ื‘ืžื™ื™ืœ ืื• ื‘ื™ืฆื™ืจืช ืชืงืœื” ื‘ืงื•ืคื”.
ืžื”ื ื“ืก, ืœืื—ืจ ืฉืงื™ื‘ืœ ื”ื•ื“ืขื”, ื™ื‘ื™ืŸ ืืช ื”ื‘ืขื™ื”, ื™ืฆื™ืข ืคืชืจื•ืŸ ืื• ื™ื’ื ื– ืืช ื”ื‘ืขื™ื”, ื‘ืชืงื•ื•ื” ืฉื”ื›ืœ ื™ืคืชืจ ืžืขืฆืžื•, ื•ืžืžื™ืœื ื”ื›ืœ ื™ื™ืฉื›ื— ื‘ืžื”ืจื”.
ื’'ื™ื ื’'ืจ ื•ืกื•ืคื’ื ื™ื•ืช, ื—ื‘ื•ืจื•ืช ื•ื‘ืœื™ื˜ื•ืชื’'ื™ื ื’'ืจ ื•ืกื•ืคื’ื ื™ื•ืช:
1. ืฉื•ื ื“ื‘ืจ ื ื•ืกืฃ ืœืขืฉื•ืช
2. ืชืžื™ื“ ื™ืฉ ื”ื–ื“ืžื ื•ืช ืœืฆืืช ื•ืœื”ืชืœื›ืœืš.
3. ื”ืจื‘ื” ื–ืžืŸ ืฉืืชื” ื™ื›ื•ืœ ืœื‘ืœื•ืช ื‘ืขืฆืžืš.
ื—ื‘ื•ืจื•ืช ื•ื‘ืœื™ื˜ื•ืช:
1. ื‘ืžื•ืงื“ื ืื• ื‘ืžืื•ื—ืจ, ื”ืœืงื•ื— ื™ื—ืฉื•ื‘ ืขืœ ืžื”ื•ืช ื”ื”ื•ื•ื™ื” ื•ื”ืฆื“ืง ื”ืื•ื ื™ื‘ืจืกืœื™ ื‘ืขื•ืœื ื”ื–ื” ื•ืฉื•ื‘ ื™ืฉืืœ ืืช ืขืฆืžื• ืืช ื”ืฉืืœื” โ€“ ืœืžื” ืื ื™ ืžืฉืœื ืœื• ืืช ื”ื›ืกืฃ ืฉืœื™? ื”ืชื•ืฆืื” ืชืžื™ื“ ื–ื”ื” โ€“ ื”ืฉืืœื” ื”ื™ื—ื™ื“ื” ื”ื™ื ืžืชื™ ื”ืœืงื•ื— ืžืฉืชืขืžื ื•ื ื•ืคืฃ ืœืฉืœื•ื. ื•ื”ืžื–ื™ืŸ ืจื™ืง. ื–ื” ืขืฆื•ื‘.
2. ื”ืคื™ืชื•ื— ืฉืœ ืžื”ื ื“ืก ื”ื•ื ืืคืก.
3. ืงืฉื™ื™ื ื‘ืชื–ืžื•ืŸ ืขื‘ื•ื“ื” ื•ื˜ืขื™ื ื”

ืืคืฉืจื•ืช 2 - "ืœืจืงื•ื“ ืขื ื˜ืžื‘ื•ืจื™ื ื™ื, ืœื ืขื•ืœ ื•ืœื ืขื•ืœ ื ืขืœื™ื™ื"

ืคืกืงื” 1-ืœืžื” ืื ื—ื ื• ืฆืจื™ื›ื™ื ืžืขืจื›ืช ื ื™ื˜ื•ืจ, ื ืงื‘ืœ ืืช ื›ืœ ื”ื‘ืงืฉื•ืช. ืื ื—ื ื• ืžืฉื™ืงื™ื ื—ื‘ื•ืจื” ืฉืœ ื›ืœ ืžื™ื ื™ ืฉืื™ืœืชื•ืช ืœืžื™ืœื•ืŸ ื”ื ืชื•ื ื™ื ื•ืœืชืฆื•ื’ื•ืช ื“ื™ื ืžื™ื•ืช, ืžืคืขื™ืœื™ื ื›ืœ ืžื™ื ื™ ืžื•ื ื™ื, ืžื‘ื™ืื™ื ื”ื›ืœ ืœื˜ื‘ืœืื•ืช, ืžื ืชื—ื™ื ืžืขืช ืœืขืช ืจืฉื™ืžื•ืช ื•ื˜ื‘ืœืื•ืช, ื›ื‘ื™ื›ื•ืœ. ื›ืชื•ืฆืื” ืžื›ืš, ื™ืฉ ืœื ื• ื’ืจืคื™ื, ื˜ื‘ืœืื•ืช, ื“ื•ื—ื•ืช ื™ืคื™ื ืื• ืœื ืžืื•ื“. ื”ืขื™ืงืจ - ื–ื” ื™ื”ื™ื” ื™ื•ืชืจ, ื™ื•ืชืจ.
ืคืกืงื” 2-ืœื™ืฆื•ืจ ืคืขื™ืœื•ืช-ืœื”ืคืขื™ืœ ืืช ื”ื ื™ืชื•ื— ืฉืœ ื›ืœ ื–ื”.
ืคืกืงื” 3-ืื ื—ื ื• ืžื›ื™ื ื™ื ืžืกืžืš ืžืกื•ื™ื, ืื ื—ื ื• ืงื•ืจืื™ื ืœืžืกืžืš ื”ื–ื”, ื‘ืคืฉื˜ื•ืช - "ืื™ืš ืื ื—ื ื• ืžืฆื™ื™ื“ื™ื ืืช ื‘ืกื™ืก ื”ื ืชื•ื ื™ื".
ืคืกืงื” 4- ื”ืœืงื•ื—, ืฉืจื•ืื” ืืช ื›ืœ ื”ื”ื•ื“ ื”ื–ื” ืฉืœ ื”ื’ืจืคื™ื ื•ื”ื“ืžื•ื™ื•ืช, ื ืžืฆื ื‘ื‘ื™ื˜ื—ื•ืŸ ื ืื™ื‘ื™ ื™ืœื“ื•ืชื™ - ืขื›ืฉื™ื• ื”ื›ืœ ื™ืขื‘ื•ื“ ืœื ื•, ื‘ืงืจื•ื‘. ื•ื‘ืงืœื•ืช ื•ืœืœื ื›ืื‘ ื ืคืจื“ื™ื ืžื”ืžืฉืื‘ื™ื ื”ื›ืกืคื™ื™ื ืฉืœื”ื. ื”ื”ื ื”ืœื” ื’ื ื‘ื˜ื•ื—ื” ืฉื”ืžื”ื ื“ืกื™ื ืฉืœื ื• ืขื•ื‘ื“ื™ื ืงืฉื”. ื˜ืขื™ื ื” ืžืงืกื™ืžืœื™ืช.
ืคืกืงื” 5- ื—ื–ื•ืจ ืขืœ ืฉืœื‘ 1 ื‘ืื•ืคืŸ ืงื‘ื•ืข.
ื’'ื™ื ื’'ืจ ื•ืกื•ืคื’ื ื™ื•ืช, ื—ื‘ื•ืจื•ืช ื•ื‘ืœื™ื˜ื•ืชื’'ื™ื ื’'ืจ ื•ืกื•ืคื’ื ื™ื•ืช:
1. ื—ื™ื™ ื”ืžื ื”ืœื™ื ื•ื”ืžื”ื ื“ืกื™ื ืคืฉื•ื˜ื™ื, ืฆืคื•ื™ื™ื ื•ืžืœืื™ ืคืขื™ืœื•ืช. ื”ื›ืœ ืžื–ืžื–ื, ื›ื•ืœื ืขืกื•ืงื™ื.
2. ื’ื ื—ื™ื™ ื”ืœืงื•ื— ืœื ืจืขื™ื โ€“ ื”ื•ื ืชืžื™ื“ ื‘ื˜ื•ื— ืฉืฆืจื™ืš ืงืฆืช ืกื‘ืœื ื•ืช ื•ื”ื›ืœ ื™ืกืชื“ืจ. ืœื ืžืฉืชืคืจ, ื˜ื•ื‘, ื˜ื•ื‘ - ื”ืขื•ืœื ื”ื–ื” ืœื ื”ื•ื’ืŸ, ื‘ื—ื™ื™ื ื”ื‘ืื™ื - ืžื–ืœ.
ื—ื‘ื•ืจื•ืช ื•ื‘ืœื™ื˜ื•ืช:
1. ื‘ืžื•ืงื“ื ืื• ื‘ืžืื•ื—ืจ, ื™ื”ื™ื” ืกืคืง ื—ื›ื ื™ื•ืชืจ ืฉืœ ืฉื™ืจื•ืช ื“ื•ืžื” ืฉื™ืขืฉื” ืืช ืื•ืชื• ื”ื“ื‘ืจ, ืื‘ืœ ืงืฆืช ื™ื•ืชืจ ื–ื•ืœ. ื•ืื ื”ืชื•ืฆืื” ื–ื”ื”, ืœืžื” ืœืฉืœื ื™ื•ืชืจ. ืžื” ืฉืฉื•ื‘ ื™ื•ื‘ื™ืœ ืœื”ื™ืขืœืžื•ืช ื”ืžื–ื™ืŸ.
2. ื–ื” ืžืฉืขืžื. ื›ืžื” ืžืฉืขืžื ื›ืœ ืคืขื™ืœื•ืช ืงื˜ื ื” ื•ืžืฉืžืขื•ืชื™ืช.
3. ื›ืžื• ื‘ื’ืจืกื” ื”ืงื•ื“ืžืช - ืœืœื ืคื™ืชื•ื—. ืื‘ืœ ืขื‘ื•ืจ ืžื”ื ื“ืก, ื”ืžื™ื ื•ืก ื”ื•ื ืฉื‘ื ื™ื’ื•ื“ ืœืืคืฉืจื•ืช ื”ืจืืฉื•ื ื”, ื›ืืŸ ืืชื” ืฆืจื™ืš ืœื™ืฆื•ืจ ื›ืœ ื”ื–ืžืŸ IDB. ื•ื–ื” ืœื•ืงื— ื–ืžืŸ. ืืฉืจ ื ื™ืชืŸ ืœื‘ื–ื‘ื– ืœื˜ื•ื‘ืช ื™ืงื™ืจื›ื. ื›ื™ ืืชื” ืœื ื™ื›ื•ืœ ืœื˜ืคืœ ื‘ืขืฆืžืš, ืœื›ื•ืœื ืื›ืคืช ืžืžืš.

ืืคืฉืจื•ืช 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 ื‘ืฉืœื‘ ื”ืจืืฉื•ื ื™ ื•ื›ื“ื™ ืœื”ื’ื“ื™ืจ ืžื“ื“ื™ื ื•ื ื™ื˜ื•ืจ ื‘ืขืชื™ื“
  • ื‘ืžืืจื— ื”ื ื™ื˜ื•ืจ, ืื ื• ื™ื•ืฆืจื™ื ืงื‘ื•ืฆื” ืฉืœ ืกืงืจื™ืคื˜ื™ื ืฉืœ bash, ื›ื•ืœืœ ืืœื” ืœื™ืฆื™ืจืช ืชืงืจื™ื•ืช ื‘ืžืขืจื›ืช ื”ื›ืจื˜ื™ืกื™ื.

ืฉื•ืœื—ื ื•ืช ืฉื™ืจื•ืช

ืžืœื›ืชื—ื™ืœื”, ERD ืžืคื•ืฉื˜ ื‘ืื•ืคืŸ ืกื›ืžื˜ื™, ืžื” ืงืจื” ื‘ืกื•ืคื• ืฉืœ ื“ื‘ืจ:
ื ื™ื˜ื•ืจ ื‘ื™ืฆื•ืขื™ื ืฉืœ ืฉืื™ืœืชื•ืช PostgreSQL. ื—ืœืง 1 - ื“ื™ื•ื•ื—
ืชื™ืื•ืจ ืงืฆืจ ืฉืœ ื”ื˜ื‘ืœืื•ืชื ืงื•ื“ืช ืกื™ื•ื - ืžืืจื—, ื ืงื•ื“ืช ื—ื™ื‘ื•ืจ ืœืžื•ืคืข
ืžืกื“ ื ืชื•ื ื™ื - ืืคืฉืจื•ื™ื•ืช ืžืกื“ ื ืชื•ื ื™ื
pg_stat_history - ื˜ื‘ืœื” ื”ื™ืกื˜ื•ืจื™ืช ืœืื—ืกื•ืŸ ืชืžื•ื ื•ืช ืžืฆื‘ ื–ืžื ื™ื•ืช ืฉืœ ืชืฆื•ื’ืช pg_stat_statements ืฉืœ ืžืกื“ ื”ื ืชื•ื ื™ื ื”ื™ืขื“
metric_glossary - ืžื™ืœื•ืŸ ืžื“ื“ื™ ื‘ื™ืฆื•ืขื™ื
metric_config - ืชืฆื•ืจื” ืฉืœ ืžื“ื“ื™ื ื‘ื•ื“ื“ื™ื
ืžื˜ืจื™ - ืžื“ื“ ืกืคืฆื™ืคื™ ืœื‘ืงืฉื” ืฉื ืžืฆืืช ื‘ืžืขืงื‘
metric_alert_history - ื”ื™ืกื˜ื•ืจื™ื” ืฉืœ ืื–ื”ืจื•ืช ื‘ื™ืฆื•ืขื™ื
log_query - ื˜ื‘ืœืช ืฉื™ืจื•ืช ืœืื—ืกื•ืŸ ืจืฉื•ืžื•ืช ืžื ื•ืชื—ื•ืช ืžืงื•ื‘ืฅ ื”ื™ื•ืžืŸ PostgreSQL ืฉื”ื•ืจื“ ืž-AWS
ื ืงื•ื“ืช ื”ืชื—ืœื” - ืคืจืžื˜ืจื™ื ืฉืœ ืคืจืง ื”ื–ืžืŸ ื”ืžืฉืžืฉ ื›ื‘ืกื™ืก
ืžื—ืกื•ื - ื”ื’ื“ืจืช ืžื“ื“ื™ื ืœื‘ื“ื™ืงืช ืžืฆื‘ ืžืกื“ ื”ื ืชื•ื ื™ื
checkpoint_alert_history - ื”ื™ืกื˜ื•ืจื™ื™ืช ืื–ื”ืจื” ืฉืœ ืžื“ื“ื™ ื‘ื“ื™ืงืช ืžืฆื‘ ืžืกื“ ื”ื ืชื•ื ื™ื
pg_stat_db_queries - ื˜ื‘ืœืช ืฉื™ืจื•ืช ืฉืœ ื‘ืงืฉื•ืช ืคืขื™ืœื•ืช
ื™ื•ืžืŸ ืคืขื™ืœื•ืช โ€” ื˜ื‘ืœืช ืฉื™ืจื•ืช ื™ื•ืžืŸ ืคืขื™ืœื•ืช
trap_oid - ื˜ื‘ืœืช ืฉื™ืจื•ืช ืชืฆื•ืจืช ืžืœื›ื•ื“ืช

ืฉืœื‘ 1 - ืื™ืกื•ืฃ ืกื˜ื˜ื™ืกื˜ื™ืงื•ืช ื‘ื™ืฆื•ืขื™ื ื•ืงื‘ืœ ื“ื•ื—ื•ืช

ื˜ื‘ืœื” ืžืฉืžืฉืช ืœืื—ืกื•ืŸ ืžื™ื“ืข ืกื˜ื˜ื™ืกื˜ื™. pg_stat_history
pg_stat_history ืžื‘ื ื” ื”ื˜ื‘ืœื”

                                          ืขืžื•ื“ื” "public.pg_stat_history" ื‘ื˜ื‘ืœื” | ื”ืงืœื“ | ืžืฉื ื”-----------------------+----------------------- --+---- -------------------------------- ืžื–ื”ื” | ืžืกืคืจ ืฉืœื | not null default nextval('pg_stat_history_id_seq'::regclass) snapshot_timestamp | ื—ื•ืชืžืช ื–ืžืŸ ืœืœื ืื–ื•ืจ ื–ืžืŸ | database_id | ืžืกืคืจ ืฉืœื | dbid | oid | userid | oid | queryid | bigint | ืฉืื™ืœืชื” | ื˜ืงืกื˜ | ืฉื™ื—ื•ืช | bigint | total_time | ื“ื™ื•ืง ื›ืคื•ืœ | min_time | ื“ื™ื•ืง ื›ืคื•ืœ | max_time | ื“ื™ื•ืง ื›ืคื•ืœ | ื–ืžืŸ_ืžืžื•ืฆืข | ื“ื™ื•ืง ื›ืคื•ืœ | stddev_time | ื“ื™ื•ืง ื›ืคื•ืœ | ืฉื•ืจื•ืช | bigint | shared_blks_hit | bigint | shared_blks_read | bigint | shared_blks_ืœื›ืœื•ืš | bigint | shared_blks_written | bigint | local_blks_hit | bigint | local_blks_read | bigint | local_blks_ืœื›ืœื•ืš | bigint | local_blks_written | bigint | temp_blks_read | bigint | temp_blks_written | bigint | blk_ื–ืžืŸ_ืงืจื™ืื” | ื“ื™ื•ืง ื›ืคื•ืœ | blk_ื–ืžืŸ_ื›ืชื™ื‘ื” | ื“ื™ื•ืง ื›ืคื•ืœ | baseline_id | ืžืกืคืจ ืฉืœื | ืื™ื ื“ืงืกื™ื: "pg_stat_history_pkey" PRIMARY KEY, btree (id) "database_idx" btree (database_id) "queryid_idx" btree (queryid) "snapshot_timestamp_idx" btree (snapshot_timestamp) ืื™ืœื•ืฆื™ื ืฉืœ ืžืคืชื— ื–ืจ: "database_ID_ID_FERENID" (database_ID_ID_FERENID) ) ื‘-DELETE CASCADE

ื›ืคื™ ืฉืืชื” ื™ื›ื•ืœ ืœืจืื•ืช, ื”ื˜ื‘ืœื” ื”ื™ื ืจืง ื ืชื•ื ื™ ืชืฆื•ื’ื” ืžืฆื˜ื‘ืจื™ื pg_stat_statements ื‘ืžืกื“ ื”ื ืชื•ื ื™ื ื”ื™ืขื“.

ื”ืฉื™ืžื•ืฉ ื‘ื˜ื‘ืœื” ื–ื• ื”ื•ื ืคืฉื•ื˜ ืžืื•ื“.

pg_stat_history ื™ื™ืฆื’ ืืช ื”ืกื˜ื˜ื™ืกื˜ื™ืงื” ื”ืžืฆื˜ื‘ืจืช ืฉืœ ื‘ื™ืฆื•ืข ืฉืื™ืœืชื” ืขื‘ื•ืจ ื›ืœ ืฉืขื”. ื‘ืชื—ื™ืœืช ื›ืœ ืฉืขื”, ืœืื—ืจ ืžื™ืœื•ื™ ื”ื˜ื‘ืœื”, ืกื˜ื˜ื™ืกื˜ื™ืงื” pg_stat_statements ืœืืคืก ืขื pg_stat_statements_reset().
ื”ืขืจื”: ื ืชื•ื ื™ื ืกื˜ื˜ื™ืกื˜ื™ื™ื ื ืืกืคื™ื ืขื‘ื•ืจ ื‘ืงืฉื•ืช ื‘ืื•ืจืš ืฉืœ ื™ื•ืชืจ ืžืฉื ื™ื™ื” ืื—ืช.
ืื›ืœื•ืก ื˜ื‘ืœืช 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 ;

D.B. ื–ืžืŸ

to_char(ืžืจื•ื•ื— '1 millisecond' * pg_total_stat_history_rec.total_time, 'HH24:MI:SS.MS')

ื–ืžืŸ ืงืœื˜/ืคืœื˜

to_char(ืžืจื•ื•ื— '1 millisecond' * ( 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) | dbtime % +----+-------------------------+------ --------------------+---------- | 1| 821760255| 2| .00001|00:03:23.141( 203141.681 ms.)| 5.42 | 2| 4152624390| 2| .00001|00:03:13.929( 193929.215 ms.)| 5.17 | 3| 1484454471| 4| .00001|00:02:09.129( 129129.057 ms.)| 3.44 | 4| 655729273| 1| .00000|00:02:01.869( 121869.981 MS.)| 3.25 | 5| 2460318461| 1| .00000|00:01:33.113( 93113.835 ms.)| 2.48 | 6| 2194493487| 4| .00001|00:00:17.377( 17377.868 ms.)| .46 | 7| 1053044345| 1| .00000|00:00:06.156( 6156.352 MS.)| .16 | 8| 3644780286| 1| .00000|00:00:01.063( 1063.830 ms.)| .03

TOP10 SQL ืœืคื™ ื–ืžืŸ ืงืœื˜/ืคืœื˜ ื›ื•ืœืœ

ื‘ืงืฉื”

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| ืฉื™ื—ื•ืช| ืฉื™ื—ื•ืช ื–ืžืŸ ืงืœื˜/ืคืœื˜ (ms)|db ื–ืžืŸ ืงืœื˜/ืคืœื˜ % +----+------+-----+------ -----+--------------------------------+----------- -- | 1| 4152624390| 2| .00001|00:08:31.616( 511616.592 ms.)| 31.06 ื‘ื™ื•ื ื™ | 2| 821760255| 2| .00001|00:08:27.099( 507099.036 MS.)| 30.78 | 3| 655729273| 1| .00000|00:05:02.209( 302209.137 ms.)| 18.35 | 4| 2460318461| 1| .00000|00:04:05.981( 245981.117 MS.)| 14.93 | 5| 1484454471| 4| .00001|00:00:39.144( 39144.221 MS.)| 2.38 | 6| 2194493487| 4| .00001|00:00:18.182( 18182.816 ms.)| 1.10 | 7| 1053044345| 1| .00000|00:00:16.611( 16611.722 ms.)| 1.01 | 8| 3644780286| 1| .00000|00:00:00.436( 436.205 MS.)| .03

TOP10 SQL ืœืคื™ ื–ืžืŸ ื‘ื™ืฆื•ืข ืžืงืกื™ืžืœื™

ื‘ืงืฉื”

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| max_time (ms) +----+-------------------+------+--------- --+---------------------------------------- | 1| 05.04.2019/01/03 4169:655729273| 00| 02| 01.869:121869.981:2( 04.04.2019 MS.) | 17| 00/4153/821760255 00:01| 41.570| 101570.841| 3:04.04.2019:16( 00 MS.) | 4146| 821760255/00/01 41.570:101570.841| 4| 04.04.2019| 16:00:4144( 4152624390 MS.) | 00| 01/36.964/96964.607 5:04.04.2019| 17| 00| 4151:4152624390:00( 01 ms.) | 36.964| 96964.607/6/05.04.2019 10:00| 4188| 1484454471| 00:01:33.452( 93452.150 ms.) | 7| 04.04.2019/17/00 4150:2460318461 | 00| 01| 33.113:93113.835:8( 04.04.2019 ms.) | 15| 00/4140/1484454471 00:00| 11.892| 11892.302| 9:04.04.2019:16( 00 ms.) | 4145| 1484454471/00/00 11.892:11892.302| 10| 04.04.2019| 17:00:4152( 1484454471 ms.) | 00| 00/11.892/11892.302 XNUMX:XNUMX| XNUMX| XNUMX| XNUMX:XNUMX:XNUMX( XNUMX ms.) | XNUMX| XNUMX/XNUMX/XNUMX XNUMX:XNUMX| XNUMX| XNUMX| XNUMX:XNUMX:XNUMX( XNUMX MS.)

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 | MIN TIME : 00:00:01.063 | ื–ืžืŸ ืžืงืกื™ืžืœื™ : 00:02:01.869 ------------------------------------------ ---------------------------- | ืžืฉืš ื“ืงื•ืช| ืžืฉืš ืžืงืกื™ืžื•ื| ืฉื™ื—ื•ืช +------------------------------------+------- ----------------------+---------- | 00:00:01.063( 1063.830 MS.) | 00:00:13.144( 13144.445 MS.) | 9 | 00:00:13.144( 13144.445 MS.) | 00:00:25.225( 25225.060 ms.) | 0 | 00:00:25.225( 25225.060 ms.) | 00:00:37.305( 37305.675 ms.) | 0 | 00:00:37.305( 37305.675 ms.) | 00:00:49.386( 49386.290 ms.) | 0 | 00:00:49.386( 49386.290 ms.) | 00:01:01.466( 61466.906 MS.) | 0 | 00:01:01.466( 61466.906 MS.) | 00:01:13.547( 73547.521 ms.) | 0 | 00:01:13.547( 73547.521 ms.) | 00:01:25.628( 85628.136 MS.) | 0 | 00:01:25.628( 85628.136 MS.) | 00:01:37.708( 97708.751 MS.) | 4 | 00:01:37.708( 97708.751 MS.) | 00:01:49.789( 109789.366 MS.) | 2 | 00:01:49.789( 109789.366 MS.) | 00:02:01.869( 121869.981 MS.) | 0

TOP10 ืชืžื•ื ื•ืช ื‘ื–ืง ืœืคื™ ืฉืื™ืœืชื” ืœืฉื ื™ื™ื”

ื‘ืงืฉื•ืช

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

ื˜ืงืกื˜ ืฉืœ ื›ืœ ื‘ื—ื™ืจืช SQL

ื‘ืงืฉื”

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

ื”ื•ืกืคืช ืชื’ื•ื‘ื”