Π‘Π»Π΅Π΄ Π³ΠΎΠ΄ΠΈΠ½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ, Π½ΠΎΠ²ΠΈΡΡ ΡΡΠ°Π±ΠΈΠ»Π΅Π½ ΠΊΠ»ΠΎΠ½ Π½Π° Π‘Π£ΠΠ PostgreSQL 14 Π±Π΅ΡΠ΅ ΠΏΡΠ±Π»ΠΈΠΊΡΠ²Π°Π½. ΠΠΊΡΡΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π·Π° Π½ΠΎΠ²ΠΈΡ ΠΊΠ»ΠΎΠ½ ΡΠ΅ ΠΈΠ·Π»ΠΈΠ·Π°Ρ Π² ΠΏΡΠΎΠ΄ΡΠ»ΠΆΠ΅Π½ΠΈΠ΅ Π½Π° ΠΏΠ΅Ρ Π³ΠΎΠ΄ΠΈΠ½ΠΈ Π΄ΠΎ Π½ΠΎΠ΅ΠΌΠ²ΡΠΈ 2026 Π³ΠΎΠ΄ΠΈΠ½Π°.
ΠΡΠ½ΠΎΠ²Π½ΠΈ Π½ΠΎΠ²ΠΎΠ²ΡΠ²Π΅Π΄Π΅Π½ΠΈΡ:
- ΠΠΎΠ±Π°Π²Π΅Π½Π° Π΅ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π·Π° Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ JSON Π΄Π°Π½Π½ΠΈ ΡΡΠ΅Π· ΠΈΠ·ΡΠ°Π·ΠΈ, Π½Π°ΠΏΠΎΠ΄ΠΎΠ±ΡΠ²Π°ΡΠΈ ΡΠ°Π±ΠΎΡΠ° Ρ ΠΌΠ°ΡΠΈΠ²ΠΈ: SELECT (β{ Β«postgresΒ»: { Β«releaseΒ»: 14 }}β::jsonb)[βpostgresβ][βreleaseβ]; SELECT * FROM test WHERE details[βattributesβ][βsizeβ] = βΒ»mediumΒ»β;
Π‘ΡΡΠΈΡΡ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ Π΅ ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ°Π½ ΠΈ Π·Π° Π΄Π°Π½Π½ΠΈ Π²ΡΠ² ΡΠΎΡΠΌΠ°Ρ ΠΊΠ»ΡΡ/ΡΡΠΎΠΉΠ½ΠΎΡΡ, ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΡΠ½ΠΈ ΠΎΡ ΡΠΈΠΏΠ° hstore. ΠΠΎΠ΄ΠΎΠ±Π΅Π½ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ Π΅ ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ°Π½ ΠΏΡΡΠ²ΠΎΠ½Π°ΡΠ°Π»Π½ΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΡΠ½ΠΈΠ²Π΅ΡΡΠ°Π»Π΅Π½ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊ, ΠΊΠΎΠΉΡΠΎ Π² Π±ΡΠ΄Π΅ΡΠ΅ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ ΠΈ Π·Π° Π΄ΡΡΠ³ΠΈ ΡΠΈΠΏΠΎΠ²Π΅. ΠΡΠΈΠΌΠ΅Ρ Π·Π° ΡΠΈΠΏΠ° hstore: INSERT INTO mytable VALUES (βa=>b, c=>dβ); SELECT h[βaβ] FROM mytable; UPDATE mytable SET h[βcβ] = βnewβ;
- Π‘Π΅ΠΌΠ΅ΠΉΡΡΠ²ΠΎΡΠΎ ΠΎΡ ΡΠΈΠΏΠΎΠ²Π΅ Π·Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π΅ Π½Π° Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ΠΈ Π΅ ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΎ Ρ Π½ΠΎΠ²ΠΈ ΡΠΈΠΏΠΎΠ²Π΅ βmultirangeβ, ΠΊΠΎΠΈΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π°Ρ Π·Π°Π΄Π°Π²Π°Π½Π΅ Π½Π° ΠΏΠΎΠ΄ΡΠ΅Π΄Π΅Π½ΠΈ ΡΠΏΠΈΡΡΡΠΈ ΠΎΡ Π½Π΅ΠΏΠΎΠΊΡΠΈΠ²Π°ΡΠΈ ΡΠ΅ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ΠΈ ΠΎΡ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ. Π Π΄ΠΎΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΡΠΌ Π²ΡΠ΅ΠΊΠΈ ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π°Ρ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅Π½ ΡΠΈΠΏ Π΅ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ ΡΠ²ΠΎΡ multirange ΡΠΈΠΏ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠΈΠΏΡΡ βint4rangeβ ΠΎΡΠ³ΠΎΠ²Π°ΡΡ Π½Π° βint4multirangeβ, Π° βdaterangeβ β Π½Π° βdatemultirangeβ. ΠΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° Π½ΠΎΠ²ΠΈΡΠ΅ ΡΠΈΠΏΠΎΠ²Π΅ ΠΎΠΏΡΠΎΡΡΡΠ²Π° ΡΠΎΡΠΌΡΠ»ΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° Π·Π°ΡΠ²ΠΊΠΈ, ΠΌΠ°Π½ΠΈΠΏΡΠ»ΠΈΡΠ°ΡΠΈ ΡΡΡ ΡΠ»ΠΎΠΆΠ½ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎΡΡΠΈ ΠΎΡ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ΠΈ. SELECT β{[3,7), [8,9)}β::int4multirange; SELECT nummultirange(numrange(1.0, 14.0), numrange(20.0, 25.0));
- ΠΠ½Π΅ΡΠ΅Π½ΠΈ ΡΠ° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ Π·Π° ΠΏΠΎΠ΄ΠΎΠ±ΡΡΠ²Π°Π½Π΅ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ° Π½Π° Π²ΠΈΡΠΎΠΊΠΎ Π½Π°ΡΠΎΠ²Π°ΡΠ΅Π½ΠΈ ΡΠΈΡΡΠ΅ΠΌΠΈ, ΠΎΠ±ΡΠ°Π±ΠΎΡΠ²Π°ΡΠΈ Π³ΠΎΠ»ΡΠΌ Π±ΡΠΎΠΉ Π²ΡΡΠ·ΠΊΠΈ. Π Π½ΡΠΊΠΎΠΈ ΡΠ΅ΡΡΠΎΠ²Π΅ Π΅ Π½Π°Π±Π»ΡΠ΄Π°Π²Π°Π½ Π΄Π²ΠΎΠ΅Π½ ΡΡΡΡ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ°.
- ΠΠΎΠ²ΠΈΡΠ΅Π½Π° Π΅ Π΅ΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΡΡΡΠ° Π½Π° ΡΠ°Π±ΠΎΡΠ° Π½Π° ΠΈΠ½Π΄Π΅ΠΊΡΠΈ B-tree ΠΈ Π΅ ΡΠ΅ΡΠ΅Π½ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡΡ Ρ ΡΠ²Π΅Π»ΠΈΡΠ°Π²Π°Π½Π΅ΡΠΎ Π½Π° ΠΈΠ½Π΄Π΅ΠΊΡΠΈ ΠΏΡΠΈ ΡΠ΅ΡΡΠΎ ΠΎΠ±Π½ΠΎΠ²ΡΠ²Π°Π½Π΅ Π½Π° ΡΠ°Π±Π»ΠΈΡΠΈ.
- ΠΠΎΠ±Π°Π²Π΅Π½Π° Π΅ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π·Π° ΡΠ°Π±ΠΎΡΠ° Π½Π° ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠ° ΡΡΡΠ°Π½Π° (ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ°Π½Π° Π½Π° Π½ΠΈΠ²ΠΎ libpq) ΡΠ΅ΠΆΠΈΠΌ Π½Π° ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠ½Π° (pipeline) ΠΏΡΠ΅Π΄Π°Π²Π°Π½Π΅ Π½Π° Π·Π°ΡΠ²ΠΊΠΈ, ΠΊΠΎΠ΅ΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π·Π½Π°ΡΠΈΡΠ΅Π»Π½ΠΎ ΡΡΠΊΠΎΡΡΠ²Π°Π½Π΅ Π½Π° ΡΡΠ΅Π½Π°ΡΠΈΠΈ Π½Π° ΡΠ°Π±ΠΎΡΠ° Ρ ΠΠ, ΡΠ²ΡΡΠ·Π°Π½ΠΈ Ρ ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ΡΠΎ Π½Π° Π³ΠΎΠ»ΡΠΌ Π±ΡΠΎΠΉ ΠΌΠ°Π»ΠΊΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π·Π° Π·Π°ΠΏΠΈΡ (INSERT/UPDATE/DELETE) ΡΡΠ΅Π· ΠΈΠ·ΠΏΡΠ°ΡΠ°Π½Π΅ Π½Π° ΡΠ»Π΅Π΄Π²Π°ΡΠ°ΡΠ° Π·Π°ΡΠ²ΠΊΠ°, Π±Π΅Π· Π΄Π° ΡΠ΅ ΡΠ°ΠΊΠ° ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠ° ΠΎΡ ΠΏΡΠ΅Π΄ΠΈΡΠ½Π°ΡΠ°. Π Π΅ΠΆΠΈΠΌΡΡ ΡΡΡΠΎ ΡΠ°ΠΊΠ° ΠΏΠΎΠΌΠ°Π³Π° Π·Π° ΡΡΠΊΠΎΡΡΠ²Π°Π½Π΅ Π½Π° ΡΠ°Π±ΠΎΡΠ°ΡΠ° ΠΏΡΠΈ Π²ΡΡΠ·ΠΊΠΈ Ρ Π³ΠΎΠ»Π΅ΠΌΠΈ Π·Π°ΠΊΡΡΠ½Π΅Π½ΠΈΡ Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠ°.
- Π Π°Π·ΡΠΈΡΠ΅Π½ΠΈ ΡΠ° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈΡΠ΅ Π·Π° ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ, Π²ΠΊΠ»ΡΡΠ²Π°ΡΠΈ Π½ΡΠΊΠΎΠ»ΠΊΠΎ. ΡΡΡΠ²ΡΡΠΈ PostgreSQL. Π ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π½Π° Π»ΠΎΠ³ΠΈΡΠ½Π°ΡΠ° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡ ΡΠ΅ ΠΏΠΎΡΠ²ΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π·Π° ΠΈΠ·ΠΏΡΠ°ΡΠ°Π½Π΅ Π½Π° ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΠ° Π² ΠΏΡΠΎΡΠ΅Ρ Π½Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅, Π² ΠΏΠΎΡΠΎΠΊΠΎΠ² ΡΠ΅ΠΆΠΈΠΌ, ΠΊΠΎΠ΅ΡΠΎ Π·Π½Π°ΡΠΈΡΠ΅Π»Π½ΠΎ ΡΠ²Π΅Π»ΠΈΡΠ°Π²Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ° Π½Π° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΡΠ° Π½Π° Π³ΠΎΠ»Π΅ΠΌΠΈ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ. ΠΡΠ²Π΅Π½ ΡΠΎΠ²Π°, Π»ΠΎΠ³ΠΈΡΠ½ΠΎΡΠΎ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡΠ°Π½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈ, ΠΏΠΎΡΡΡΠΏΠ²Π°ΡΠΈ Π² ΠΏΡΠΎΡΠ΅ΡΠ° Π½Π° Π»ΠΎΠ³ΠΈΡΠ½Π°ΡΠ° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡ, Π΅ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠ°Π½ΠΎ.
- Π ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠ° Π·Π° ΡΠ²ΡΡΠ·Π²Π°Π½Π΅ Π½Π° Π²ΡΠ½ΡΠ½ΠΈ ΡΠ°Π±Π»ΠΈΡΠΈ Foreign Data Wrapper (postgres_fdw) Π΅ Π΄ΠΎΠ±Π°Π²Π΅Π½Π° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π·Π° ΠΏΠ°ΡΠ°Π»Π΅Π»Π½Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° Π·Π°ΡΠ²ΠΊΠΈ, ΠΊΠΎΡΡΠΎ Π² ΠΌΠΎΠΌΠ΅Π½ΡΠ° Π΅ ΠΏΡΠΈΠ»ΠΎΠΆΠΈΠΌΠ° ΡΠ°ΠΌΠΎ ΠΏΡΠΈ ΡΠ²ΡΡΠ·Π²Π°Π½Π΅ Ρ Π΄ΡΡΠ³ΠΈ PostgreSQL ΡΡΡΠ²ΡΡΠΈ. Π‘ΡΡΠΎ ΡΠ°ΠΊΠ° Π² postgres_fdw Π΅ Π΄ΠΎΠ±Π°Π²Π΅Π½Π° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π·Π° Π΄ΠΎΠ±Π°Π²ΡΠ½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈ Π²ΡΠ² Π²ΡΠ½ΡΠ½ΠΈ ΡΠ°Π±Π»ΠΈΡΠΈ Π² ΠΏΠ°ΠΊΠ΅ΡΠ΅Π½ ΡΠ΅ΠΆΠΈΠΌ ΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π·Π° ΠΈΠΌΠΏΠΎΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΡΠ΅ΠΊΡΠΈΠΎΠ½ΠΈΡΠ°Π½ΠΈ ΡΠ°Π±Π»ΠΈΡΠΈ ΡΡΠ΅Π· ΡΠΊΠ°Π·Π°Π½ΠΈΠ΅ Π½Π° Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ²Π°ΡΠ° 'IMPORT FOREIGN SCHEMA'.
- ΠΠ½Π΅ΡΠ΅Π½ΠΈ ΡΠ° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ Π² ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡΡΠ° Π½Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡΡΠ° VACUUM (ΡΡΠ±ΠΈΡΠ°Π½Π΅ Π½Π° Π±ΠΎΠΊΠ»ΡΠΊ ΠΈ ΠΎΠΏΠ°ΠΊΠΎΠ²Π°Π½Π΅ Π½Π° Π΄ΠΈΡΠΊΠΎΠ²ΠΎΡΠΎ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅). ΠΠΎΠ±Π°Π²Π΅Π½ Π΅ ΡΠΏΠ΅ΡΠ΅Π½ ΡΠ΅ΠΆΠΈΠΌ Π½Π° ΠΏΠΎΡΠΈΡΡΠ²Π°Π½Π΅ ('emergency mode'), ΠΏΡΠΎΠΏΡΡΠΊΠ°Ρ Π½Π΅Π·Π½Π°ΡΠΈΡΠ΅Π»Π½ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΏΠΎ ΠΏΠΎΡΠΈΡΡΠ²Π°Π½Π΅, Π°ΠΊΠΎ ΡΠ΅ ΡΡΠ·Π΄Π°Π²Π°Ρ ΡΡΠ»ΠΎΠ²ΠΈΡ Π·Π° ΠΏΡΠ΅ΠΌΠΈΠ½Π°Π²Π°Π½Π΅ Π½Π° Π²ΡΠΎΡΠΈ ΡΠΈΠΊΡΠ» Π½Π° Π½ΠΎΠΌΠ΅ΡΠ° Π½Π° ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠΈΡΠ΅ Π½Π° ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈΡΠ΅ (transaction ID wraparound). ΠΠ°ΠΌΠ°Π»Π΅Π½ΠΈ ΡΠ° ΡΠ°Π·Ρ ΠΎΠ΄ΠΈΡΠ΅ Π·Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° ΠΈΠ½Π΄Π΅ΠΊΡΠΈ Π² ΡΠΎΡΠΌΠ°Ρ B-Tree. ΠΠ½Π°ΡΠΈΡΠ΅Π»Π½ΠΎ Π΅ ΡΡΠΊΠΎΡΠ΅Π½ΠΎ ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ΡΠΎ Π½Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡΡΠ° 'ANALYZE', ΡΡΠ±ΠΈΡΠ°ΡΠ° ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠ° Π·Π° ΡΠ°Π±ΠΎΡΠ°ΡΠ° Π½Π° ΠΠ.
- ΠΠΎΠ±Π°Π²Π΅Π½Π° Π΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π·Π° Π½Π°ΡΡΡΠΎΠΉΠΊΠ° Π½Π° ΠΌΠ΅ΡΠΎΠ΄Π° Π·Π° ΠΊΠΎΠΌΠΏΡΠ΅ΡΠΈΡ, ΠΏΡΠΈΠ»Π°Π³Π°Π½ Π² ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ° TOAST, ΠΎΡΠ³ΠΎΠ²ΠΎΡΠ½Π° Π·Π° ΡΡΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ΡΠΎ Π½Π° Π³ΠΎΠ»Π΅ΠΌΠΈ Π΄Π°Π½Π½ΠΈ, ΠΊΠ°ΡΠΎ ΡΠ΅ΠΊΡΡΠΎΠ²ΠΈ Π±Π»ΠΎΠΊΠΎΠ²Π΅ ΠΈΠ»ΠΈ Π³Π΅ΠΎΠΌΠ΅ΡΡΠΈΡΠ½Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ. ΠΡΠ²Π΅Π½ ΠΌΠ΅ΡΠΎΠ΄Π° Π·Π° ΠΊΠΎΠΌΠΏΡΠ΅ΡΠΈΡ pglz Π² TOAST ΡΠ΅Π³Π° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π°Π»Π³ΠΎΡΠΈΡΡΠΌΡΡ LZ4.
- Π Π°Π·ΡΠΈΡΠ΅Π½ΠΈ ΡΠ° ΡΡΠ΅Π΄ΡΡΠ²Π°ΡΠ° Π·Π° ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³ Π½Π° ΡΠ°Π±ΠΎΡΠ°ΡΠ° Π½Π° Π‘Π£ΠΠ. ΠΠΎΠ±Π°Π²Π΅Π½ΠΈ ΡΠ° ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΡΠ½ΠΈΡ Π·Π° ΠΏΡΠΎΡΠ»Π΅Π΄ΡΠ²Π°Π½Π΅ Π½Π° Π½Π°ΠΏΡΠ΅Π΄ΡΠΊΠ° Π½Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ 'COPY' (pg_stat_progress_copy), ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠ° Π·Π° ΡΠ»ΠΎΡΠΎΠ²Π΅ Π·Π° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡ (pg_stat_replication_slots) ΠΈ Π°ΠΊΡΠΈΠ²Π½ΠΎΡΡ, ΡΠ²ΡΡΠ·Π°Π½Π° Ρ WAL-Π»ΠΎΠ³ Π½Π° ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ (pg_stat_wal). ΠΠΎΠ±Π°Π²Π΅Π½Π° Π΅ ΡΡΠ½ΠΊΡΠΈΡΡΠ° compute_query_id, ΠΊΠΎΡΡΠΎ Π²ΠΊΠ»ΡΡΠ²Π° Π² ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΏΠΎΠ΄ΡΠΈΡΡΠ΅ΠΌΠΈ, ΠΊΠ°ΡΠΎ pg_stat_activity ΠΈ EXPLAIN VERBOSE, ΠΏΡΠΎΡΠ»Π΅Π΄ΡΠ²Π°Π½Π΅ Π½Π° Π·Π°ΡΠ²ΠΊΠΈ Ρ ΠΏΡΠΈΡΠ²ΠΎΡΠ²Π°Π½Π΅ Π½Π° ΡΠ½ΠΈΠΊΠ°Π»Π΅Π½ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ Π·Π° Π²ΡΡΠΊΠ° Π·Π°ΡΠ²ΠΊΠ°.
- Π ΠΏΠ»Π°Π½ΠΈΡΠ°Π½ΠΈΡ Π½Π° Π·Π°ΠΏΠΈΡΠΈΡΠ΅ Π±ΡΡ Π° Π΄ΠΎΠ±Π°Π²Π΅Π½ΠΈ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ, ΠΊΠΎΠΈΡΠΎ ΠΏΠΎΠ΄ΠΎΠ±ΡΡΠ²Π°Ρ ΠΏΠ°ΡΠ°Π»Π΅Π»Π½Π°ΡΠ° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° Π·Π°ΠΏΠΈΡΠ²Π°Π½ΠΈΡ ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π°Ρ ΠΏΠΎΠ²ΠΈΡΠ°Π²Π°Π½Π΅ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ° ΠΏΡΠΈ Π΅Π΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π·Π° ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎ ΡΠΊΠ°Π½ΠΈΡΠ°Π½Π΅ Π½Π° Π·Π°ΠΏΠΈΡΠΈ, ΠΏΠ°ΡΠ°Π»Π΅Π»Π½ΠΎ ΠΏΡΡΠΊΠ°Π½Π΅ Π½Π° Π·Π°ΠΏΠΈΡΠ²Π°Π½ΠΈΡ Π² PL/pgSQL Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° Β«RETURN QUERYΒ» ΠΈ ΠΏΠ°ΡΠ°Π»Π΅Π»Π½ΠΎ ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° Π·Π°ΠΏΠΈΡΠ²Π°Π½ΠΈΡ Π² Β«REFRESH MATERIALIZED VIEWΒ». ΠΠ° ΠΏΠΎΠ΄ΠΎΠ±ΡΡΠ²Π°Π½Π΅ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ° Π½Π° ΡΠΈΠΊΠ»ΠΈΡΠ½ΠΈΡΠ΅ Π²Π»ΠΎΠΆΠ΅Π½ΠΈ ΠΎΠ±Π΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ (join) Π΅ ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ°Π½Π° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π½Π° Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½ΠΎ ΠΊΠ΅ΡΠΈΡΠ°Π½Π΅.
- ΠΠ° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ Π½Π° ΠΈΠ·ΡΠ°Π·ΠΈΡΠ΅ Π²Π΅ΡΠ΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΡΠ°Π·ΡΠΈΡΠ΅Π½Π° ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠ°, Π° Π·Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ Π½Π° ΠΎΠΊΠΎΠ½Π½ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ β ΠΈΠ½ΠΊΡΠ΅ΠΌΠ΅Π½ΡΠ°Π»Π½Π° ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠ°.
- Π Ρ ΡΠ°Π½ΠΈΠΌΠΈΡΠ΅ ΠΏΡΠΎΡΠ΅Π΄ΡΡΠΈ, ΠΊΠΎΠΈΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π°Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ Π² Π±Π»ΠΎΠΊΠΎΠ²Π΅ ΠΎΡ ΠΊΠΎΠ΄, Π΅ ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ°Π½Π° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π·Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π΅ Π½Π° Π²ΡΡΡΠ°Π½ΠΈΡΠ΅ Π΄Π°Π½Π½ΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ Β«OUTΒ».
- ΠΠΎΠ±Π°Π²Π΅Π½Π° Π΅ ΡΡΠ½ΠΊΡΠΈΡΡΠ° date_bin Π·Π° Π·Π°ΠΊΡΡΠ³Π»ΡΠ½Π΅ Π½Π° ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ Ρ ΡΠΈΠΏ timestamp Π² ΡΡΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠ΅ Ρ Π·Π°Π΄Π°Π΄Π΅Π½ΠΈΡ ΠΈΠ½ΡΠ΅ΡΠ²Π°Π». SELECT date_bin(β15 minutesβ, TIMESTAMP β2020-02-11 15:44:17β, TIMESTAMP β2001-01-01β); 2020-02-11 15:30:00
- ΠΠΎΠ±Π°Π²Π΅Π½ΠΈ ΡΠ° ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡΠ΅ Π² ΡΡΠ°Π½Π΄Π°ΡΡΠ° SQL ΠΈΠ·ΡΠ°Π·ΠΈ SEARCH ΠΈ CYCLE, ΠΊΠΎΠΈΡΠΎ ΠΎΠΏΡΠΎΡΡΡΠ²Π°Ρ ΠΏΠΎΠ΄ΡΠ΅ΠΆΠ΄Π°Π½Π΅ΡΠΎ ΠΈ ΠΎΡΠΊΡΠΈΡΠ΅ΡΠΎ Π½Π° ΡΠΈΠΊΠ»ΠΈ Π² ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΠΈ ΠΎΠ±ΠΎΠ±ΡΠ΅Π½ΠΈ ΡΠ°Π±Π»ΠΈΡΠ½ΠΈ ΠΈΠ·ΡΠ°Π·ΠΈ (Common Table Expression, CTE). WITH RECURSIVE search_tree(id, link, data) AS ( SELECT t.id, t.link, t.data FROM tree t UNION ALL SELECT t.id, t.link, t.data FROM tree t, search_tree st WHERE t.id = st.link ) SEARCH DEPTH FIRST BY id SET ordercol SELECT * FROM search_tree ORDER BY ordercol;
- Π ΡΡΠΈΠ»ΠΈΡΠ°ΡΠ° psql Π΅ ΠΏΠΎΠ΄ΠΎΠ±ΡΠ΅Π½ΠΎ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎΡΠΎ Π·Π°Π²ΡΡΡΠ²Π°Π½Π΅ Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ Ρ ΡΠ°Π±ΡΠ»Π°ΡΠΎΡΠ°, Π² ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° Β«\dfΒ» Π΅ Π΄ΠΎΠ±Π°Π²Π΅Π½Π° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π·Π° ΠΏΠΎΠΊΠ°Π·Π²Π°Π½Π΅ Π½Π° Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΈΡΠ΅ Π½Π° ΡΡΠ½ΠΊΡΠΈΠΈΡΠ΅, Π° Π² ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° Β«\dXΒ» Π΅ ΡΠ°Π·ΡΠΈΡΠ΅Π½Π° ΠΈΠ·Π²Π΅ΠΆΠ΄Π°Π½Π°ΡΠ° ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠ°.
- ΠΡΠ΅Π΄ΠΎΡΡΠ°Π²Π΅Π½Π° Π΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π·Π° Π½Π°Π·Π½Π°ΡΠ°Π²Π°Π½Π΅ Π½Π° ΠΏΡΠ°Π²Π° Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈΡΠ΅, Π΄ΠΎΠΏΡΡΠΊΠ°ΡΠΈ ΡΠ°ΠΌΠΎ ΡΠ΅ΡΠ΅Π½Π΅ ΠΈΠ»ΠΈ ΡΠ°ΠΌΠΎ Π·Π°ΠΏΠΈΡ. ΠΡΠ°Π²Π°ΡΠ° ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ Π·Π°Π΄Π°Π΄Π΅Π½ΠΈ Π² ΠΏΡΠΈΠ²ΡΡΠ·ΠΊΠ° ΠΊΡΠΌ ΠΎΡΠ΄Π΅Π»Π½ΠΈ ΡΠ°Π±Π»ΠΈΡΠΈ, ΠΈΠ·Π³Π»Π΅Π΄ΠΈ ΠΈ ΡΡ Π΅ΠΌΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»Π½ΠΎ Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°Π½ΠΈ ΡΠΎΠ»ΠΈ pg_read_all_data ΠΈ pg_write_all_data. GRANT pg_read_all_data TO user1;
- Π Π½ΠΎΠ²ΠΈΡΠ΅ ΠΈΠ½ΡΡΠ°Π»Π°ΡΠΈΠΈ ΠΏΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅ Π΅ ΠΎΡΠΈΠ³ΡΡΠ΅Π½ΠΎ ΠΏΡΠΈΠ»Π°Π³Π°Π½Π΅ Π½Π° ΠΏΠ°ΡΠΎΠ»Π½Π° Π°Π²ΡΠ΅Π½ΡΠΈΠΊΠ°ΡΠΈΡ Ρ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΠΌΠ΅ΡΠΎΠ΄Π° SCRAM-SHA-256 Π²ΠΌΠ΅ΡΡΠΎ md5 (ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡΡΡ Β«password_encryptionΒ» ΠΏΡΠΈ Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° postgresql.conf ΡΠ΅Π³Π° ΡΠ΅ Π·Π°Π΄Π°Π²Π° Π½Π° ΡΡΠΎΠΉΠ½ΠΎΡΡ βscram-sha-256β).
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: opennet.ru
