PostgreSQL ΡΡΠ°Π»Π° ΠΏΠ΅ΡΠ²ΠΎΠΉ ΡΠ΅Π»ΡΡΠΈΠΎΠ½Π½ΠΎΠΉ Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½ΡΡ , ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΠ΅ΠΉ ΡΠ»Π°Π±ΠΎΡΡΡΡΠΊΡΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅. Π PostgreSQL Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ JSON (JavaScript Object Notation, ΠΠ°ΠΏΠΈΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ° JavaScript RFC 7159), ΠΊΠΎΡΠΎΡΡΠΉ ΠΈΠΌΠ΅Π΅Ρ Π΄Π²Π° ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ: json ΠΈ jsonb. ΠΠ»Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΠ³ΠΎ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠ° Π·Π°ΠΏΡΠΎΡΠΎΠ² ΠΊ ΡΡΠΈΠΌ ΡΠΈΠΏΠ°ΠΌ Π΄Π°Π½Π½ΡΡ Π² Postgres ΡΠ°ΠΊΠΆΠ΅ ΠΈΠΌΠ΅Π΅ΡΡΡ ΡΠΈΠΏ jsonpath. ΠΡΠΈΡΠΈΠ°Π»ΡΠ½ΠΎ JSON ΠΏΠΎΡΠ²ΠΈΠ»ΡΡ Π² PostgreSQL Π² 2014 Π³ΠΎΠ΄Ρ. PostgreSQL Ρ JSONB ΡΠΎΠ²ΠΌΠ΅ΡΠ°Π΅Ρ Π³ΠΈΠ±ΠΊΠΎΡΡΡ NoSQL, Π° ΡΠ°ΠΊΠΆΠ΅ Π½Π°Π΄ΡΠΆΠ½ΠΎΡΡΡ ΠΈ Π±ΠΎΠ³Π°ΡΡΡΠ²ΠΎ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΠΈ ΡΠ΅Π»ΡΡΠΈΠΎΠ½Π½ΡΡ Π‘Π£ΠΠ.
Π‘ΠΎΠ·Π΄Π°ΡΡ PostgreSQL Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ
imdb, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠ΅ Π°ΡΡΠΈΠ±ΡΡΡ ΠΈ Π°ΡΡΠΈΠ±ΡΡ jsonb. ΠΠ»Ρ Π·Π°Π³ΡΡΠ·ΠΊΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΎΠ΄ΠΈΠ½ ΡΠ°ΠΉΠ» actors.list.txt ΠΈΠ· ΠΏΠ°ΠΏΠΊΠΈ DataSet.
-
ΠΠΎΠ΄ΠΎΠ²Π°Ρ ΡΡΡΠ°Π½ΠΈΡΠ° - ISO 8859-1.
-
ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠ΅ ΡΠ°Π·Π΄Π΅Π»ΠΈΡΠ΅Π»ΠΈ:
HT (0x09)- horizontal_tab,LF (0x0A)- line_feed.ΠΠ»Ρ ΠΏΠΎΠ»Π΅ΠΉ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΎΠ΄ΠΈΠ½ ΠΈΠ»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°Π·Π΄Π΅Π»ΠΈΡΠ΅Π»Π΅ΠΉ HT, Π΄Π»Ρ ΡΠΎΠ»Π΅ΠΉ Π°ΠΊΡΠ΅ΡΠ° ΠΎΠ΄ΠΈΠ½ LF, Π΄Π»Ρ Π°ΠΊΡΠ΅ΡΠΎΠ² Π΄Π²Π° LF.
-
ΠΡΠ°Π²ΠΈΠ»Π° ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΡΠ°Π·Π±ΠΎΡΠ° ΠΏΠΎΠ»Ρ
Titles:-
ΠΏΠ΅ΡΠ²ΡΠΉ Π°ΡΡΠΈΠ±ΡΡ
titleΠΈΠ»ΠΈ"title"= Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΡΠΎΠ»ΠΈ, ΠΏΠ΅ΡΠ΅Π½ΠΎΡΠΈΠΌ Π² json Ρ ΠΎΠ΄ΠΈΠ½Π°ΡΠ½ΡΠΌΠΈ ΠΊΠ°Π²ΡΡΠΊΠ°ΠΌΠΈ ΠΈΠ»ΠΈ Π±Π΅Π· ΠΊΠ°Π²ΡΡΠ΅ΠΊ; -
Π²ΡΠΎΡΠΎΠΉ Π°ΡΡΠΈΠ±ΡΡ
(year)= Π³ΠΎΠ΄ ΡΠΎΠ»ΠΈ, ΠΏΠ΅ΡΠ²ΡΠ΅ ΠΊΡΡΠ³Π»ΡΠ΅ ΡΠΊΠΎΠ±ΠΊΠΈ, ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ(????)- Π΄Π°ΡΠ° Π½Π΅ΠΈΠ·Π²Π΅ΡΡΠ½Π°; -
ΡΡΠ΅ΡΠΈΠΉ Π°ΡΡΠΈΠ±ΡΡ/Π½Π΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΡΠΉ (type1) = ΡΠΈΠΏ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»Π°, Π²ΡΠ΅ ΡΡΠΎ ΠΏΠΎΡΠ»Π΅ Π³ΠΎΠ΄Π° Π² ΠΊΡΡΠ³Π»ΡΡ ΡΠΊΠΎΠ±ΠΊΠ°Ρ :
(V)- Π²ΠΈΠ΄Π΅ΠΎ ΠΈΠ»ΠΈ ΠΊΠ»ΠΈΠΏ;(TV)- Π΄Π»Ρ ΡΠ΅Π»Π΅Π²ΠΈΠ΄Π΅Π½ΠΈΡ;(VG)- Π΄Π»Ρ Π²ΠΈΠ΄Π΅ΠΎ ΠΈΠ³ΡΡ;(archive footage)- Π°ΡΡ ΠΈΠ²Π½ΡΠ΅ ΠΈΠ»ΠΈ ΡΠ°Π½Π½ΠΈΠ΅ ΠΊΠ°Π΄ΡΡ;(uncredited)β Π½Π΅ Π·Π°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°Π½ ΠΈΠ»ΠΈ Π½Π΅ ΡΠΊΠ°Π·Π°Π½ Π² ΡΠΈΡΡΠ°Ρ ;(voice)- ΠΎΠ·Π²ΡΡΠΊΠ° ΠΈΠ»ΠΈ Π·Π°ΠΊΠ°Π΄ΡΠΎΠ²ΡΠΉ Π³ΠΎΠ»ΠΎΡ.
ΠΠΎΠΆΠ΅Ρ ΠΈΠΌΠ΅ΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π°ΡΡΠΈΠ±ΡΡΠΎΠ² ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ, ΡΠΎΠ³Π΄Π° ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°ΡΡ ΠΊΠ»ΡΡΠΈ ΠΊΠ°ΠΊ
type1,type2,type3, Ρ.ΠΊ. Π² jsonb Π²ΡΠ΅ ΠΊΠ»ΡΡΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ ΡΠ°Π·Π½ΡΠΌΠΈ; -
ΡΠ΅ΡΠ²Π΅ΡΡΡΠΉ Π°ΡΡΠΈΠ±ΡΡ/Π½Π΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΡΠΉ
{series name}= Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΡΠ΅ΡΠΈΠΈ Π² ΡΠ΅ΡΠΈΠ°Π»Π΅: Π² ΡΠΈΠ³ΡΡΠ½ΡΡ ΡΠΊΠΎΠ±ΠΊΠ°Ρ ,#xx.yy= Π½ΠΎΠΌΠ΅Ρ_ΡΠ΅Π·ΠΎΠ½Π°/Π½ΠΎΠΌΠ΅Ρ_ΡΠ΅ΡΠΈΠΈ; -
ΠΏΡΡΡΠΉ Π°ΡΡΠΈΠ±ΡΡ/Π½Π΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΡΠΉ
(as character)= ΠΏΠΎΡΡΠ½Π΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π½ΠΈ Π³Π΅ΡΠΎΡ: Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ Π² ΡΠΊΠΎΠ±ΠΊΠ°Ρ ΠΏΠ΅ΡΠ΅Π΄ ΠΈΠΌΠ΅Π½Π΅ΠΌ Π³Π΅ΡΠΎΡ, Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ Π² json ΠΊ ΠΊΠ»ΡΡΡ"character name"Π² ΠΊΠΎΠ½ΡΠ΅ ΠΊΠ°ΠΊ Π΅ΡΡΡ Π² ΡΠΊΠΎΠ±ΠΊΠ°Ρ ; -
ΡΠ΅ΡΡΠΎΠΉ Π°ΡΡΠΈΠ±ΡΡ/Π½Π΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΡΠΉ
[character name]= ΠΈΠΌΡ Π³Π΅ΡΠΎΡ: Π² ΠΊΠ²Π°Π΄ΡΠ°ΡΠ½ΡΡ ΡΠΊΠΎΠ±ΠΊΠ°Ρ ; -
ΡΠ΅Π΄ΡΠΌΠΎΠΉ Π°ΡΡΠΈΠ±ΡΡ/Π½Π΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΡΠΉ
<credit>= Π½ΠΎΠΌΠ΅Ρ Π² ΡΠΈΡΡΠ°Ρ : Π² ΡΡΠ΅ΡΠ³ΠΎΠ»ΡΠ½ΡΡ ΡΠΊΠΎΠ±ΠΊΠ°Ρ .
-
Π Π΅Π°Π»ΡΠ½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ Π½Π΅ΠΈΠ΄Π΅Π°Π»ΡΠ½Ρ, ΡΠ°ΠΉΠ» Ρ Π°ΠΊΡΠ΅ΡΠ°ΠΌΠΈ ΡΠΎΠΆΠ΅, Ρ.ΠΎ. Π΅ΡΡΡ ΡΡΡΠΎΠΊΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π΅ ΠΎΠΏΠΈΡΡΠ²Π°ΡΡΡΡ Π΄ΠΈΠ°Π³ΡΠ°ΠΌΠΌΠΎΠΉ ΡΠ°Π·Π±ΠΎΡΠ°. ΠΡΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΡΠ΅ΡΡΡ.
ΠΡΠΈΠΌΠ΅ΡΡ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ:
- ΠΠ½ΡΡΡΠΈ ΡΠΎΠ»ΠΈ ΡΠ°Π·Π΄Π΅Π»ΠΈΡΠ΅Π»ΠΈ ΠΏΡΠΎΠ±Π΅Π»Ρ.
- ΠΠ»Ρ ΠΏΠΎΠ»Ρ
nameΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΈΠΌΡ - ΠΎΡΡΠ°Π²Π»ΡΠ΅ΠΌ ΡΠ°ΠΌΠΈΠ»ΠΈΡ ΠΏΡΡΡΠΎΠΉ. - ΠΠΌΠ΅Π½Π°, ΡΠ°ΠΌΠΈΠ»ΠΈΠΈ Π²ΠΊΠ»ΡΡΠ°ΡΡ ΡΠΊΠΎΠ±ΠΊΠΈ ΠΈ ΡΠ°Π·Π½ΡΠ΅ ΡΡΡΠ°Π½Π½ΡΠ΅ ΡΠΈΠΌΠ²ΠΎΠ»Ρ - ΠΎΡΡΡΠ°Π²Π»ΡΠ΅ΠΌ ΠΊΠ°ΠΊ Π΅ΡΡΡ.
- ΠΠΎΠ»Π΅
(as character)ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠ²ΡΠΎΡΡΡΡΡΡ ΠΊΠ°ΠΊ(also as character)- ΠΈΠ³Π½ΠΎΡΠΈΡΠΎΠ²Π°ΡΡ ΠΈΠ»ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π΅ΡΠ΅type. (2014/III)- Π·Π°ΠΌΠ΅Π½Π° Π½Π°(2014).(????)- Π·Π°ΠΌΠ΅Π½Π° Π½Π°(0000).(????/III)Π·Π°ΠΌΠ΅Π½Π° Π½Π°(0000).
id integer(PRIMARY KEYΠ³Π΅Π½Π΅ΡΠΈΡΡΠ΅ΡΡΡ ΠΈΠ· ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ).ActorFirstName varchar(ΠΈΠ· ΠΏΠΎΠ»ΡName, ΠΈΡΡ ΠΎΠ΄Π½ΡΠΉ ΡΠΎΡΠΌΠ°ΡSecondName, FirstName).ActorSecondName varchar(ΠΈΠ· ΠΏΠΎΠ»ΡName, ΠΈΡΡ ΠΎΠ΄Π½ΡΠΉ ΡΠΎΡΠΌΠ°ΡSecondName, FirstName).RolesName jsonb(ΠΈΠ· ΠΏΠΎΠ»ΡTitlesΠΏΠΎ ΠΏΡΠ°Π²ΠΈΠ»Ρ ΡΠ°Π·Π±ΠΎΡΠ°).
Freeman, Morgan (I) 10 Items or Less (2006) [Him] <1>
100 Years at the Movies (1994) (TV) (archive footage) [Himself]
11th Annual Screen Actors Guild Awards (2005) (TV) [Himself - Winner & Nominee]
12th Annual Screen Actors Guild Awards (2006) (TV) [Himself]
15th Annual Critics' Choice Movie Awards (2010) (TV) [Himself]
16th Annual Screen Actors Guild Awards (2010) (TV) [Himself]
17th Annual Screen Actors Guild Awards (2011) (TV) [Himself - Presenter: Life Achievement Award]
1995 VH1 Honors (1995) (TV) [Himself]
1996 Blockbuster Entertainment Awards (1996) (TV) [Himself]
19th Annual Screen Actors Guild Awards (2013) (TV) [Himself - Presenter] <52>
2003 World Awards (2003) (TV) [Himself]
2014 Primetime Creative Arts Emmy Awards (2014) (TV) [Himself - Presenter: Outstanding Guest Actress in a Comedy Series] <178>
2016 Creative Arts Emmys (2016) (TV) [Himself - Presenter: Outstanding Special Class Program and Nominated: Outstanding Informational Series or Special] <148>
20th Annual Screen Actors Guild Awards (2014) (TV) (uncredited) [Himself - Presenter]
22nd NAACP Image Awards (1990) (TV) [Himself]
24 Hours of Reality and Live Earth: The World Is Watching (2015) (TV) [Himself]
25th NAACP Image Awards (1993) (TV) [Himself]
29th NAACP Image Awards (1998) (TV) [Himself]
30th NAACP Image Awards (1999) (TV) [Himself]
3rd Annual Screen Actors Guild Awards (1997) (TV) [Himself]
41st NAACP Image Awards (2010) (TV) [Himself]
5 Flights Up (2014) [Alex Carver] <2>
73rd Golden Globe Awards (2016) (TV) [Himself - Presenter: Director-Motion Picture] <134>
A Cautionary Tale: The Making of 'The Sum of All Fears' (2002) (V) [Himself]
A Century of Cinema (1994) [Himself]
ΠΠ²Π΅ ΠΏΠ΅ΡΠ²ΡΠ΅ ΡΡΡΠΎΠΊΠΈ Π² ΡΠ°ΠΉΠ»Π΅ ΠΏΡΠΎΠΏΡΡΠΊΠ°ΡΡ ΠΏΡΠΈ ΡΠ°Π·Π±ΠΎΡΠ΅, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΎΠ½ΠΈ ΡΠΎΠ΄Π΅ΡΠΆΠ°Ρ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ ΡΠΏΠΈΡΠΊΠ° ΡΠΎΠ»Π΅ΠΉ:
Name Titles
---- ------
ΠΠ°Π»Π΅Π΅ ΡΠΎΡΠΌΠ°Ρ ΡΠ°ΠΉΠ»Π° Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
SecondName, FirstName HT HT HT title (year) [character name] <credit> LF
HT HT HT title (year) (type1) [character name] LF
LF
SecondName, FirstName HT title (year) [character name] <credit> LF
HT HT HT title (year) {series name} (type1) (type2) [character name] <credit> LF
HT HT HT title (year) (as character) [character name] LF
-
id ***** -
ActorFirstName "Morgan" -
ActorSecondName "Freeman" -
RolesName{ "roles": [ { "title": "The Shawshank Redemption", "year": "1994", "character name": "Ellis Boyd 'Red' Redding", "credit": "2" }, { "title": "The True Story of Glory Continues", "year": "1991", "type1": "voice", "character name": "Narrator", "credit": "1" }, { "title": "Unforgiven", "year": "1992", "character name": "Ned Logan", "credit": "1" }, { "title": "Through the Wormhole", "year": "2010", "series name": "Are Aliens Inside Us? (#6.5)", "character name": "Himself - Narrator", "credit": "1" } ] }
- Π‘ΠΎΡΡΠ°Π²ΠΈΡΡ 4-5 Π·Π°ΠΏΡΠΎΡΠΎΠ² Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ api postgresql Π΄Π»Ρ jsonb:
- ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π½Π° Π²Ρ ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΈ ΡΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°Π½ΠΈΠ΅ jsonb;
- ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎ ΠΈΠ½Π΄Π΅ΠΊΡΡ ΠΊ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΠΌ jsonb;
- ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΠ·ΡΠΊ jsonpath;
- ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ Π΄Π»Ρ ΡΠΈΠΏΠ° jsonb.
- ΠΠ·ΠΌΠ΅ΡΠΈΡΡ Π²ΡΠ΅ΠΌΡ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ ΠΏΠΎΠ»Ρ jsonb Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΡΡΠΎΡΠΊΠΈ (Π² Π²ΠΈΠ΄Π΅ ΡΠ°Π±Π»ΠΈΡΡ ΠΈΠ»ΠΈ Π³ΡΠ°ΡΠΈΠΊΠ°). ΠΡΠ΅Π½ΠΈΡΡ Π²Π»ΠΈΡΠ½ΠΈΠ΅ Π΄Π»ΠΈΠ½Ρ ΡΡΡΠΎΠΊΠΈ Π½Π° ΡΠΊΠΎΡΠΎΡΡΡ Π΄ΠΎΡΡΡΠΏΠ° (ΠΎΠΆΠΈΠ΄Π°Π΅ΡΡΡ ΡΡΡΠΏΠ΅Π½ΡΠΊΠ° Π΄ΠΎ 2kB, ΠΏΠΎΡΠ»Π΅ Π»ΠΈΠ½Π΅ΠΉΠ½Π°Ρ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡ). ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΈΠ·ΠΌΠ΅ΡΠΈΡΡ Π²ΡΠ΅ΠΌΡ ΡΡΠ΅Π½ΠΈΡ year ΠΏΠ΅ΡΠ²ΠΎΠΉ ΡΠΎΠ»ΠΈ Π°ΠΊΡΠ΅ΡΠ° (explain analyze). ΠΠ»Ρ ΡΠΎΡΠ½ΠΎΡΡΠΈ ΠΎΡΠ΅Π½ΠΊΠΈ Π²Π°ΠΆΠ½ΠΎ ΡΡΠΈΡΡΠ²Π°ΡΡ Ρ ΡΠ°Π½ΠΈΠΌΡΡ Π΄Π»ΠΈΠ½Ρ (jsonb Ρ ΡΠ°Π½ΠΈΡΡΡ Π² ΡΠΆΠ°ΡΠΎΠΉ ΡΠΎΡΠΌΠ΅). ΠΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΡΡΠΎ Π²Π»ΠΈΡΠ½ΠΈΠ΅ ΡΠΌΠ΅Π½ΡΡΠΈΡΡ?
- Π‘ΠΎΡΡΠ°Π²ΠΈΡΡ Π·Π°ΠΏΡΠΎΡ Π½Π° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ year Ρ ΠΏΠ΅ΡΠ²ΠΎΠΉ ΡΠΎΠ»ΠΈ Π°ΠΊΡΠ΅ΡΠ°. Π‘ΡΠ°Π²Π½ΠΈΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡΠ΅ΠΌΠ° ΠΠ Π΄Π»Ρ Π°ΠΊΡΠ΅ΡΠ° Ρ ΠΌΠ°Π»ΡΠΌ ΠΊΠΎΠ»-Π²ΠΎΠΌ ΡΠΎΠ»Π΅ΠΉ ΠΈ Π°ΠΊΡΠ΅ΡΠ° Ρ Π±ΠΎΠ»ΡΡΠΈΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎΠΌ ΡΠΎΠ»Π΅ΠΉ (toasted roles).
- Π Π°Π·Π±ΠΎΡ ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠ΅ΠΊΡΡΠ° ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΡ ΠΊΠ°ΠΊ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Ρ ΡΠ°Π½ΠΈΠΌΠΎΠΉ ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ plpython3u, ΡΠ°ΠΊ ΠΈ Π»ΡΠ±ΡΠΌ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, python, C#, javaβ¦). ΠΠ»Ρ Ρ ΡΠ°Π½ΠΈΠΌΠΎΠΉ ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ Π΅ΡΡΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΎΠ±ΡΠ΅ΠΌ ΡΠ΅ΠΊΡΡΠ° Π΄Π»Ρ Π²ΡΡΠ°Π²ΠΊΠΈ.
- ΠΠ΅ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡΠΎΠΌΠ΅ΠΆΡΡΠΎΡΠ½ΠΎΠ³ΠΎ ΡΠΎΡΠΌΠ°ΡΠ° ΡΠ°ΠΉΠ»Π° ΠΏΡΠΈ Π·Π°Π³ΡΡΠ·ΠΊΠ΅ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, csv).
- ΠΠ»Ρ ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΡ Π³ΡΠ°ΡΠΈΠΊΠ° ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π½Π΅ Π²ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅, Π½ΠΎ Π²ΡΠ±ΠΎΡΠΊΠ° Π΄ΠΎΠ»ΠΆΠ½Π° Π±ΡΡΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, 50 Π΄Π»Ρ Π½Π°ΡΠ°Π»ΡΠ½ΠΎΠΉ ΡΡΡΠΏΠ΅Π½ΡΠΊΠΈ ΠΈ 50 Π΄Π»Ρ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ ΡΠ°ΡΡΠΈ).
- ΠΡΠΈ ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΠΈ Π³ΡΠ°ΡΠΈΠΊΠ° ΡΠ»Π΅Π΄ΡΠ΅Ρ ΡΠΈΠ»ΡΡΡΠΎΠ²Π°ΡΡ ΡΠ»ΡΡΠ°ΠΉΠ½ΡΠ΅ Π²ΡΠ±ΡΠΎΡΡ (ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π½Π°Π³ΡΡΠ·ΠΊΠΈ Π½Π° ΡΠ΅ΡΠ²Π΅Ρ), ΠΆΠ΅Π»Π°ΡΠ΅Π»ΡΠ½ΠΎ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΡ ΡΡΡΠ΅Π΄Π½Π΅Π½ΠΈΠ΅ ΠΏΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌ Π³ΡΠ°ΡΠΈΠΊΠ°.
- ΠΠ΅Π½ΠΎΡΠΌΠ°Π»ΠΈΠ·Π°ΡΠΈΡ
- Json
PostgreSQL ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ Π΄Π²Π° ΡΠΈΠΏΠ° Π΄Π»Ρ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ JSON-Π΄Π°Π½Π½ΡΡ , ΠΊΠΎΡΠΎΡΡΠ΅ ΡΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎ ΡΠ°Π·Π»ΠΈΡΠ°ΡΡΡΡ ΠΏΠΎ ΡΠ²ΠΎΠ΅ΠΉ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ:
-
Π€ΠΎΡΠΌΠ°Ρ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ:
- json Ρ ΡΠ°Π½ΠΈΡ ΡΠΎΡΠ½ΡΡ ΡΠ΅ΠΊΡΡΠΎΠ²ΡΡ ΠΊΠΎΠΏΠΈΡ Π²Π²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ JSON ΠΊΠ°ΠΊ Π΅ΡΡΡ, Π²ΠΊΠ»ΡΡΠ°Ρ Π²ΡΠ΅ ΠΏΡΠΎΠ±Π΅Π»Ρ, ΡΠΎΡΠΌΠ°ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ ΠΏΠΎΡΡΠ΄ΠΎΠΊ ΠΊΠ»ΡΡΠ΅ΠΉ;
- jsonb Ρ ΡΠ°Π½ΠΈΡ Π΄Π°Π½Π½ΡΠ΅ Π² Π±ΠΈΠ½Π°ΡΠ½ΠΎΠΌ Π΄Π΅ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΌ ΡΠΎΡΠΌΠ°ΡΠ΅, ΡΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π±ΡΡΡΡΠΎ ΠΎΠ±ΡΠ°ΡΠ°ΡΡΡΡ ΠΊ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΌ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΠΌ.
-
ΠΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΡΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ:
- json ΡΡΠ΅Π±ΡΠ΅Ρ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎΠ³ΠΎ ΠΏΠ°ΡΡΠΈΠ½Π³Π° ΠΏΡΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π·Π°ΠΏΡΠΎΡΠ΅, ΡΡΠΎ ΡΠ½ΠΈΠΆΠ°Π΅Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ;
- jsonb Ρ ΡΠ°Π½ΠΈΡΡΡ ΡΠΆΠ΅ Π² ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠ°Π·ΠΎΠ±ΡΠ°Π½Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅, ΡΡΠΎ Π΄Π΅Π»Π°Π΅Ρ Π²ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΏΠΎΠΈΡΠΊΠ° ΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ Π±ΡΡΡΡΠ΅Π΅.
-
ΠΠΎΡΡΠ΄ΠΎΠΊ ΠΊΠ»ΡΡΠ΅ΠΉ:
- json ΡΠΎΡ ΡΠ°Π½ΡΠ΅Ρ ΠΏΠΎΡΡΠ΄ΠΎΠΊ ΠΊΠ»ΡΡΠ΅ΠΉ Π² ΡΠΎΠΌ Π²ΠΈΠ΄Π΅, Π² ΠΊΠ°ΠΊΠΎΠΌ ΠΎΠ½ΠΈ Π±ΡΠ»ΠΈ Π²Π²Π΅Π΄Π΅Π½Ρ;
- jsonb Π½Π΅ ΡΠΎΡ ΡΠ°Π½ΡΠ΅Ρ ΠΏΠΎΡΡΠ΄ΠΎΠΊ ΠΊΠ»ΡΡΠ΅ΠΉ (ΠΎΠ½ΠΈ ΡΠΎΡΡΠΈΡΡΡΡΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Π΄Π»Ρ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ Π΄ΠΎΡΡΡΠΏΠ°).
-
ΠΠ½Π΄Π΅ΠΊΡΠ°ΡΠΈΡ:
- json Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΠΈΠ½Π΄Π΅ΠΊΡΠ°ΡΠΈΡ, ΡΡΠΎ Π΄Π΅Π»Π°Π΅Ρ ΠΏΠΎΠΈΡΠΊ ΠΏΠΎ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠΌΡ Π½Π΅ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΡΠΌ;
- jsonb ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ GIN-ΠΈΠ½Π΄Π΅ΠΊΡΡ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠΈΠ΅ Π±ΡΡΡΡΠΎ ΠΈΠ·Π²Π»Π΅ΠΊΠ°ΡΡ Π΄Π°Π½Π½ΡΠ΅ ΠΏΠΎ ΠΊΠ»ΡΡΠ°ΠΌ ΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌ.
-
ΠΡΠ±Π»ΠΈΡΡΡΡΠΈΠ΅ΡΡ ΠΊΠ»ΡΡΠΈ:
- json ΡΠΎΡ ΡΠ°Π½ΡΠ΅Ρ Π²ΡΠ΅ Π΄ΡΠ±Π»ΠΈΡΡΡΡΠΈΠ΅ΡΡ ΠΊΠ»ΡΡΠΈ ΠΊΠ°ΠΊ Π΅ΡΡΡ;
- jsonb ΡΠΎΡ ΡΠ°Π½ΡΠ΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅Π΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π΄ΡΠ±Π»ΠΈΡΡΡΡΠ΅Π³ΠΎΡΡ ΠΊΠ»ΡΡΠ°.
Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, json ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΈΡ Π΄Π»Ρ ΡΠ»ΡΡΠ°Π΅Π², ΠΊΠΎΠ³Π΄Π° ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΡΠΎΡΠ½ΠΎΠ΅ ΡΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠΎΡΠΌΠ°ΡΠ°, Π° jsonb - ΠΊΠΎΠ³Π΄Π° Π²Π°ΠΆΠ½Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ Π·Π°ΠΏΡΠΎΡΠΎΠ² ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΠ³ΠΎ ΠΏΠΎΠΈΡΠΊΠ°.
JSONB ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠΈΠΏΠΎΠ² ΠΈΠ½Π΄Π΅ΠΊΡΠ°ΡΠΈΠΈ, ΡΡΠΎ Π΄Π΅Π»Π°Π΅Ρ Π΅Π³ΠΎ ΠΌΠΎΡΠ½ΡΠΌ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠΌ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ ΡΠΎ ΡΠ»Π°Π±ΠΎΡΡΡΡΠΊΡΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌΠΈ Π΄Π°Π½Π½ΡΠΌΠΈ:
-
GIN (Generalized Inverted Index) - Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΡΠΉ ΡΠΈΠΏ ΠΈΠ½Π΄Π΅ΠΊΡΠ°ΡΠΈΠΈ Π΄Π»Ρ JSONB Ρ Π΄Π²ΡΠΌΡ Π²Π°ΡΠΈΠ°Π½ΡΠ°ΠΌΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΎΠ²:
jsonb_ops(ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ) - ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΡΠ΅Ρ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΊΠ»ΡΡ ΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΡ@>,?,?&,?|;jsonb_path_ops- ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°Π½ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΠΎ Π΄Π»Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ° Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ (@>), Π±ΠΎΠ»Π΅Π΅ ΠΊΠΎΠΌΠΏΠ°ΠΊΡΠ΅Π½ ΠΈ Π±ΡΡΡΡΠ΅Π΅ Π΄Π»Ρ ΡΠ°ΠΊΠΈΡ Π·Π°ΠΏΡΠΎΡΠΎΠ²:
CREATE INDEX idx_actors_roles ON actors USING GIN (RolesName jsonb_path_ops);
-
B-tree ΠΈΠ½Π΄Π΅ΠΊΡΡ - ΠΌΠΎΠ³ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π΄Π»Ρ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ JSONB-ΠΏΠΎΠ»Π΅ΠΉ ΡΠ΅Π»ΠΈΠΊΠΎΠΌ:
CREATE INDEX idx_json_equality ON actors (RolesName);
-
Π€ΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΠ΅ ΠΈΠ½Π΄Π΅ΠΊΡΡ - Π΄Π»Ρ ΠΈΠ½Π΄Π΅ΠΊΡΠ°ΡΠΈΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΡ ΠΊΠ»ΡΡΠ΅ΠΉ:
CREATE INDEX idx_year ON actors ((RolesName->'roles'->0->>'year'));
-
Π§Π°ΡΡΠΈΡΠ½ΡΠ΅ ΠΈΠ½Π΄Π΅ΠΊΡΡ - Π΄Π»Ρ ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΡΡΠΎΠΊ, ΡΠ΄ΠΎΠ²Π»Π΅ΡΠ²ΠΎΡΡΡΡΠΈΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌΡ ΡΡΠ»ΠΎΠ²ΠΈΡ:
CREATE INDEX idx_actors_with_type ON actors USING GIN (RolesName) WHERE jsonb_path_exists(RolesName, '$.roles[*].type1');
-
ΠΠΎΠΌΠ±ΠΈΠ½ΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ ΠΈΠ½Π΄Π΅ΠΊΡΡ - Π΄Π»Ρ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈΠ½Π΄Π΅ΠΊΡΠ°ΡΠΈΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΠΏΠΎΠ»Π΅ΠΉ:
CREATE INDEX idx_actors_combined ON actors (ActorFirstName, ActorSecondName, (RolesName->'roles'->0->>'year'));
ΠΡΠ°Π²ΠΈΠ»ΡΠ½ΡΠΉ Π²ΡΠ±ΠΎΡ ΡΠΈΠΏΠ° ΠΈΠ½Π΄Π΅ΠΊΡΠ° ΡΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎ Π²Π»ΠΈΡΠ΅Ρ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ Π·Π°ΠΏΡΠΎΡΠΎΠ² ΠΊ JSONB-Π΄Π°Π½Π½ΡΠΌ.
JSONPath - ΡΡΠΎ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΡΠ·ΡΠΊ Π·Π°ΠΏΡΠΎΡΠΎΠ² Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ JSON-Π΄Π°Π½Π½ΡΠΌΠΈ, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½ΡΠΉ Π² PostgreSQL 12 ΠΈ ΡΡΠ°Π½Π΄Π°ΡΡΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ Π² SQL/JSON:
-
Π‘ΠΈΠ½ΡΠ°ΠΊΡΠΈΡ ΠΈ ΠΎΡΠ½ΠΎΠ²Π½ΡΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ:
$- ΠΊΠΎΡΠ½Π΅Π²ΠΎΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ JSON-Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°;.keyΠΈΠ»ΠΈ."key with spaces"- Π΄ΠΎΡΡΡΠΏ ΠΊ ΠΏΠΎΠ»Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠ°;[*]- ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΠ΅ ΠΊΠΎ Π²ΡΠ΅ΠΌ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΠΌ ΠΌΠ°ΡΡΠΈΠ²Π°;?()- ΡΠΈΠ»ΡΡΡ Π΄Π»Ρ Π²ΡΠ±ΠΎΡΠΊΠΈ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ²;@- ΡΡΡΠ»ΠΊΠ° Π½Π° ΡΠ΅ΠΊΡΡΠΈΠΉ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅ΠΌΡΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ.
-
ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΡΠ·ΡΠΊΠ°:
- Π‘Π»ΠΎΠΆΠ½Π°Ρ Π½Π°Π²ΠΈΠ³Π°ΡΠΈΡ ΠΏΠΎ Π²Π»ΠΎΠΆΠ΅Π½Π½ΡΠΌ ΡΡΡΡΠΊΡΡΡΠ°ΠΌ;
- ΠΡΠΈΡΠΌΠ΅ΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Ρ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅ΠΌΡΠΌΠΈ ΡΠΈΡΠ»ΠΎΠ²ΡΠΌΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌΠΈ;
- ΠΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΡ (
&&,||,!); - ΠΠΏΠ΅ΡΠ°ΡΠΎΡΡ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ (
==,!=,<,<=,>,>=); - ΠΠΎΠΈΡΠΊ ΠΏΠΎ ΡΠ°Π±Π»ΠΎΠ½Ρ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΡΠ΅Π³ΡΠ»ΡΡΠ½ΡΡ
Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠΉ (
like_regex).
-
ΠΡΠ½ΠΎΠ²Π½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ jsonpath:
jsonb_path_exists(json, path)- ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ, ΡΡΡΠ΅ΡΡΠ²ΡΡΡ Π»ΠΈ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ, ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠ΅ ΠΏΡΡΠΈ;jsonb_path_query(json, path)- ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅Ρ Π²ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ, ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠ΅ ΠΏΡΡΠΈ;jsonb_path_query_array(json, path)- Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ Π² Π²ΠΈΠ΄Π΅ JSON-ΠΌΠ°ΡΡΠΈΠ²Π°;jsonb_path_query_first(json, path)- Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΏΠ΅ΡΠ²ΡΠΉ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ.
-
ΠΡΠΈΠΌΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ:
SELECT ActorFirstName, ActorSecondName FROM actors WHERE jsonb_path_exists( RolesName, '$.roles[*] ? (@.year >= "2010" && @.credit == "1")' );
ΠΡΠΎΡ Π·Π°ΠΏΡΠΎΡ Π½Π°Ρ ΠΎΠ΄ΠΈΡ Π°ΠΊΡΠ΅ΡΠΎΠ², ΡΡΠ³ΡΠ°Π²ΡΠΈΡ Π³Π»Π°Π²Π½ΡΡ ΡΠΎΠ»Ρ Π² ΡΠΈΠ»ΡΠΌΠ°Ρ 2010 Π³ΠΎΠ΄Π° ΠΈ ΠΏΠΎΠ·ΠΆΠ΅.
JSONPath ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ Π±ΠΎΠ»Π΅Π΅ ΠΌΠΎΡΠ½ΡΠΉ ΠΈ Π΄Π΅ΠΊΠ»Π°ΡΠ°ΡΠΈΠ²Π½ΡΠΉ ΡΠΏΠΎΡΠΎΠ± ΡΠ°Π±ΠΎΡΡ Ρ JSON-Π΄Π°Π½Π½ΡΠΌΠΈ ΠΏΠΎ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ ΡΠΎ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΌΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ°ΠΌΠΈ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ ΠΏΠΎΠ»ΡΠΌ (->, ->>) ΠΈ Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠΏΡΠΎΡΠ°Π΅Ρ ΡΠ»ΠΎΠΆΠ½ΡΠ΅ Π·Π°ΠΏΡΠΎΡΡ ΠΊ Π²Π»ΠΎΠΆΠ΅Π½Π½ΡΠΌ ΡΡΡΡΠΊΡΡΡΠ°ΠΌ.
TOAST (The Oversized-Attribute Storage Technique) - ΡΡΠΎ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ PostgreSQL Π΄Π»Ρ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΠ³ΠΎ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ ΠΈ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ Π±ΠΎΠ»ΡΡΠΈΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌ Π°ΡΡΠΈΠ±ΡΡΠΎΠ²:
-
ΠΡΠΈΠ½ΡΠΈΠΏ ΡΠ°Π±ΠΎΡΡ:
- PostgreSQL Ρ ΡΠ°Π½ΠΈΡ ΡΡΡΠΎΠΊΠΈ Π² ΡΡΡΠ°Π½ΠΈΡΠ°Ρ ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΡΠ°Π·ΠΌΠ΅ΡΠ° (ΠΎΠ±ΡΡΠ½ΠΎ 8 KB);
- ΠΠΎΠ³Π΄Π° Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π°ΡΡΠΈΠ±ΡΡΠ° ΡΠ»ΠΈΡΠΊΠΎΠΌ Π²Π΅Π»ΠΈΠΊΠΎ (ΠΏΡΠ΅Π²ΡΡΠ°Π΅Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΉ ΠΏΠΎΡΠΎΠ³), ΠΎΠ½ΠΎ "ΡΠΎΡΡΠΈΡΡΠ΅ΡΡΡ" - ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ°Π΅ΡΡΡ Π²ΠΎ Π²Π½Π΅ΡΠ½ΡΡ TOAST-ΡΠ°Π±Π»ΠΈΡΡ;
- Π ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΡΠ°Π±Π»ΠΈΡΠ΅ ΠΎΡΡΠ°Π΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠΉ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° TOAST-Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅.
-
ΠΠΎΡΠΎΠ³ΠΎΠ²ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ:
- ΠΠ»Ρ JSONB ΠΏΠΎΡΠΎΠ³ TOAST ΡΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΎΠΊΠΎΠ»ΠΎ 2 KB;
- ΠΠ°Π½Π½ΡΠ΅, ΠΏΡΠ΅Π²ΡΡΠ°ΡΡΠΈΠ΅ ΡΡΠΎΡ ΠΏΠΎΡΠΎΠ³, Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ°ΡΡΡΡ Π² TOAST-ΡΠ°Π±Π»ΠΈΡΡ.
-
Π‘ΡΡΠ°ΡΠ΅Π³ΠΈΠΈ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ TOAST-Π΄Π°Π½Π½ΡΡ :
Π ΡΡΡΠ°ΡΠ΅Π³ΠΈΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ Π΄Π²Π° ΠΊΠ»ΡΡΠ΅Π²ΡΡ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠ°:
- Π‘ΠΆΠ°ΡΠΈΠ΅ - ΠΏΡΠΎΡΠ΅ΡΡ ΡΠΌΠ΅Π½ΡΡΠ΅Π½ΠΈΡ ΡΠ°Π·ΠΌΠ΅ΡΠ° Π΄Π°Π½Π½ΡΡ Ρ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ° LZ, ΠΊΠΎΡΠΎΡΡΠΉ PostgreSQL ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Π΄Π»Ρ TOAST-Π΄Π°Π½Π½ΡΡ . Π‘ΠΆΠ°ΡΠΈΠ΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎ ΡΠΌΠ΅Π½ΡΡΠΈΡΡ Π·Π°Π½ΠΈΠΌΠ°Π΅ΠΌΠΎΠ΅ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ, ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ Π΄Π»Ρ ΡΠ΅ΠΊΡΡΠΎΠ²ΡΡ Π΄Π°Π½Π½ΡΡ , Π½ΠΎ ΡΡΠ΅Π±ΡΠ΅Ρ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ Π²ΡΡΠΈΡΠ»ΠΈΡΠ΅Π»ΡΠ½ΡΡ ΡΠ΅ΡΡΡΡΠΎΠ² ΠΏΡΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΡΡΠ΅Π½ΠΈΡ ΠΈ Π·Π°ΠΏΠΈΡΠΈ.
- ΠΠ½Π΅ΡΠ½Π΅Π΅ Ρ ΡΠ°Π½Π΅Π½ΠΈΠ΅ - ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ΅Π½ΠΈΡ Π±ΠΎΠ»ΡΡΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ ΠΈΠ· ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΡΠ°Π±Π»ΠΈΡΡ Π²ΠΎ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½ΡΡ TOAST-ΡΠ°Π±Π»ΠΈΡΡ. ΠΡΠΈ ΡΡΠΎΠΌ Π² ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠ΅ ΡΠ°Π±Π»ΠΈΡΡ ΠΎΡΡΠ°Π΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠΉ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ (16 Π±Π°ΠΉΡ), ΠΊΠΎΡΠΎΡΡΠΉ ΡΡΡΠ»Π°Π΅ΡΡΡ Π½Π° ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΡΡ Π·Π°ΠΏΠΈΡΡ Π² TOAST-ΡΠ°Π±Π»ΠΈΡΠ΅. ΠΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΠ΅ Ρ ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π±ΠΎΠ»ΡΡΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ², Π½ΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅Ρ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎΠ΅ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΠ΅ ΠΊ Π΄ΠΈΡΠΊΡ ΠΏΡΠΈ Π΄ΠΎΡΡΡΠΏΠ΅ ΠΊ Π΄Π°Π½Π½ΡΠΌ.
Π‘Π°ΠΌΠΈ ΡΡΡΠ°ΡΠ΅Π³ΠΈΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΡ Π±ΡΠ΄ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π΄Π»Ρ TOAST-Π΄Π°Π½Π½ΡΡ :
PLAIN- ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠ°Π΅Ρ ΠΊΠ°ΠΊ ΡΠΆΠ°ΡΠΈΠ΅, ΡΠ°ΠΊ ΠΈ Π²Π½Π΅ΡΠ½Π΅Π΅ Ρ ΡΠ°Π½Π΅Π½ΠΈΠ΅. ΠΡΠΎ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½Π°Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Π°Ρ ΡΡΡΠ°ΡΠ΅Π³ΠΈΡ Π΄Π»Ρ ΡΡΠΎΠ»Π±ΡΠΎΠ² Ρ ΡΠΈΠΏΠ°ΠΌΠΈ Π΄Π°Π½Π½ΡΡ , Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΠΈΠΌΠΈ TOAST;EXTENDED- ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΊΠ°ΠΊ ΡΠΆΠ°ΡΠΈΠ΅, ΡΠ°ΠΊ ΠΈ Π²Π½Π΅ΡΠ½Π΅Π΅ Ρ ΡΠ°Π½Π΅Π½ΠΈΠ΅ (ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π΄Π»Ρ Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²Π° TOAST-ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΠΌΡΡ ΡΠΈΠΏΠΎΠ² Π΄Π°Π½Π½ΡΡ ). Π‘Π½Π°ΡΠ°Π»Π° ΠΏΡΠ΅Π΄ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅ΡΡΡ ΠΏΠΎΠΏΡΡΠΊΠ° ΡΠΆΠ°ΡΠΈΡ, Π° Π·Π°ΡΠ΅ΠΌ, Π΅ΡΠ»ΠΈ ΡΡΡΠΎΠΊΠ° Π²ΡΠ΅ Π΅ΡΠ΅ ΡΠ»ΠΈΡΠΊΠΎΠΌ Π±ΠΎΠ»ΡΡΠ°Ρ, ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ Π²Π½Π΅ΡΠ½Π΅Π΅ Ρ ΡΠ°Π½Π΅Π½ΠΈΠ΅;EXTERNAL- ΡΠ°Π·ΡΠ΅ΡΠ°Π΅Ρ Π²Π½Π΅ΡΠ½Π΅Π΅ Ρ ΡΠ°Π½Π΅Π½ΠΈΠ΅, Π½ΠΎ Π½Π΅ ΡΠΆΠ°ΡΠΈΠ΅. ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅EXTERNALΠ΄Π΅Π»Π°Π΅Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Ρ ΠΏΠΎΠ΄ΡΡΡΠΎΠΊΠ°ΠΌΠΈ Π½Π° ΡΠΈΡΠΎΠΊΠΈΡ ΡΠ΅ΠΊΡΡΠΎΠ²ΡΡ ΠΈ bytea ΡΡΠΎΠ»Π±ΡΠ°Ρ Π±ΡΡΡΡΠ΅Π΅ (Π·Π° ΡΡΠ΅Ρ ΡΠ²Π΅Π»ΠΈΡΠ΅Π½ΠΈΡ Π·Π°Π½ΠΈΠΌΠ°Π΅ΠΌΠΎΠ³ΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π°), ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΡΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Ρ Π΄Π»Ρ ΠΈΠ·Π²Π»Π΅ΡΠ΅Π½ΠΈΡ ΡΠΎΠ»ΡΠΊΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΡ ΡΠ°ΡΡΠ΅ΠΉ Π²Π½Π΅ΡΠ½Π΅Π³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ΠΎ Π½Π΅ ΡΠΆΠ°ΡΠΎ;MAIN- ΡΠ°Π·ΡΠ΅ΡΠ°Π΅Ρ ΡΠΆΠ°ΡΠΈΠ΅, Π½ΠΎ Π½Π΅ Π²Π½Π΅ΡΠ½Π΅Π΅ Ρ ΡΠ°Π½Π΅Π½ΠΈΠ΅. (Π€Π°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ, Π²Π½Π΅ΡΠ½Π΅Π΅ Ρ ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π²ΡΡ ΡΠ°Π²Π½ΠΎ Π±ΡΠ΄Π΅Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΎ Π΄Π»Ρ ΡΠ°ΠΊΠΈΡ ΡΡΠΎΠ»Π±ΡΠΎΠ², Π½ΠΎ ΡΠΎΠ»ΡΠΊΠΎ ΠΊΠ°ΠΊ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅Π΅ ΡΡΠ΅Π΄ΡΡΠ²ΠΎ, ΠΊΠΎΠ³Π΄Π° Π½Π΅Ρ Π΄ΡΡΠ³ΠΎΠ³ΠΎ ΡΠΏΠΎΡΠΎΠ±Π° ΡΠΌΠ΅Π½ΡΡΠΈΡΡ ΡΡΡΠΎΠΊΡ Π΄ΠΎ ΡΠ°Π·ΠΌΠ΅ΡΠ°, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠ΅Π³ΠΎ ΡΠ°Π·ΠΌΠ΅ΡΡΠΈΡΡ Π΅Ρ Π½Π° ΡΡΡΠ°Π½ΠΈΡΠ΅).
-
ΠΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ ΡΠ°Π±ΠΎΡΡ Ρ TOAST-ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌΠΈ:
- ΠΡΠ΄Π΅Π»Π΅Π½ΠΈΠ΅ ΡΠ°ΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ Π½Π΅Π±ΠΎΠ»ΡΡΠΈΡ ΠΏΠΎΠ»Π΅ΠΉ Π² ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠ΅ ΡΡΠΎΠ»Π±ΡΡ;
- ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ°ΡΡΠΈΡΠ½ΡΡ ΠΈΠ½Π΄Π΅ΠΊΡΠΎΠ² Π΄Π»Ρ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ Π΄ΠΎΡΡΡΠΏΠ°;
- Π Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π±ΠΎΠ»ΡΡΠΈΡ JSON-Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΎΠ² Π½Π° Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΡΠ°ΡΡΠΈ.
TOAST - ΡΡΠΎ ΠΏΡΠΎΠ·ΡΠ°ΡΠ½ΡΠΉ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ PostgreSQL ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ Π΄Π°Π½Π½ΡΠΌΠΈ, ΠΏΡΠ΅Π²ΡΡΠ°ΡΡΠΈΠΌΠΈ ΡΠ°Π·ΠΌΠ΅Ρ ΡΡΡΠ°Π½ΠΈΡΡ, ΠΎΠ΄Π½Π°ΠΊΠΎ Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ ΡΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎ Π²Π»ΠΈΡΡΡ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ, ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ ΠΏΡΠΈ ΡΠ°ΡΡΠΎΠΌ Π΄ΠΎΡΡΡΠΏΠ΅ ΠΊ Π±ΠΎΠ»ΡΡΠΈΠΌ JSONB-Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌ.
ΠΠ»Ρ Π½Π°ΡΠ°Π»Π° ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΠΌΡΡ ΠΊ ΡΠ΅ΡΠ²Π΅ΡΡ PostgreSQL:
psql -U postgresΠ‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ
imdb:
CREATE DATABASE "imdb";Π‘ΠΊΡΠΈΠΏΡ parse.py ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½ Π΄Π»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΡΠ°ΠΉΠ»Π° actors.list.txt ΠΈΠ· Π½Π°Π±ΠΎΡΠ° Π΄Π°Π½Π½ΡΡ
IMDB ΠΈ Π·Π°Π³ΡΡΠ·ΠΊΠΈ ΡΡΠΈΡ
Π΄Π°Π½Π½ΡΡ
Π² PostgreSQL Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ
, ΠΊΠ°ΠΊ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ Π² ΡΠ΅Ρ
Π½ΠΈΡΠ΅ΡΠΊΠΎΠΌ Π·Π°Π΄Π°Π½ΠΈΠΈ.
- psycopg2 - Π΄Π»Ρ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ Ρ PostgreSQL.
- json - Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ JSON-ΡΠΎΡΠΌΠ°ΡΠΎΠΌ Π΄Π°Π½Π½ΡΡ .
- re - Π΄Π»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΠ΅Π³ΡΠ»ΡΡΠ½ΡΡ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠΉ ΠΏΡΠΈ ΠΏΠ°ΡΡΠΈΠ½Π³Π΅ ΡΠ°ΠΉΠ»Π°.
- time - Π΄Π»Ρ ΠΈΠ·ΠΌΠ΅ΡΠ΅Π½ΠΈΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ ΡΡΠ°ΠΏΠΎΠ².
- concurrent.futures.ThreadPoolExecutor - Π΄Π»Ρ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎΠΉ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ Π΄Π°Π½Π½ΡΡ .
- os - Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΈ ΡΠ°Π±ΠΎΡΡ Ρ ΡΠ°ΠΉΠ»Π°ΠΌΠΈ.
- psycopg2.extras.execute_values - Π΄Π»Ρ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΉ ΠΏΠ°ΠΊΠ΅ΡΠ½ΠΎΠΉ Π²ΡΡΠ°Π²ΠΊΠΈ Π΄Π°Π½Π½ΡΡ .
- prettytable - Π΄Π»Ρ ΡΠΎΡΠΌΠ°ΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Π²ΡΠ²ΠΎΠ΄Π° ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠΈ Π² ΠΊΠΎΠ½ΡΠΎΠ»Ρ.
Π‘ΠΊΡΠΈΠΏΡ ΠΎΡΠ³Π°Π½ΠΈΠ·ΠΎΠ²Π°Π½ ΠΏΠΎ ΠΏΡΠΈΠ½ΡΠΈΠΏΡ ΠΏΠΎΡΡΠ°ΠΏΠ½ΠΎΠΉ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ Π΄Π°Π½Π½ΡΡ :
- ΠΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΊ ΠΠ - Ρ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°ΠΌΠΈ PostgreSQL.
- Π§ΡΠ΅Π½ΠΈΠ΅ ΡΠ°ΠΉΠ»Π° - Π·Π°Π³ΡΡΠ·ΠΊΠ° ΡΠ°ΠΉΠ»Π°
actors.list.txtΠ² ΠΏΠ°ΠΌΡΡΡ. - Π Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½ΡΡ
- ΡΠ°Π·Π±ΠΈΠ΅Π½ΠΈΠ΅ ΡΠ°ΠΉΠ»Π° Π½Π° Π±Π»ΠΎΠΊΠΈ Π°ΠΊΡΠ΅ΡΠΎΠ² ΠΏΠΎ ΠΏΡΡΡΡΠΌ ΡΡΡΠΎΠΊΠ°ΠΌ: Π΄Π»Ρ ΡΠΎΠ»ΠΈ Π°ΠΊΡΡΡΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡΡ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π·Π΄Π΅Π»ΠΈΡΠ΅Π»Ρ
LF, Π΄Π»Ρ Π°ΠΊΡΡΡΠΎΠ² - Π΄Π²Π°LF. - ΠΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½Π°Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° - ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΡΠΉ ΠΏΠ°ΡΡΠΈΠ½Π³ Π΄Π°Π½Π½ΡΡ ΠΎΠ± Π°ΠΊΡΠ΅ΡΠ°Ρ ΠΈ ΠΈΡ ΡΠΎΠ»ΡΡ .
- ΠΠ°ΠΊΠ΅ΡΠ½Π°Ρ Π²ΡΡΠ°Π²ΠΊΠ° - ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½Π°Ρ Π·Π°Π³ΡΡΠ·ΠΊΠ° ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°Π½Π½ΡΡ Π΄Π°Π½Π½ΡΡ Π² ΠΠ.
- Π‘Π±ΠΎΡ ΠΈ Π²ΡΠ²ΠΎΠ΄ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠΈ - Π°Π½Π°Π»ΠΈΠ· ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ ΠΈ Π²ΡΠ²ΠΎΠ΄ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠ².
- parse_name(name_text) - ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅Ρ ΠΈΠΌΡ ΠΈ ΡΠ°ΠΌΠΈΠ»ΠΈΡ Π°ΠΊΡΠ΅ΡΠ° ΠΈΠ· ΡΡΡΠΎΠΊΠΈ ΡΠΎΡΠΌΠ°ΡΠ°
"Π€Π°ΠΌΠΈΠ»ΠΈΡ, ΠΠΌΡ". - parse_role(raw_title) - ΡΠ°Π·Π±ΠΈΡΠ°Π΅Ρ ΡΡΡΠΎΠΊΡ Ρ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ΠΌ ΡΠΎΠ»ΠΈ Π½Π° ΡΠΎΡΡΠ°Π²Π»ΡΡΡΠΈΠ΅:
- Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΡΠΈΠ»ΡΠΌΠ°/ΡΠ΅ΡΠΈΠ°Π»Π°;
- Π³ΠΎΠ΄ Π²ΡΠΏΡΡΠΊΠ°;
- ΡΠΈΠΏΡ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»Π° (TV, V, VG ΠΈ Ρ.Π΄.);
- Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΡΠ΅ΡΠΈΠΈ ΠΈ Π΅Ρ Π½ΠΎΠΌΠ΅Ρ;
- ΠΈΠΌΡ ΠΏΠ΅ΡΡΠΎΠ½Π°ΠΆΠ°;
- Π½ΠΎΠΌΠ΅Ρ Π² ΡΠΈΡΡΠ°Ρ ;
- Π°Π»ΡΡΠ΅ΡΠ½Π°ΡΠΈΠ²Π½ΡΠ΅ ΠΈΠΌΠ΅Π½Π° ΠΏΠ΅ΡΡΠΎΠ½Π°ΠΆΠ°;
- parse_actor_data(actor_block) - ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ Π²Π΅ΡΡ Π±Π»ΠΎΠΊ ΡΠ΅ΠΊΡΡΠ° ΠΎΠ± ΠΎΠ΄Π½ΠΎΠΌ Π°ΠΊΡΠ΅ΡΠ΅.
- clean_string(text) - ΡΠ΄Π°Π»ΡΠ΅Ρ Π΄Π²ΠΎΠΉΠ½ΡΠ΅ ΠΊΠ°Π²ΡΡΠΊΠΈ ΠΈΠ· ΡΡΡΠΎΠΊ.
- process_chunk_of_actors(actors_chunk) - ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π³ΡΡΠΏΠΏΡ Π°ΠΊΡΠ΅ΡΠΎΠ² (Π΄Π»Ρ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ).
- chunk_list(lst, chunk_size) - ΡΠ°Π·Π±ΠΈΠ΅Π½ΠΈΠ΅ ΡΠΏΠΈΡΠΊΠ° Π½Π° ΠΏΠΎΠ΄ΡΠΏΠΈΡΠΊΠΈ.
- format_time(seconds) - ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ΅Ρ ΡΠ΅ΠΊΡΠ½Π΄Ρ Π² ΡΠΈΡΠ°Π΅ΠΌΡΠΉ ΡΠΎΡΠΌΠ°Ρ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ.
- create_schema(cursor) - ΡΠΎΠ·Π΄Π°Π΅Ρ ΡΡΡΡΠΊΡΡΡΡ ΡΠ°Π±Π»ΠΈΡΡ Π² ΠΠ.
- main() - ΠΎΡΠ½ΠΎΠ²Π½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΠΎΡΠ΄ΠΈΠ½ΠΈΡΡΡΡΠ°Ρ Π²Π΅ΡΡ ΠΏΡΠΎΡΠ΅ΡΡ.
- ΠΡΠ΅Π΄ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΡ ΡΠ΅Π³ΡΠ»ΡΡΠ½ΡΡ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠΉ - Π΄Π»Ρ Π±ΠΎΠ»Π΅Π΅ Π±ΡΡΡΡΠΎΠ³ΠΎ ΠΏΠ°ΡΡΠΈΠ½Π³Π°.
- ΠΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½Π°Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° - ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅
ThreadPoolExecutorΡ ΠΎΠΏΡΠΈΠΌΠ°Π»ΡΠ½ΡΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎΠΌ ΠΏΠΎΡΠΎΠΊΠΎΠ², Π·Π°Π²ΠΈΡΡΡΠΈΠΌ ΠΎΡ ΡΠΈΡΠ»Π° ΡΠ΄Π΅Ρ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ°. - ΠΠ°ΠΊΠ΅ΡΠ½ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ - Π³ΡΡΠΏΠΏΠΈΡΠΎΠ²ΠΊΠ° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ Π²ΡΡΠ°Π²ΠΊΠΈ Π΄Π°Π½Π½ΡΡ .
- ΠΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ ΠΏΠ°ΠΌΡΡΠΈ - ΡΠ²ΠΎΠ΅Π²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠ΅ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΌΡΡΠΈ ΠΏΠΎΡΠ»Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΎΠ±ΡΠ΅ΠΌΠ½ΡΡ Π΄Π°Π½Π½ΡΡ .
- ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° PostgreSQL - ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ²:
work_mem=64MB- ΡΠ²Π΅Π»ΠΈΡΠ΅Π½Π½Π°Ρ ΠΏΠ°ΠΌΡΡΡ Π΄Π»Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠΈ ΠΈ Ρ Π΅ΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ;statement_timeout=0- ΠΎΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠΉ Π½Π° Π²ΡΠ΅ΠΌΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π·Π°ΠΏΡΠΎΡΠ°.
Π‘ΠΊΡΠΈΠΏΡ ΡΠΎΠ·Π΄Π°Π΅Ρ ΡΠ°Π±Π»ΠΈΡΡ actors ΡΠΎ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌΠΈ ΠΏΠΎΠ»ΡΠΌΠΈ:
- id - Π°Π²ΡΠΎΠΈΠ½ΠΊΡΠ΅ΠΌΠ΅Π½ΡΠ½ΡΠΉ ΠΏΠ΅ΡΠ²ΠΈΡΠ½ΡΠΉ ΠΊΠ»ΡΡ.
- ActorFirstName - ΠΈΠΌΡ Π°ΠΊΡΠ΅ΡΠ°.
- ActorSecondName - ΡΠ°ΠΌΠΈΠ»ΠΈΡ Π°ΠΊΡΠ΅ΡΠ°.
- RolesName - ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΡΠΎΠ»ΡΡ Π² ΡΠΎΡΠΌΠ°ΡΠ΅ JSONB.
CREATE TABLE IF NOT EXISTS actors (
id SERIAL PRIMARY KEY,
ActorFirstName TEXT,
ActorSecondName TEXT,
RolesName JSONB
);ΠΠΎΠ»Π΅ RolesName ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΌΠ°ΡΡΠΈΠ² ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ², ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΈΠ· ΠΊΠΎΡΠΎΡΡΡ
ΠΎΠΏΠΈΡΡΠ²Π°Π΅Ρ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ ΡΠΎΠ»Ρ Π°ΠΊΡΠ΅ΡΠ° ΡΠΎ Π²ΡΠ΅ΠΌΠΈ Π°ΡΡΠΈΠ±ΡΡΠ°ΠΌΠΈ, ΡΠΊΠ°Π·Π°Π½Π½ΡΠΌΠΈ Π² Π·Π°Π΄Π°Π½ΠΈΠΈ (Π½Π°Π·Π²Π°Π½ΠΈΠ΅, Π³ΠΎΠ΄, ΠΏΠ΅ΡΡΠΎΠ½Π°ΠΆ ΠΈ Ρ.Π΄.).
Π‘ΠΊΡΠΈΠΏΡ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π΅Ρ Π²ΡΠ΅ΠΌΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΡΠ°ΠΏΠ° ΠΈ Π² ΠΊΠΎΠ½ΡΠ΅ Π²ΡΠ²ΠΎΠ΄ΠΈΡ Π΄Π΅ΡΠ°Π»ΡΠ½ΡΡ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΡ:
- ΠΠ±ΡΠ΅Π΅ Π²ΡΠ΅ΠΌΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΈ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡΡΠ°ΠΏΠ°ΠΌ.
- ΠΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ (Π°ΠΊΡΠ΅ΡΠΎΠ² ΠΈ ΡΠΎΠ»Π΅ΠΉ Π² ΡΠ΅ΠΊΡΠ½Π΄Ρ).
- Π‘ΠΎΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π° ΡΠΎΠ»Π΅ΠΉ ΠΊ Π°ΠΊΡΠ΅ΡΠ°ΠΌ.
Π ΡΠΊΡΠΈΠΏΡΠ΅ ΠΏΠ΅ΡΠ΅Π΄ ΠΌΠ°ΡΡΠΎΠ²ΠΎΠΉ Π²ΡΡΠ°Π²ΠΊΠΎΠΉ Π΄Π°Π½Π½ΡΡ
Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΠΏΠΎΠ»Π½Π°Ρ ΠΎΡΠΈΡΡΠΊΠ° ΡΠ°Π±Π»ΠΈΡΡ actors Π΄Π»Ρ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΡ "ΡΠΈΡΡΡΡ
" Π·Π°ΠΏΡΡΠΊΠΎΠ²:
# ΠΡΠΈΡΠ°Π΅ΠΌ ΡΠ°Π±Π»ΠΈΡΡ ΠΏΠ΅ΡΠ΅Π΄ Π²ΡΡΠ°Π²ΠΊΠΎΠΉ
truncate_start = time.time()
# ΠΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΈΡΠΏΡΠΎΠ»ΡΠ·ΡΠ΅ΠΌ "RESTART IDENTITY", ΡΡΠΎΠ±Ρ ΡΠ±ΡΠΎΡΠΈΡΡ ΡΡΠ΅ΡΡΠΈΠΊ ID
cursor.execute("TRUNCATE TABLE actors RESTART IDENTITY")
timing["truncate"] = time.time() - truncate_startΠΠ°ΠΆΠ½ΡΠ΅ Π°ΡΠΏΠ΅ΠΊΡΡ ΡΡΠΎΠ³ΠΎ ΡΡΠ°ΠΏΠ°:
- ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Π°
TRUNCATE TABLEΠ²ΠΌΠ΅ΡΡΠΎDELETE FROMΠ΄Π»Ρ Π±ΠΎΠ»Π΅Π΅ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΠΉ ΠΎΡΠΈΡΡΠΊΠΈ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½Π° Π½Π΅ ΡΠΊΠ°Π½ΠΈΡΡΠ΅Ρ ΡΠ°Π±Π»ΠΈΡΡ ΠΈ ΡΡΠ΅Π±ΡΠ΅Ρ ΠΌΠ΅Π½ΡΡΠ΅ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΎΠΊ ΡΠ΅ΡΡΡΡΠΎΠ². - ΠΠΏΡΠΈΡ
RESTART IDENTITYΡΠ±ΡΠ°ΡΡΠ²Π°Π΅Ρ ΡΡΠ΅ΡΡΠΈΠΊ Π°Π²ΡΠΎΠΈΠ½ΠΊΡΠ΅ΠΌΠ΅Π½ΡΠ½ΠΎΠ³ΠΎ ΠΏΠ΅ΡΠ²ΠΈΡΠ½ΠΎΠ³ΠΎ ΠΊΠ»ΡΡΠ°idΠ΄ΠΎ Π½Π°ΡΠ°Π»ΡΠ½ΠΎΠ³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ, ΡΡΠΎ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡΠ΅ ID ΠΏΡΠΈ ΠΏΠΎΠ²ΡΠΎΡΠ½ΡΡ Π·Π°ΠΏΡΡΠΊΠ°Ρ . - ΠΡΠ΅ΠΌΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΡΡΠΎΠΉ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΈΠ·ΠΌΠ΅ΡΡΠ΅ΡΡΡ ΠΈ ΡΠΎΡ ΡΠ°Π½ΡΠ΅ΡΡΡ Π΄Π»Ρ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠ΅Π³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ.
ΠΠΎΡΠ»Π΅ Π·Π°Π³ΡΡΠ·ΠΊΠΈ Π²ΡΠ΅Ρ Π΄Π°Π½Π½ΡΡ ΡΠΊΡΠΈΠΏΡ ΡΠΎΠ·Π΄Π°Π΅Ρ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ ΠΈΠ½Π΄Π΅ΠΊΡΡ Π΄Π»Ρ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠΈΡ Π·Π°ΠΏΡΠΎΡΠΎΠ²:
# ΠΡΠ΅ΠΌΡ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΈΠ½Π΄Π΅ΠΊΡΠΎΠ²
index_start = time.time()
print("Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΈΠ½Π΄Π΅ΠΊΡΠΎΠ²...")
# Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΠΈΠ½Π΄Π΅ΠΊΡ Π΄Π»Ρ ΡΡΠΊΠΎΡΠ΅Π½ΠΈΡ ΠΏΠΎΠΈΡΠΊΠ°, Π΅ΡΠ»ΠΈ Π΅Π³ΠΎ Π½Π΅Ρ
cursor.execute(
"""
CREATE INDEX IF NOT EXISTS idx_actors_names
ON actors (ActorFirstName, ActorSecondName)
"""
)
# Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ GIN-ΠΈΠ½Π΄Π΅ΠΊΡ Π΄Π»Ρ ΠΏΠΎΠΈΡΠΊΠ° ΠΏΠΎ JSON, Π΅ΡΠ»ΠΈ Π΅Π³ΠΎ Π½Π΅Ρ
cursor.execute(
"""
CREATE INDEX IF NOT EXISTS idx_actors_roles
ON actors USING GIN (RolesName jsonb_path_ops)
"""
)
conn.commit()
timing["index"] = time.time() - index_start
print(f"Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΈΠ½Π΄Π΅ΠΊΡΠΎΠ²: {format_time(timing['index'])}")ΠΠ°ΠΆΠ½ΡΠ΅ Π΄Π΅ΡΠ°Π»ΠΈ ΡΡΠΎΠ³ΠΎ ΡΡΠ°ΠΏΠ°:
- Π‘ΠΎΠ·Π΄Π°Π΅ΡΡΡ ΡΠΎΡΡΠ°Π²Π½ΠΎΠΉ B-tree ΠΈΠ½Π΄Π΅ΠΊΡ
idx_actors_namesΠΏΠΎ ΡΡΠΎΠ»Π±ΡΠ°ΠΌActorFirstNameΠΈActorSecondName, ΡΡΠΎ ΡΡΠΊΠΎΡΡΠ΅Ρ ΠΏΠΎΠΈΡΠΊ ΠΈ ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΡ ΠΏΠΎ ΠΈΠΌΠ΅Π½Π°ΠΌ Π°ΠΊΡΠ΅ΡΠΎΠ². - Π‘ΠΎΠ·Π΄Π°Π΅ΡΡΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ GIN (Generalized Inverted Index) ΠΈΠ½Π΄Π΅ΠΊΡ
idx_actors_rolesΠ΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ JSONB-ΠΏΠΎΠ»Π΅ΠΌRolesName. ΠΡΠΎΡ ΡΠΈΠΏ ΠΈΠ½Π΄Π΅ΠΊΡΠ° ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°Π½ Π΄Π»Ρ ΠΏΠΎΠ»Π½ΠΎΡΠ΅ΠΊΡΡΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠΎΠΈΡΠΊΠ° ΠΈ ΠΏΠΎΠΈΡΠΊΠ° ΠΏΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΠΌ/ΠΊΠ»ΡΡΠ°ΠΌ Π² JSON-ΡΡΡΡΠΊΡΡΡΠ°Ρ . - ΠΠΏΡΠΈΡ
jsonb_path_opsΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΡΠ΅Ρ ΠΈΠ½Π΄Π΅ΠΊΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΠΎ Π΄Π»Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΎΠ² ΠΏΠΎΠΈΡΠΊΠ° ΠΏΠΎ ΠΏΡΡΠΈ Π² JSONB ΠΈ Π΄Π΅Π»Π°Π΅Ρ ΠΏΠΎΠΈΡΠΊ Π±ΠΎΠ»Π΅Π΅ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΡΠΌ Π΄Π»Ρ Π·Π°Π΄Π°Π½ΠΈΠΉ ΠΈΠ· ΡΠ΅Ρ Π½ΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ Π·Π°Π΄Π°Π½ΠΈΡ. - ΠΠΎΡΠ»Π΅ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΈΠ½Π΄Π΅ΠΊΡΠΎΠ² Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΡΠ²Π½ΡΠΉ
commitΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ Π΄Π»Ρ ΡΠΈΠΊΡΠ°ΡΠΈΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ. - ΠΡΠ΅ΠΌΡ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΈΠ½Π΄Π΅ΠΊΡΠΎΠ² ΠΈΠ·ΠΌΠ΅ΡΡΠ΅ΡΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΡΡΠΎ ΡΠ΅ΡΡΡΡΠΎΠ΅ΠΌΠΊΠ°Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ, ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ Π΄Π»Ρ Π±ΠΎΠ»ΡΡΠΈΡ ΠΎΠ±ΡΠ΅ΠΌΠΎΠ² Π΄Π°Π½Π½ΡΡ .
ΠΠ°Π½Π½ΡΠ΅ ΠΈΠ½Π΄Π΅ΠΊΡΡ ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈ Π²Π°ΠΆΠ½Ρ Π΄Π»Ρ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΠ³ΠΎ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π·Π°ΠΏΡΠΎΡΠΎΠ² ΠΈΠ· ΡΠ΅Ρ Π½ΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ Π·Π°Π΄Π°Π½ΠΈΡ, ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ ΡΠ΅Ρ , ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π½Π° Π²Ρ ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ Π² JSONB ΠΈ jsonpath.
ΠΠ»Ρ ΡΠ°Π±ΠΎΡΡ ΡΠΊΡΠΈΠΏΡΠ° Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ. Π‘Π΄Π΅Π»Π°ΡΡ ΡΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π² Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΠΎΠ΅ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠ΅ ΠΈ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΠ² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΈΠ· ΡΠ°ΠΉΠ»Π° requirements.txt:
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txtΠ€Π°ΠΉΠ» requirements.txt ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ:
psycopg2>=2.9.10
prettytable>=3.15.1
pandas>=2.2.3
matplotlib>=3.10.1
numpy>=2.2.4
scipy>=1.15.2
ΠΠ΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΠ· ΠΎΠΏΠΈΡΠ°Π½Π½ΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΡΡΡΡ Π² ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠΈΡ ΡΡΠ°ΠΏΠ°Ρ Π΄Π»Ρ Π°Π½Π°Π»ΠΈΠ·Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ ΠΈ ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΡ Π³ΡΠ°ΡΠΈΠΊΠΎΠ².
ΠΠ»Ρ Π·Π°ΠΏΡΡΠΊΠ° ΡΠΊΡΠΈΠΏΡΠ° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ:
python ./0-parse/parse.pyΠΠΎΠ»Π½ΡΠΉ Π»ΠΈΡΡΠΈΠ½Π³ ΠΏΡΠΎΡΠ΅ΡΡΠ° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΡΠ°ΠΉΠ»Π° ΠΈ Π·Π°Π³ΡΡΠ·ΠΊΠΈ Π΄Π°Π½Π½ΡΡ Π² ΠΠ:
ΠΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΊ ΠΠ: 0.14Ρ
Π§ΡΠ΅Π½ΠΈΠ΅ ΡΠ°ΠΉΠ»Π°...
Π€Π°ΠΉΠ» ΠΏΡΠΎΡΠΈΡΠ°Π½, ΡΠ°Π·ΠΌΠ΅Ρ: 1235.54 ΠΠ, Π²ΡΠ΅ΠΌΡ: 4.88Ρ
Π Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½ΡΡ
Π½Π° Π±Π»ΠΎΠΊΠΈ Π°ΠΊΡΠ΅ΡΠΎΠ²...
ΠΡΠ΅Π³ΠΎ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ Π±Π»ΠΎΠΊΠΎΠ² Π°ΠΊΡΠ΅ΡΠΎΠ²: 2673784, Π²ΡΠ΅ΠΌΡ: 1.08Ρ
ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π΄Π°Π½Π½ΡΡ
...
ΠΠΎΡΠΎΠΊΠΎΠ² Π΄Π»Ρ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎΠΉ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ: 24
ΠΡΠ΅Π³ΠΎ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°Π½ΠΎ Π°ΠΊΡΠ΅ΡΠΎΠ²: 2673784, ΡΠΎΠ»Π΅ΠΉ: 19993184, Π²ΡΠ΅ΠΌΡ: 2ΠΌ 9.07Ρ
ΠΡΡΠ°Π²ΠΊΠ° Π΄Π°Π½Π½ΡΡ
Π² Π±Π°Π·Ρ...
ΠΡΡΠ°Π²Π»Π΅Π½ΠΎ 100000 ΠΈΠ· 2673784 Π·Π°ΠΏΠΈΡΠ΅ΠΉ (3.7%)... ΠΡΡΠ°Π»ΠΎΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ: 1ΠΌ 54.50Ρ
ΠΡΡΠ°Π²Π»Π΅Π½ΠΎ 200000 ΠΈΠ· 2673784 Π·Π°ΠΏΠΈΡΠ΅ΠΉ (7.5%)... ΠΡΡΠ°Π»ΠΎΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ: 1ΠΌ 38.30Ρ
ΠΡΡΠ°Π²Π»Π΅Π½ΠΎ 300000 ΠΈΠ· 2673784 Π·Π°ΠΏΠΈΡΠ΅ΠΉ (11.2%)... ΠΡΡΠ°Π»ΠΎΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ: 1ΠΌ 34.01Ρ
ΠΡΡΠ°Π²Π»Π΅Π½ΠΎ 400000 ΠΈΠ· 2673784 Π·Π°ΠΏΠΈΡΠ΅ΠΉ (15.0%)... ΠΡΡΠ°Π»ΠΎΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ: 1ΠΌ 31.12Ρ
ΠΡΡΠ°Π²Π»Π΅Π½ΠΎ 500000 ΠΈΠ· 2673784 Π·Π°ΠΏΠΈΡΠ΅ΠΉ (18.7%)... ΠΡΡΠ°Π»ΠΎΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ: 1ΠΌ 26.43Ρ
ΠΡΡΠ°Π²Π»Π΅Π½ΠΎ 600000 ΠΈΠ· 2673784 Π·Π°ΠΏΠΈΡΠ΅ΠΉ (22.4%)... ΠΡΡΠ°Π»ΠΎΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ: 1ΠΌ 22.42Ρ
ΠΡΡΠ°Π²Π»Π΅Π½ΠΎ 700000 ΠΈΠ· 2673784 Π·Π°ΠΏΠΈΡΠ΅ΠΉ (26.2%)... ΠΡΡΠ°Π»ΠΎΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ: 1ΠΌ 17.85Ρ
ΠΡΡΠ°Π²Π»Π΅Π½ΠΎ 800000 ΠΈΠ· 2673784 Π·Π°ΠΏΠΈΡΠ΅ΠΉ (29.9%)... ΠΡΡΠ°Π»ΠΎΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ: 1ΠΌ 13.97Ρ
ΠΡΡΠ°Π²Π»Π΅Π½ΠΎ 900000 ΠΈΠ· 2673784 Π·Π°ΠΏΠΈΡΠ΅ΠΉ (33.7%)... ΠΡΡΠ°Π»ΠΎΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ: 1ΠΌ 10.28Ρ
ΠΡΡΠ°Π²Π»Π΅Π½ΠΎ 1000000 ΠΈΠ· 2673784 Π·Π°ΠΏΠΈΡΠ΅ΠΉ (37.4%)... ΠΡΡΠ°Π»ΠΎΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ: 1ΠΌ 5.87Ρ
ΠΡΡΠ°Π²Π»Π΅Π½ΠΎ 1100000 ΠΈΠ· 2673784 Π·Π°ΠΏΠΈΡΠ΅ΠΉ (41.1%)... ΠΡΡΠ°Π»ΠΎΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ: 1ΠΌ 2.04Ρ
ΠΡΡΠ°Π²Π»Π΅Π½ΠΎ 1200000 ΠΈΠ· 2673784 Π·Π°ΠΏΠΈΡΠ΅ΠΉ (44.9%)... ΠΡΡΠ°Π»ΠΎΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ: 57.91Ρ
ΠΡΡΠ°Π²Π»Π΅Π½ΠΎ 1300000 ΠΈΠ· 2673784 Π·Π°ΠΏΠΈΡΠ΅ΠΉ (48.6%)... ΠΡΡΠ°Π»ΠΎΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ: 53.74Ρ
ΠΡΡΠ°Π²Π»Π΅Π½ΠΎ 1400000 ΠΈΠ· 2673784 Π·Π°ΠΏΠΈΡΠ΅ΠΉ (52.4%)... ΠΡΡΠ°Π»ΠΎΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ: 49.75Ρ
ΠΡΡΠ°Π²Π»Π΅Π½ΠΎ 1500000 ΠΈΠ· 2673784 Π·Π°ΠΏΠΈΡΠ΅ΠΉ (56.1%)... ΠΡΡΠ°Π»ΠΎΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ: 45.86Ρ
ΠΡΡΠ°Π²Π»Π΅Π½ΠΎ 1600000 ΠΈΠ· 2673784 Π·Π°ΠΏΠΈΡΠ΅ΠΉ (59.8%)... ΠΡΡΠ°Π»ΠΎΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ: 42.08Ρ
ΠΡΡΠ°Π²Π»Π΅Π½ΠΎ 1700000 ΠΈΠ· 2673784 Π·Π°ΠΏΠΈΡΠ΅ΠΉ (63.6%)... ΠΡΡΠ°Π»ΠΎΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ: 38.04Ρ
ΠΡΡΠ°Π²Π»Π΅Π½ΠΎ 1800000 ΠΈΠ· 2673784 Π·Π°ΠΏΠΈΡΠ΅ΠΉ (67.3%)... ΠΡΡΠ°Π»ΠΎΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ: 33.71Ρ
ΠΡΡΠ°Π²Π»Π΅Π½ΠΎ 1900000 ΠΈΠ· 2673784 Π·Π°ΠΏΠΈΡΠ΅ΠΉ (71.1%)... ΠΡΡΠ°Π»ΠΎΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ: 29.88Ρ
ΠΡΡΠ°Π²Π»Π΅Π½ΠΎ 2000000 ΠΈΠ· 2673784 Π·Π°ΠΏΠΈΡΠ΅ΠΉ (74.8%)... ΠΡΡΠ°Π»ΠΎΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ: 25.99Ρ
ΠΡΡΠ°Π²Π»Π΅Π½ΠΎ 2100000 ΠΈΠ· 2673784 Π·Π°ΠΏΠΈΡΠ΅ΠΉ (78.5%)... ΠΡΡΠ°Π»ΠΎΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ: 22.10Ρ
ΠΡΡΠ°Π²Π»Π΅Π½ΠΎ 2200000 ΠΈΠ· 2673784 Π·Π°ΠΏΠΈΡΠ΅ΠΉ (82.3%)... ΠΡΡΠ°Π»ΠΎΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ: 18.25Ρ
ΠΡΡΠ°Π²Π»Π΅Π½ΠΎ 2300000 ΠΈΠ· 2673784 Π·Π°ΠΏΠΈΡΠ΅ΠΉ (86.0%)... ΠΡΡΠ°Π»ΠΎΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ: 14.37Ρ
ΠΡΡΠ°Π²Π»Π΅Π½ΠΎ 2400000 ΠΈΠ· 2673784 Π·Π°ΠΏΠΈΡΠ΅ΠΉ (89.8%)... ΠΡΡΠ°Π»ΠΎΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ: 10.50Ρ
ΠΡΡΠ°Π²Π»Π΅Π½ΠΎ 2500000 ΠΈΠ· 2673784 Π·Π°ΠΏΠΈΡΠ΅ΠΉ (93.5%)... ΠΡΡΠ°Π»ΠΎΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ: 6.69Ρ
ΠΡΡΠ°Π²Π»Π΅Π½ΠΎ 2600000 ΠΈΠ· 2673784 Π·Π°ΠΏΠΈΡΠ΅ΠΉ (97.2%)... ΠΡΡΠ°Π»ΠΎΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ: 2.84Ρ
ΠΡΡΠ°Π²ΠΊΠ° Π΄Π°Π½Π½ΡΡ
: 1ΠΌ 42.00Ρ
Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΈΠ½Π΄Π΅ΠΊΡΠΎΠ²...
Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΈΠ½Π΄Π΅ΠΊΡΠΎΠ²: 1ΠΌ 10.10Ρ
+--------------------------------------------------+
| ΠΠ’ΠΠΠΠΠΠ― Π‘Π’ΠΠ’ΠΠ‘Π’ΠΠΠ ΠΠ ΠΠΠΠΠ ΠΠ«ΠΠΠΠΠΠΠΠ― |
+------------------------+-----------+-------------+
| ΠΡΠ°ΠΏ | ΠΡΠ΅ΠΌΡ | % ΠΎΡ ΠΎΠ±ΡΠ΅Π³ΠΎ |
+------------------------+-----------+-------------+
| ΠΠ±ΡΠ΅Π΅ Π²ΡΠ΅ΠΌΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ | 5ΠΌ 7.54Ρ | 100.0% |
| ΠΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΊ ΠΠ | 0.14Ρ | 0.0% |
| Π§ΡΠ΅Π½ΠΈΠ΅ ΡΠ°ΠΉΠ»Π° | 4.88Ρ | 1.6% |
| Π Π°Π·Π±ΠΈΠ΅Π½ΠΈΠ΅ Π½Π° Π±Π»ΠΎΠΊΠΈ | 1.08Ρ | 0.3% |
| ΠΡΠΈΡΡΠΊΠ° ΡΠ°Π±Π»ΠΈΡΡ | 0.10Ρ | 0.0% |
| ΠΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ° ΡΠ°ΡΡΠ΅ΠΉ | 0.17Ρ | 0.1% |
| ΠΠ°ΡΡΠΈΠ½Π³ Π΄Π°Π½Π½ΡΡ
| 2ΠΌ 9.07Ρ | 42.0% |
| ΠΡΡΠ°Π²ΠΊΠ° Π΄Π°Π½Π½ΡΡ
| 1ΠΌ 42.00Ρ | 33.2% |
| Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΈΠ½Π΄Π΅ΠΊΡΠΎΠ² | 1ΠΌ 10.10Ρ | 22.8% |
+------------------------+-----------+-------------+
+----------------------------------------------+
| Π‘Π’ΠΠ’ΠΠ‘Π’ΠΠΠ ΠΠ ΠΠΠΠΠΠΠΠ’ΠΠΠ¬ΠΠΠ‘Π’Π |
+----------------------------------+-----------+
| ΠΠ΅ΡΡΠΈΠΊΠ° | ΠΠ½Π°ΡΠ΅Π½ΠΈΠ΅ |
+----------------------------------+-----------+
| Π‘ΠΊΠΎΡΠΎΡΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ (Π°ΠΊΡΠ΅ΡΠΎΠ²/ΡΠ΅ΠΊ) | 20716.44 |
| Π‘ΠΊΠΎΡΠΎΡΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ (ΡΠΎΠ»Π΅ΠΉ/ΡΠ΅ΠΊ) | 154906.93 |
| Π‘ΠΊΠΎΡΠΎΡΡΡ Π²ΡΡΠ°Π²ΠΊΠΈ (Π°ΠΊΡΠ΅ΡΠΎΠ²/ΡΠ΅ΠΊ) | 26212.65 |
| ΠΠ±ΡΠ°Ρ ΡΠΊΠΎΡΠΎΡΡΡ (Π°ΠΊΡΠ΅ΡΠΎΠ²/ΡΠ΅ΠΊ) | 8694.00 |
| Π‘ΠΎΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠ΅ ΡΠΎΠ»Π΅ΠΉ ΠΊ Π°ΠΊΡΠ΅ΡΠ°ΠΌ | 7.48 |
+----------------------------------+-----------+
ΠΠ»Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π²ΡΠ²Π΅Π΄Π΅ΠΌ ΠΏΠ΅ΡΠ²ΡΠ΅ 3 Π·Π°ΠΏΠΈΡΠΈ ΠΈΠ· ΡΠ°Π±Π»ΠΈΡΡ actors:
psql --tuples-only -U postgres -d imdb -c "select * from actors limit 3;"| id | actorfirstname | actorsecondname | rolesname |
|---|---|---|---|
| 1 | Buffy | #1 | {"roles": [{"year": "2015", "title": "Closet Monster", "credit": "31", "character name": "Buffy 4"}]} |
| 2 | Claw | $ | {"roles": [{"year": "2012", "title": "OnCreativity", "character name": "Himself"}]} |
| 3 | Homo | $ | {"roles": [{"year": "1986", "title": "Nykytaiteen museo", "credit": "25", "character name": "Himself"}, {"year": "1985", "title": "Suuri illusioni", "credit": "22", "character name": "Guests"}]} |
ΠΠ°ΡΠΈΠΊΡΠΈΡΡΠ΅ΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΡΡΠΎΠΊ Π² ΠΈΡΠΎΠ³ΠΎΠ²ΠΎΠΉ ΡΠ°Π±Π»ΠΈΡΠ΅ actors - 2'673'784:
psql -U postgres -d imdb -c "select count(*) from actors;" count
---------
2673784
(1 row)
ΠΠ°ΠΏΡΡΡΠΈΠΌ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΡ
Π·Π°ΠΏΡΠΎΡΠΎΠ² ΠΈΠ· ΡΠ°ΠΉΠ»Π° ./1-queries/queries.sql Π²ΡΠΏΠΎΠ»Π½ΠΈΠ² ΡΠ»Π΅Π΄ΡΡΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ Π² ΡΠ΅ΡΠΌΠΈΠ½Π°Π»Π΅:
psql -U postgres -d imdb -f ./1-queries/queries.sql | catSELECT
ActorFirstName,
ActorSecondName
FROM
actors
WHERE
RolesName @> '{"roles": [{"character name": "Detective"}]}'
LIMIT 10;ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅:
- ΠΠΏΠ΅ΡΠ°ΡΠΎΡ
@>(ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ/Π²ΠΊΠ»ΡΡΠ°Π΅Ρ) - ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ, ΡΠ²Π»ΡΠ΅ΡΡΡ Π»ΠΈ Π»Π΅Π²ΡΠΉ JSONB-Π΄ΠΎΠΊΡΠΌΠ΅Π½Ρ ΡΡΠΏΠ΅ΡΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎΠΌ ΠΏΡΠ°Π²ΠΎΠ³ΠΎ. - ΠΠ°ΠΏΡΠΎΡ ΠΈΡΠ΅Ρ Π·Π°ΠΏΠΈΡΠΈ, Π³Π΄Π΅ Π² ΠΌΠ°ΡΡΠΈΠ²Π΅
rolesΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ Ρ ΠΎΡΡ Π±Ρ ΠΎΠ΄ΠΈΠ½ ΠΎΠ±ΡΠ΅ΠΊΡ Ρ ΠΏΠΎΠ»Π΅ΠΌ"character name"ΡΠ°Π²Π½ΡΠΌ"Detective". - ΠΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²ΠΎ: ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ GIN-ΠΈΠ½Π΄Π΅ΠΊΡ ΠΏΠΎ JSONB, ΡΡΠΎ Π΄Π΅Π»Π°Π΅Ρ ΠΏΠΎΠΈΡΠΊ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΡΠΌ.
LIMIT 10ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΠ²Π°Π΅Ρ Π²ΡΠ²ΠΎΠ΄ ΠΏΠ΅ΡΠ²ΡΠΌΠΈ 10 ΡΠΎΠ²ΠΏΠ°Π΄Π΅Π½ΠΈΡΠΌΠΈ.
SELECT
ActorFirstName,
ActorSecondName,
RolesName -> 'roles' -> 0 ->> 'title'
FROM
actors
WHERE
RolesName @> '{"roles": [{"year": "2002"}]}'
AND RolesName @> '{"roles": [{"character name": "Himself"}]}'
LIMIT 10;ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅:
- ΠΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ Π΄Π²Π° ΡΡΠ»ΠΎΠ²ΠΈΡ Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΎΠΌ
@>, ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½Π½ΡΠ΅ ΡΠ΅ΡΠ΅Π·AND. - ΠΠ΅ΡΠ²ΠΎΠ΅ ΡΡΠ»ΠΎΠ²ΠΈΠ΅: ΠΈΡΠ΅Ρ ΡΠΎΠ»ΠΈ Ρ Π³ΠΎΠ΄ΠΎΠΌ "2002".
- ΠΡΠΎΡΠΎΠ΅ ΡΡΠ»ΠΎΠ²ΠΈΠ΅: ΠΈΡΠ΅Ρ ΡΠΎΠ»ΠΈ Ρ ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΏΠ΅ΡΡΠΎΠ½Π°ΠΆΠ° "Himself".
- ΠΠΏΠ΅ΡΠ°ΡΠΎΡ
->- ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅Ρ ΠΏΠΎΠ»Π΅ ΠΈΠ· JSONB ΠΊΠ°ΠΊ JSONB-ΠΎΠ±ΡΠ΅ΠΊΡ. - ΠΠΏΠ΅ΡΠ°ΡΠΎΡ
->>- ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅Ρ ΠΏΠΎΠ»Π΅ ΠΈΠ· JSONB ΠΊΠ°ΠΊ ΡΠ΅ΠΊΡΡ (TEXT). RolesName->'roles'->0->>'title'- ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ²ΠΎΠΉ ΡΠΎΠ»ΠΈ ΠΈΠ· ΡΠΏΠΈΡΠΊΠ°.
SELECT
COUNT(*)
FROM
actors
WHERE
RolesName -> 'roles' -> 0 ? 'type1';;ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅:
- ΠΠΏΠ΅ΡΠ°ΡΠΎΡ
?- ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ ΡΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠ»ΡΡΠ° Π² JSONB-ΠΎΠ±ΡΠ΅ΠΊΡΠ΅ (Π±Π΅Π· ΡΡΠ΅ΡΠ° Π΅Π³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ). RolesName->'roles'->0- ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΠ΅ ΠΊ ΠΏΠ΅ΡΠ²ΠΎΠΉ ΡΠΎΠ»ΠΈ Π² ΠΌΠ°ΡΡΠΈΠ²Π΅ ΡΠΎΠ»Π΅ΠΉ.- ΠΠ°ΠΏΡΠΎΡ ΠΏΠΎΠ΄ΡΡΠΈΡΡΠ²Π°Π΅Ρ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π°ΠΊΡΠ΅ΡΠΎΠ², Ρ ΠΊΠΎΡΠΎΡΡΡ Π² ΠΏΠ΅ΡΠ²ΠΎΠΉ ΡΠΎΠ»ΠΈ ΡΠΊΠ°Π·Π°Π½ ΡΠΈΠΏ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»Π° (type1).
SELECT
ActorFirstName,
ActorSecondName,
RolesName -> 'roles' -> 0 ->> 'title' AS first_role_title,
RolesName -> 'roles' -> 0 ->> 'year' AS first_role_year
FROM
actors
LIMIT 15;ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅:
- ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΡ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΠΌ ΠΌΠ°ΡΡΠΈΠ²Π° ΠΏΠΎ ΠΈΠ½Π΄Π΅ΠΊΡΡ.
->0- ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΠ΅ ΠΊ ΠΏΠ΅ΡΠ²ΠΎΠΌΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ ΠΌΠ°ΡΡΠΈΠ²Π° (Π² PostgreSQL ΠΈΠ½Π΄Π΅ΠΊΡΠ°ΡΠΈΡ Π½Π°ΡΠΈΠ½Π°Π΅ΡΡΡ Ρ 0).->>'title'- ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΊΠ»ΡΡΠ° 'title' ΠΊΠ°ΠΊ ΡΠ΅ΠΊΡΡ.AS- Π·Π°Π΄Π°Π΅Ρ ΠΏΡΠ΅Π²Π΄ΠΎΠ½ΠΈΠΌΡ Π΄Π»Ρ Π²ΡΡ ΠΎΠ΄Π½ΡΡ ΡΡΠΎΠ»Π±ΡΠΎΠ².- ΠΡΠ²ΠΎΠ΄ΠΈΡ ΠΈΠΌΠ΅Π½Π° Π°ΠΊΡΠ΅ΡΠΎΠ² ΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎΠ± ΠΈΡ ΠΏΠ΅ΡΠ²ΠΎΠΉ ΡΠΎΠ»ΠΈ (Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΈ Π³ΠΎΠ΄).
SELECT
ActorFirstName,
ActorSecondName,
jsonb_array_length(RolesName -> 'roles') AS roles_count
FROM
actors
ORDER BY
roles_count DESC
LIMIT 10;ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅:
jsonb_array_length()- Π²ΡΡΡΠΎΠ΅Π½Π½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡΠ°Ρ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² Π² JSONB-ΠΌΠ°ΡΡΠΈΠ²Π΅.ORDER BY roles_count DESC- ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠ° Π² ΠΏΠΎΡΡΠ΄ΠΊΠ΅ ΡΠ±ΡΠ²Π°Π½ΠΈΡ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π° ΡΠΎΠ»Π΅ΠΉ.- ΠΡΠ²ΠΎΠ΄ΠΈΡ Π’ΠΠ-10 Π°ΠΊΡΠ΅ΡΠΎΠ² Ρ Π½Π°ΠΈΠ±ΠΎΠ»ΡΡΠΈΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎΠΌ ΡΠΎΠ»Π΅ΠΉ Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½ΡΡ .
SELECT
ActorFirstName,
ActorSecondName
FROM
actors
WHERE
jsonb_path_exists(RolesName, '$.roles[*] ? (@.year >= "2010" && @.credit == "1")')
LIMIT 10;ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅:
jsonb_path_exists()- ΡΡΠ½ΠΊΡΠΈΡ, ΠΏΡΠΎΠ²Π΅ΡΡΡΡΠ°Ρ ΡΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ², ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΡ JSONPath-Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ.$- ΠΊΠΎΡΠ½Π΅Π²ΠΎΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°.roles[*]- ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΠ΅ ΠΊΠΎ Π²ΡΠ΅ΠΌ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΠΌ ΠΌΠ°ΡΡΠΈΠ²Π°roles.?- ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ ΡΠΈΠ»ΡΡΡΠ° Π² JSONPath.@- ΡΠ΅ΠΊΡΡΠΈΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΠΏΡΠΈ ΠΈΡΠ΅ΡΠ°ΡΠΈΠΈ.@.year >= "2010" && @.credit == "1"- ΡΡΠ»ΠΎΠ²ΠΈΠ΅: Π³ΠΎΠ΄ Π±ΠΎΠ»ΡΡΠ΅ ΠΈΠ»ΠΈ ΡΠ°Π²Π΅Π½ 2010 Π Π½ΠΎΠΌΠ΅Ρ Π² ΡΠΈΡΡΠ°Ρ ΡΠ°Π²Π΅Π½ 1.- ΠΠ°Ρ ΠΎΠ΄ΠΈΡ Π°ΠΊΡΠ΅ΡΠΎΠ², ΡΡΠ³ΡΠ°Π²ΡΠΈΡ Π³Π»Π°Π²Π½ΡΡ ΡΠΎΠ»Ρ (credit=1) Π² ΡΠΈΠ»ΡΠΌΠ°Ρ 2010 Π³ΠΎΠ΄Π° ΠΈ ΠΏΠΎΠ·ΠΆΠ΅.
SELECT
ActorFirstName,
ActorSecondName,
jsonb_path_query_array(RolesName, '$.roles[*] ? (@."character name" like_regex ".*Doctor.*")') AS doctor_roles
FROM
actors
WHERE
jsonb_path_exists(RolesName, '$.roles[*] ? (@."character name" like_regex ".*Doctor.*")')
LIMIT 5;ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅:
jsonb_path_query_array()- ΡΠΎΠ±ΠΈΡΠ°Π΅Ρ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ JSONPath-Π·Π°ΠΏΡΠΎΡΠ° Π² JSONB-ΠΌΠ°ΡΡΠΈΠ².like_regex- ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ ΠΏΠΎΠΈΡΠΊΠ° ΠΏΠΎ ΡΠ΅Π³ΡΠ»ΡΡΠ½ΠΎΠΌΡ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ Π² JSONPath.".*Doctor.*"- ΡΠ΅Π³ΡΠ»ΡΡΠ½ΠΎΠ΅ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ ΠΏΠΎΠΈΡΠΊΠ° ΡΡΡΠΎΠΊ, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΡ "Doctor".- Π ΡΡΠ»ΠΎΠ²ΠΈΠΈ WHERE ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ
jsonb_path_exists()Π΄Π»Ρ ΡΠΈΠ»ΡΡΡΠ°ΡΠΈΠΈ Π°ΠΊΡΠ΅ΡΠΎΠ². - ΠΠ°ΠΏΡΠΎΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎΠ± Π°ΠΊΡΠ΅ΡΠ°Ρ ΠΈ ΠΈΡ ΡΠΎΠ»ΡΡ , Π³Π΄Π΅ ΠΈΠΌΡ ΠΏΠ΅ΡΡΠΎΠ½Π°ΠΆΠ° ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ "Doctor".
ΠΠ°ΠΏΡΠΎΡ 8: Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π°Π³ΡΠ΅Π³ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎΠ± Π°ΠΊΡΠ΅ΡΠ΅
SELECT
ActorFirstName,
ActorSecondName,
jsonb_build_object('name', ActorFirstName || ' ' || ActorSecondName, 'roles_count', jsonb_array_length(RolesName -> 'roles'), 'first_role', RolesName -> 'roles' -> 0) AS actor_summary
FROM
actors
LIMIT 10;ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅:
jsonb_build_object()- ΡΠΎΠ·Π΄Π°Π΅Ρ Π½ΠΎΠ²ΡΠΉ JSONB-ΠΎΠ±ΡΠ΅ΠΊΡ ΠΈΠ· ΠΏΠ°Ρ ΠΊΠ»ΡΡ-Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅.||- ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ ΠΊΠΎΠ½ΠΊΠ°ΡΠ΅Π½Π°ΡΠΈΠΈ ΡΡΡΠΎΠΊ Π² PostgreSQL.- Π€ΠΎΡΠΌΠΈΡΡΠ΅Ρ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π°ΠΊΡΠ΅ΡΠ° Π½ΠΎΠ²ΡΠΉ JSON-ΠΎΠ±ΡΠ΅ΠΊΡ Ρ ΡΡΠ΅ΠΌΡ ΠΏΠΎΠ»ΡΠΌΠΈ:
name: ΠΏΠΎΠ»Π½ΠΎΠ΅ ΠΈΠΌΡ Π°ΠΊΡΠ΅ΡΠ° (ΠΊΠΎΠ½ΠΊΠ°ΡΠ΅Π½Π°ΡΠΈΡ ΠΈΠΌΠ΅Π½ΠΈ ΠΈ ΡΠ°ΠΌΠΈΠ»ΠΈΠΈ);roles_count: ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠΎΠ»Π΅ΠΉ (ΡΠ΅ΡΠ΅Π· ΡΡΠ½ΠΊΡΠΈΡjsonb_array_length);first_role: ΠΏΠΎΠ»Π½Π°Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΠΏΠ΅ΡΠ²ΠΎΠΉ ΡΠΎΠ»ΠΈ ΠΊΠ°ΠΊ Π²Π»ΠΎΠΆΠ΅Π½Π½ΡΠΉ JSON-ΠΎΠ±ΡΠ΅ΠΊΡ.
ΠΠ°ΠΏΡΠΎΡ 9: Π Π°Π·Π²Π΅ΡΡΡΠ²Π°Π½ΠΈΠ΅ ΠΌΠ°ΡΡΠΈΠ²Π° ΡΠΎΠ»Π΅ΠΉ Π² ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠ΅ ΡΡΡΠΎΠΊΠΈ
SELECT
ActorFirstName,
ActorSecondName,
jsonb_array_elements(RolesName -> 'roles') ->> 'title' AS role_title
FROM
actors
LIMIT 20;ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅:
jsonb_array_elements()- ΡΡΠ½ΠΊΡΠΈΡ Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΡΠΌ Π½Π°Π±ΠΎΡΠΎΠΌ (set-returning function).- ΠΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ΅Ρ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΠΌΠ°ΡΡΠΈΠ²Π°
rolesΠ² ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ ΡΡΡΠΎΠΊΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ°. - ΠΠ»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π°ΠΊΡΠ΅ΡΠ° Π±ΡΠ΄Π΅Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ΅Π½ΠΎ ΡΡΠΎΠ»ΡΠΊΠΎ ΡΡΡΠΎΠΊ, ΡΠΊΠΎΠ»ΡΠΊΠΎ Ρ Π½Π΅Π³ΠΎ ΡΠΎΠ»Π΅ΠΉ.
->>'title'- ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΡΠΎΠ»ΠΈ Π² ΡΠ΅ΠΊΡΡΠΎΠ²ΠΎΠΌ ΡΠΎΡΠΌΠ°ΡΠ΅.- ΠΠ΅Π½Π΅ΡΠΈΡΡΠ΅Ρ "ΠΏΠ»ΠΎΡΠΊΠΈΠΉ" ΡΠΏΠΈΡΠΎΠΊ ΡΠΎΠ»Π΅ΠΉ Π²ΠΌΠ΅ΡΡΠΎ Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠΉ ΡΡΡΡΠΊΡΡΡΡ.
ΠΠΈΠΆΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Ρ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π²ΡΠ΅Ρ Π²ΡΡΠ΅ΡΠΏΠΎΠΌΡΠ½ΡΡΡΡ Π·Π°ΠΏΡΠΎΡΠΎΠ² Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ API PostgreSQL Π΄Π»Ρ JSONB:
actorfirstname | actorsecondname
----------------+--------------------------
Harry | 'The Carpenter' Mansoori
Peter | Aanensen
Frank | Aaron
Allan | Aarons
Asa | Aarons
Poul | Aars
Tony | Abatemarco
Serge | Abattucci
Marc | Abbink
David | Abbott
(10 rows)
actorfirstname | actorsecondname | ?column?
----------------+-----------------+-----------------------------------------------
Guilford | Adams | Boys Don't Cry
JosΓ© | 'El FrancΓ©s' | Alma gitana
Sander | 't Sas | De wereld draait door
| .38 Special | 38 Special: Live at Sturgis
Angry | Anderson | At Last... Bullamakanka: The Motion Picture
Todd | 1 | A Tribe Called Quest: The Video Anthology
Roberto | Arce | Diez aΓ±os juntos. Gala del dΓ©cimo aniversario
| 3 Doors Down | 2004 Radio Music Awards
| 3 Steps Ahead | Thunderdome: A Decade
Articolo | 31 | L'erba proibita
(10 rows)
count
--------
535981
(1 row)
actorfirstname | actorsecondname | first_role_title | first_role_year
-----------------+-----------------+----------------------------------------------+-----------------
Kyle | Aames | A Rim with a View 2 | 2006
Willie | Aames | 20 Greatest Celebreality Moments | 2006
| Aamir (IV) | Madhosh | 1974
| Aamir (V) | Heroine No.1 | 2001
Mian | Aamir | The Girl Without a Song | 0000
Sadiq | Aamir | Zinda Bhaag | 2013
Anders | Aamodt | The Recording | 2013
Anders Kristian | Aamodt | From Another Place | 2016
Kitty | Aamodt | Alcohol By Volume | 2012
Kjetil AndrΓ© | Aamodt | Bud Greenspan Presents: Torino 2006 Olympics | 2007
Kristian | Aamodt | Kristine Valdresdatter | 1930
Michael G. | Aamodt | Biography | 1987
Thor Michael | Aamodt | ...av hensyn til rikets sikkerhet | 1989
Tommy | Aamodt | Mengaloth | 2005
| Aamon | Geared Up 3 | 2013
(15 rows)
actorfirstname | actorsecondname | roles_count
----------------+-----------------+-------------
Johnny | Gilbert | 7772
Alex | Trebek | 7737
Bob | Barker | 6950
Pat | Sajak | 6668
David | Letterman | 6474
Paul | Shaffer | 6180
Johnny | Olson | 6116
Jay | Leno | 5640
Ed | McMahon | 5108
Frank | Welker | 5046
(10 rows)
actorfirstname | actorsecondname
----------------+-----------------
Willie | Aames
Asger | Aamund
| Aari
Kate | Aarness
Daniel | Aarnio
Marcus Mathias | Aarnseth
Tony | Aaron II
Ben | Aaron
Just | Aaron
Matthew | Aaron
(10 rows)
actorfirstname | actorsecondname | doctor_roles
----------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------
| Aanoosh | [{"year": "1972", "title": "Shahr-e aftab", "credit": "3", "character name": "Doctor"}]
Joe | Aaron | [{"year": "2017", "title": "See Pap Love", "credit": "4", "character name": "Doctor"}]
Josh | Aaron | [{"year": "0000", "title": "Apnea", "character name": "Doctor Wayne"}]
Lance | Aaron | [{"year": "2013", "title": "The Burden", "character name": "Doctor"}]
Jerome | Aarts | [{"year": "2008", "title": "John Adams", "credit": "11", "episode": "1.3", "series name": "Don't Tread on Me", "character name": "Dutch Doctor"}]
(5 rows)
actorfirstname | actorsecondname | actor_summary
----------------+-----------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Rupert | Aarons | {"name": "Rupert Aarons", "first_role": {"year": "1980", "title": "Mystery!", "series name": "David Suchet on the Orient Express", "character name": "Himself"}, "roles_count": 1}
Shawn | Aarons | {"name": "Shawn Aarons", "first_role": {"year": "2008", "title": "Never Back Down", "type1": "uncredited", "character name": "Wide Receiver"}, "roles_count": 1}
Todd | Aarons | {"name": "Todd Aarons", "first_role": {"year": "2010", "title": "Phoebe", "credit": "3", "character name": "Phone Tech #2"}, "roles_count": 1}
Doron | Aaronsohn | {"name": "Doron Aaronsohn", "first_role": {"year": "2009", "title": "1:0", "character name": "Soldier#1"}, "roles_count": 1}
Alan | Aaronson | {"name": "Alan Aaronson", "first_role": {"year": "1958", "title": "The Party Crashers", "type1": "uncredited", "character name": "Ted Nickerson"}, "roles_count": 7}
Bob | Aaronson | {"name": "Bob Aaronson", "first_role": {"year": "1990", "title": "Metamorphosis: The Alien Factor", "type1": "voice", "credit": "13", "character name": "Additional voices"}, "roles_count": 1}
Brandon | Aaronson | {"name": "Brandon Aaronson", "first_role": {"year": "2014", "title": "Unstoppable Love", "credit": "6", "character name": "Band"}, "roles_count": 1}
Craig | Aaronson | {"name": "Craig Aaronson", "first_role": {"year": "2007", "title": "Punk's Not Dead", "credit": "1", "character name": "Himself - Warner Brothers Records"}, "roles_count": 1}
David | Aaronson | {"name": "David Aaronson", "first_role": {"year": "2001", "title": "The Fear", "credit": "2", "character name": "Tom Robinson"}, "roles_count": 1}
Irving | Aaronson | {"name": "Irving Aaronson", "first_role": {"year": "1929", "title": "Aaronson's Commanders", "character name": "Himself"}, "roles_count": 2}
(10 rows)
actorfirstname | actorsecondname | role_title
----------------+-----------------+------------------------------------
Rupert | Aarons | Mystery!
Shawn | Aarons | Never Back Down
Todd | Aarons | Phoebe
Doron | Aaronsohn | 1:0
Alan | Aaronson | The Party Crashers
Alan | Aaronson | The Pied Piper of Hamelin
Alan | Aaronson | Underworld U.S.A.
Alan | Aaronson | The Donna Reed Show
Alan | Aaronson | The Donna Reed Show
Alan | Aaronson | The O. Henry Playhouse
Alan | Aaronson | Westinghouse Desilu Playhouse
Bob | Aaronson | Metamorphosis: The Alien Factor
Brandon | Aaronson | Unstoppable Love
Craig | Aaronson | Punk's Not Dead
David | Aaronson | The Fear
Irving | Aaronson | Aaronson's Commanders
Irving | Aaronson | Irving Aaronson and His Commanders
Jack | Aaronson | The Big Gay Musical
James | Aaronson | Of Plants & Plans
James | Aaronson | The Making of a Superhero Musical
(20 rows)
Π Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ ./2-timings ΡΠ°ΡΠΏΠΎΠ»Π°Π³Π°ΡΡΡΡ Π΄Π²Π° ΡΠΊΡΠΈΠΏΡΠ°: 1-timings.sql ΠΈ 2-timings.py.
ΠΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Π½ΡΠ΅ ΡΠΊΡΠΈΠΏΡΡ ΡΠ΅Π°Π»ΠΈΠ·ΡΡΡ ΠΊΠΎΠΌΠΏΠ»Π΅ΠΊΡΠ½ΠΎΠ΅ ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠ΅ Π²Π»ΠΈΡΠ½ΠΈΡ ΡΠ°Π·ΠΌΠ΅ΡΠ° JSONB-ΠΏΠΎΠ»Π΅ΠΉ Π½Π° ΡΠΊΠΎΡΠΎΡΡΡ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ Π½ΠΈΠΌ Π² PostgreSQL, ΡΠΎΠΊΡΡΠΈΡΡΡΡΡ Π½Π° Π²Π°ΠΆΠ½ΠΎΠΉ Π³ΡΠ°Π½ΠΈΡΠ½ΠΎΠΉ ΡΠΎΡΠΊΠ΅ Π² 2KB (ΠΏΠΎΡΠΎΠ³ TOAST ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠ°).
psql -U postgres -d imdb -f ./2-timings/1-timings.sql | catCREATE TEMP TABLE jsonb_access_sample AS
WITH small_docs AS (
-- ΠΡΠ±ΠΎΡΠΊΠ° Π°ΠΊΡΠ΅ΡΠΎΠ² Ρ ΠΌΠ°Π»Π΅Π½ΡΠΊΠΈΠΌ JSONB (ΠΌΠ΅Π½ΡΡΠ΅ 2kB)
SELECT
id,
RolesName,
pg_column_size(RolesName) AS jsonb_size
FROM
actors
WHERE
pg_column_size(RolesName) < 2048
LIMIT 50
),
large_docs AS (
-- ... ΠΊΠΎΠ΄ ...- Π‘ΠΎΠ·Π΄Π°ΡΡΡΡ Π²ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ ΡΠ°Π±Π»ΠΈΡΠ° Ρ ΡΠ΅ΠΏΡΠ΅Π·Π΅Π½ΡΠ°ΡΠΈΠ²Π½ΠΎΠΉ Π²ΡΠ±ΠΎΡΠΊΠΎΠΉ:
- 50 Π·Π°ΠΏΠΈΡΠ΅ΠΉ ΡΠ°Π·ΠΌΠ΅ΡΠΎΠΌ ΠΌΠ΅Π½ΡΡΠ΅ 2KB (Ρ ΡΠ°Π½ΡΡΡΡ inline);
- 50 Π·Π°ΠΏΠΈΡΠ΅ΠΉ ΡΠ°Π·ΠΌΠ΅ΡΠΎΠΌ Π±ΠΎΠ»ΡΡΠ΅ 2KB (ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ TOAST).
- Π€ΡΠ½ΠΊΡΠΈΡ
pg_column_size()ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ ΡΠ΅Π°Π»ΡΠ½ΡΠΉ ΡΠ°Π·ΠΌΠ΅Ρ Π΄Π°Π½Π½ΡΡ JSONB Π² Π±Π°ΠΉΡΠ°Ρ . - ΠΠ°ΠΆΠ΄ΠΎΠΉ Π·Π°ΠΏΠΈΡΠΈ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π΅ΡΡΡ ΠΌΠ΅ΡΠΊΠ°
'inline'ΠΈΠ»ΠΈ'toasted'.
Π‘ΠΎΠ·Π΄Π°ΡΡΡΡ ΡΠ°Π±Π»ΠΈΡΠ° jsonb_access_metrics Π΄Π»Ρ Ρ
ΡΠ°Π½Π΅Π½ΠΈΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠ² ΠΈΠ·ΠΌΠ΅ΡΠ΅Π½ΠΈΠΉ:
id- ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ Π·Π°ΠΏΠΈΡΠΈ.jsonb_size- ΡΠ°Π·ΠΌΠ΅Ρ JSONB Π² Π±Π°ΠΉΡΠ°Ρ .storage_type- ΡΠΈΠΏ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ (inline/toasted).roles_count- ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠΎΠ»Π΅ΠΉ Π² ΠΌΠ°ΡΡΠΈΠ²Π΅.access_time_ns- ΠΈΠ·ΠΌΠ΅ΡΠ΅Π½Π½ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ Π΄ΠΎΡΡΡΠΏΠ° Π² Π½Π°Π½ΠΎΡΠ΅ΠΊΡΠ½Π΄Π°Ρ .
CREATE OR REPLACE FUNCTION measure_jsonb_access(p_id int, p_iterations int DEFAULT 10)
RETURNS float
AS $$- Π‘ΠΎΠ·Π΄Π°ΡΡ PL/pgSQL ΡΡΠ½ΠΊΡΠΈΡ Π΄Π»Ρ Π²ΡΡΠΎΠΊΠΎΡΠΎΡΠ½ΡΡ ΠΈΠ·ΠΌΠ΅ΡΠ΅Π½ΠΈΠΉ.
- ΠΡΠΏΠΎΠ»Π½ΡΠ΅Ρ Π·Π°Π΄Π°Π½Π½ΡΠΉ Π·Π°ΠΏΡΠΎΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°Π· (ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ 10 ΠΈΡΠ΅ΡΠ°ΡΠΈΠΉ) Π΄Π»Ρ ΡΡΡΠ΅Π΄Π½Π΅Π½ΠΈΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠ².
- ΠΠ·ΠΌΠ΅ΡΡΠ΅Ρ ΠΈΠΌΠ΅Π½Π½ΠΎ Π²ΡΠ΅ΠΌΡ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ ΠΏΠΎΠ»Ρ
yearΠΈΠ· ΠΏΠ΅ΡΠ²ΠΎΠΉ ΡΠΎΠ»ΠΈ Π°ΠΊΡΡΡΠ°:RolesName->'roles'->0->>'year'. - ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ
clock_timestamp()Π΄Π»Ρ ΠΌΠΈΠΊΡΠΎΡΠ΅ΠΊΡΠ½Π΄Π½ΠΎΠΉ ΡΠΎΡΠ½ΠΎΡΡΠΈ ΠΈΠ·ΠΌΠ΅ΡΠ΅Π½ΠΈΠΉ. - ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΡΠ΅Π΄Π½Π΅Π΅ Π²ΡΠ΅ΠΌΡ Π΄ΠΎΡΡΡΠΏΠ° Π² Π½Π°Π½ΠΎΡΠ΅ΠΊΡΠ½Π΄Π°Ρ .
DO $$
DECLARE
rec RECORD;
access_time float;
roles_count int;
BEGIN
-- ΠΠ·ΠΌΠ΅ΡΠ΅Π½ΠΈΡ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π·Π°ΠΏΠΈΡΠΈ
FOR rec IN
SELECT
id,
jsonb_size,
storage_type
FROM
jsonb_access_sample
ORDER BY
jsonb_size LOOP
-- ΠΠ·ΠΌΠ΅ΡΡΠ΅ΠΌ Π²ΡΠ΅ΠΌΡ Π΄ΠΎΡΡΡΠΏΠ°
access_time := measure_jsonb_access(rec.id, 10);
-- ... ΠΊΠΎΠ΄ ...- Π‘ ΠΏΠΎΠΌΠΎΡΡΡ Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ° Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΡΠΈΠΊΠ» ΠΏΠΎ Π²ΡΠ΅ΠΌ ΡΠ΅ΡΡΠΎΠ²ΡΠΌ Π·Π°ΠΏΠΈΡΡΠΌ.
- ΠΠ»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π·Π°ΠΏΠΈΡΠΈ:
- ΠΠ·ΠΌΠ΅ΡΡΠ΅ΡΡΡ Π²ΡΠ΅ΠΌΡ Π΄ΠΎΡΡΡΠΏΠ° Ρ 10 ΠΈΡΠ΅ΡΠ°ΡΠΈΡΠΌΠΈ Π΄Π»Ρ ΡΠΌΠ΅Π½ΡΡΠ΅Π½ΠΈΡ ΡΠ»ΡΡΠ°ΠΉΠ½ΡΡ ΠΊΠΎΠ»Π΅Π±Π°Π½ΠΈΠΉ;
- ΠΠΎΠ΄ΡΡΠΈΡΡΠ²Π°Π΅ΡΡΡ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠΎΠ»Π΅ΠΉ Π°ΠΊΡΡΡΠ°;
- Π Π΅Π·ΡΠ»ΡΡΠ°ΡΡ ΡΠΎΡ ΡΠ°Π½ΡΡΡΡΡ Π² ΡΠ°Π±Π»ΠΈΡΡ ΠΌΠ΅ΡΡΠΈΠΊ;
- ΠΡΠ²ΠΎΠ΄ΠΈΡΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΎΠ½Π½ΠΎΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΠΏΡΠΎΠ³ΡΠ΅ΡΡΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΡ
RAISE NOTICE.
-
ΠΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π°Π³ΡΠ΅Π³ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ Π·Π°ΠΏΡΠΎΡ, Π³ΡΡΠΏΠΏΠΈΡΡΡΡΠΈΠΉ Π΄Π°Π½Π½ΡΠ΅ ΠΏΠΎ ΡΠΈΠΏΡ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ:
SELECT storage_type, COUNT(*) AS samples, ROUND(AVG(jsonb_size)) AS avg_size_bytes, -- ... ΠΊΠΎΠ΄ ...
-
Π Π΅Π·ΡΠ»ΡΡΠ°ΡΡ Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΡΡΡ Π² CSV-ΡΠ°ΠΉΠ» ΡΠ΅ΡΠ΅Π· ΠΊΠΎΠΌΠ°Π½Π΄Ρ
COPY:COPY ( SELECT id, jsonb_size, storage_type, roles_count, access_time_ns FROM jsonb_access_metrics ORDER BY jsonb_size) TO '/tmp/jsonb_access_data.csv' WITH CSV HEADER;
psql:2-timings/1-timings.sql:2: NOTICE: table "jsonb_access_sample" does not exist, skipping
DROP TABLE
SELECT 100
total_samples | inline_samples | toasted_samples
---------------+----------------+-----------------
100 | 50 | 50
(1 row)
psql:2-timings/1-timings.sql:35: NOTICE: table "jsonb_access_metrics" does not exist, skipping
DROP TABLE
CREATE TABLE
CREATE FUNCTION
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=7579, ΡΠ°Π·ΠΌΠ΅Ρ=75, ΡΠΈΠΏ=inline, ΡΠΎΠ»ΠΈ=1, Π²ΡΠ΅ΠΌΡ=39700.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=1651, ΡΠ°Π·ΠΌΠ΅Ρ=75, ΡΠΈΠΏ=inline, ΡΠΎΠ»ΠΈ=1, Π²ΡΠ΅ΠΌΡ=4600.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=1642, ΡΠ°Π·ΠΌΠ΅Ρ=76, ΡΠΈΠΏ=inline, ΡΠΎΠ»ΠΈ=1, Π²ΡΠ΅ΠΌΡ=3600.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=1640, ΡΠ°Π·ΠΌΠ΅Ρ=90, ΡΠΈΠΏ=inline, ΡΠΎΠ»ΠΈ=1, Π²ΡΠ΅ΠΌΡ=3600.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=1612, ΡΠ°Π·ΠΌΠ΅Ρ=96, ΡΠΈΠΏ=inline, ΡΠΎΠ»ΠΈ=1, Π²ΡΠ΅ΠΌΡ=3600.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=1647, ΡΠ°Π·ΠΌΠ΅Ρ=102, ΡΠΈΠΏ=inline, ΡΠΎΠ»ΠΈ=1, Π²ΡΠ΅ΠΌΡ=3500.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=1632, ΡΠ°Π·ΠΌΠ΅Ρ=107, ΡΠΈΠΏ=inline, ΡΠΎΠ»ΠΈ=1, Π²ΡΠ΅ΠΌΡ=3800.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=1653, ΡΠ°Π·ΠΌΠ΅Ρ=108, ΡΠΈΠΏ=inline, ΡΠΎΠ»ΠΈ=1, Π²ΡΠ΅ΠΌΡ=3800.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=1619, ΡΠ°Π·ΠΌΠ΅Ρ=110, ΡΠΈΠΏ=inline, ΡΠΎΠ»ΠΈ=1, Π²ΡΠ΅ΠΌΡ=3700.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=1660, ΡΠ°Π·ΠΌΠ΅Ρ=110, ΡΠΈΠΏ=inline, ΡΠΎΠ»ΠΈ=1, Π²ΡΠ΅ΠΌΡ=3600.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=1630, ΡΠ°Π·ΠΌΠ΅Ρ=113, ΡΠΈΠΏ=inline, ΡΠΎΠ»ΠΈ=1, Π²ΡΠ΅ΠΌΡ=3700.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=1635, ΡΠ°Π·ΠΌΠ΅Ρ=115, ΡΠΈΠΏ=inline, ΡΠΎΠ»ΠΈ=1, Π²ΡΠ΅ΠΌΡ=3800.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=1641, ΡΠ°Π·ΠΌΠ΅Ρ=116, ΡΠΈΠΏ=inline, ΡΠΎΠ»ΠΈ=1, Π²ΡΠ΅ΠΌΡ=3900.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=1611, ΡΠ°Π·ΠΌΠ΅Ρ=118, ΡΠΈΠΏ=inline, ΡΠΎΠ»ΠΈ=1, Π²ΡΠ΅ΠΌΡ=3800.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=1617, ΡΠ°Π·ΠΌΠ΅Ρ=119, ΡΠΈΠΏ=inline, ΡΠΎΠ»ΠΈ=1, Π²ΡΠ΅ΠΌΡ=4000.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=1615, ΡΠ°Π·ΠΌΠ΅Ρ=119, ΡΠΈΠΏ=inline, ΡΠΎΠ»ΠΈ=1, Π²ΡΠ΅ΠΌΡ=3900.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=1648, ΡΠ°Π·ΠΌΠ΅Ρ=119, ΡΠΈΠΏ=inline, ΡΠΎΠ»ΠΈ=1, Π²ΡΠ΅ΠΌΡ=3600.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=1639, ΡΠ°Π·ΠΌΠ΅Ρ=123, ΡΠΈΠΏ=inline, ΡΠΎΠ»ΠΈ=1, Π²ΡΠ΅ΠΌΡ=4100.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=1621, ΡΠ°Π·ΠΌΠ΅Ρ=125, ΡΠΈΠΏ=inline, ΡΠΎΠ»ΠΈ=1, Π²ΡΠ΅ΠΌΡ=4400.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=1654, ΡΠ°Π·ΠΌΠ΅Ρ=125, ΡΠΈΠΏ=inline, ΡΠΎΠ»ΠΈ=1, Π²ΡΠ΅ΠΌΡ=4300.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=1628, ΡΠ°Π·ΠΌΠ΅Ρ=125, ΡΠΈΠΏ=inline, ΡΠΎΠ»ΠΈ=1, Π²ΡΠ΅ΠΌΡ=4300.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=1633, ΡΠ°Π·ΠΌΠ΅Ρ=126, ΡΠΈΠΏ=inline, ΡΠΎΠ»ΠΈ=1, Π²ΡΠ΅ΠΌΡ=4200.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=1652, ΡΠ°Π·ΠΌΠ΅Ρ=127, ΡΠΈΠΏ=inline, ΡΠΎΠ»ΠΈ=1, Π²ΡΠ΅ΠΌΡ=4500.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=1627, ΡΠ°Π·ΠΌΠ΅Ρ=131, ΡΠΈΠΏ=inline, ΡΠΎΠ»ΠΈ=1, Π²ΡΠ΅ΠΌΡ=4500.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=1622, ΡΠ°Π·ΠΌΠ΅Ρ=131, ΡΠΈΠΏ=inline, ΡΠΎΠ»ΠΈ=1, Π²ΡΠ΅ΠΌΡ=5200.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=1655, ΡΠ°Π·ΠΌΠ΅Ρ=132, ΡΠΈΠΏ=inline, ΡΠΎΠ»ΠΈ=1, Π²ΡΠ΅ΠΌΡ=4400.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=1650, ΡΠ°Π·ΠΌΠ΅Ρ=133, ΡΠΈΠΏ=inline, ΡΠΎΠ»ΠΈ=1, Π²ΡΠ΅ΠΌΡ=5100.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=1623, ΡΠ°Π·ΠΌΠ΅Ρ=134, ΡΠΈΠΏ=inline, ΡΠΎΠ»ΠΈ=1, Π²ΡΠ΅ΠΌΡ=5100.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=1610, ΡΠ°Π·ΠΌΠ΅Ρ=138, ΡΠΈΠΏ=inline, ΡΠΎΠ»ΠΈ=1, Π²ΡΠ΅ΠΌΡ=4500.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=1616, ΡΠ°Π·ΠΌΠ΅Ρ=150, ΡΠΈΠΏ=inline, ΡΠΎΠ»ΠΈ=1, Π²ΡΠ΅ΠΌΡ=6200.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=1609, ΡΠ°Π·ΠΌΠ΅Ρ=155, ΡΠΈΠΏ=inline, ΡΠΎΠ»ΠΈ=1, Π²ΡΠ΅ΠΌΡ=7700.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=1625, ΡΠ°Π·ΠΌΠ΅Ρ=155, ΡΠΈΠΏ=inline, ΡΠΎΠ»ΠΈ=1, Π²ΡΠ΅ΠΌΡ=7600.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=1643, ΡΠ°Π·ΠΌΠ΅Ρ=163, ΡΠΈΠΏ=inline, ΡΠΎΠ»ΠΈ=1, Π²ΡΠ΅ΠΌΡ=7900.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=1614, ΡΠ°Π·ΠΌΠ΅Ρ=169, ΡΠΈΠΏ=inline, ΡΠΎΠ»ΠΈ=1, Π²ΡΠ΅ΠΌΡ=7400.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=1634, ΡΠ°Π·ΠΌΠ΅Ρ=173, ΡΠΈΠΏ=inline, ΡΠΎΠ»ΠΈ=2, Π²ΡΠ΅ΠΌΡ=7900.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=1624, ΡΠ°Π·ΠΌΠ΅Ρ=175, ΡΠΈΠΏ=inline, ΡΠΎΠ»ΠΈ=2, Π²ΡΠ΅ΠΌΡ=7900.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=1646, ΡΠ°Π·ΠΌΠ΅Ρ=182, ΡΠΈΠΏ=inline, ΡΠΎΠ»ΠΈ=2, Π²ΡΠ΅ΠΌΡ=8400.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=1649, ΡΠ°Π·ΠΌΠ΅Ρ=202, ΡΠΈΠΏ=inline, ΡΠΎΠ»ΠΈ=2, Π²ΡΠ΅ΠΌΡ=4900.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=1631, ΡΠ°Π·ΠΌΠ΅Ρ=203, ΡΠΈΠΏ=inline, ΡΠΎΠ»ΠΈ=2, Π²ΡΠ΅ΠΌΡ=5100.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=1656, ΡΠ°Π·ΠΌΠ΅Ρ=205, ΡΠΈΠΏ=inline, ΡΠΎΠ»ΠΈ=1, Π²ΡΠ΅ΠΌΡ=6500.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=1620, ΡΠ°Π·ΠΌΠ΅Ρ=205, ΡΠΈΠΏ=inline, ΡΠΎΠ»ΠΈ=2, Π²ΡΠ΅ΠΌΡ=5300.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=1618, ΡΠ°Π·ΠΌΠ΅Ρ=231, ΡΠΈΠΏ=inline, ΡΠΎΠ»ΠΈ=2, Π²ΡΠ΅ΠΌΡ=5300.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=1636, ΡΠ°Π·ΠΌΠ΅Ρ=326, ΡΠΈΠΏ=inline, ΡΠΎΠ»ΠΈ=3, Π²ΡΠ΅ΠΌΡ=5400.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=1645, ΡΠ°Π·ΠΌΠ΅Ρ=381, ΡΠΈΠΏ=inline, ΡΠΎΠ»ΠΈ=3, Π²ΡΠ΅ΠΌΡ=6100.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=1629, ΡΠ°Π·ΠΌΠ΅Ρ=681, ΡΠΈΠΏ=inline, ΡΠΎΠ»ΠΈ=7, Π²ΡΠ΅ΠΌΡ=6200.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=1613, ΡΠ°Π·ΠΌΠ΅Ρ=892, ΡΠΈΠΏ=inline, ΡΠΎΠ»ΠΈ=7, Π²ΡΠ΅ΠΌΡ=6000.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=1637, ΡΠ°Π·ΠΌΠ΅Ρ=894, ΡΠΈΠΏ=inline, ΡΠΎΠ»ΠΈ=8, Π²ΡΠ΅ΠΌΡ=5900.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=1644, ΡΠ°Π·ΠΌΠ΅Ρ=933, ΡΠΈΠΏ=inline, ΡΠΎΠ»ΠΈ=7, Π²ΡΠ΅ΠΌΡ=5900.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=1638, ΡΠ°Π·ΠΌΠ΅Ρ=1077, ΡΠΈΠΏ=inline, ΡΠΎΠ»ΠΈ=19, Π²ΡΠ΅ΠΌΡ=7700.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=1626, ΡΠ°Π·ΠΌΠ΅Ρ=1489, ΡΠΈΠΏ=inline, ΡΠΎΠ»ΠΈ=12, Π²ΡΠ΅ΠΌΡ=6100.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=2395, ΡΠ°Π·ΠΌΠ΅Ρ=2116, ΡΠΈΠΏ=toasted, ΡΠΎΠ»ΠΈ=53, Π²ΡΠ΅ΠΌΡ=22500.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=2362, ΡΠ°Π·ΠΌΠ΅Ρ=2132, ΡΠΈΠΏ=toasted, ΡΠΎΠ»ΠΈ=39, Π²ΡΠ΅ΠΌΡ=17100.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=2632, ΡΠ°Π·ΠΌΠ΅Ρ=2139, ΡΠΈΠΏ=toasted, ΡΠΎΠ»ΠΈ=41, Π²ΡΠ΅ΠΌΡ=11700.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=4567, ΡΠ°Π·ΠΌΠ΅Ρ=2222, ΡΠΈΠΏ=toasted, ΡΠΎΠ»ΠΈ=61, Π²ΡΠ΅ΠΌΡ=15300.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=3200, ΡΠ°Π·ΠΌΠ΅Ρ=2246, ΡΠΈΠΏ=toasted, ΡΠΎΠ»ΠΈ=55, Π²ΡΠ΅ΠΌΡ=20500.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=2232, ΡΠ°Π·ΠΌΠ΅Ρ=2249, ΡΠΈΠΏ=toasted, ΡΠΎΠ»ΠΈ=77, Π²ΡΠ΅ΠΌΡ=11900.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=3221, ΡΠ°Π·ΠΌΠ΅Ρ=2264, ΡΠΈΠΏ=toasted, ΡΠΎΠ»ΠΈ=38, Π²ΡΠ΅ΠΌΡ=17200.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=3680, ΡΠ°Π·ΠΌΠ΅Ρ=2270, ΡΠΈΠΏ=toasted, ΡΠΎΠ»ΠΈ=55, Π²ΡΠ΅ΠΌΡ=18900.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=4064, ΡΠ°Π·ΠΌΠ΅Ρ=2279, ΡΠΈΠΏ=toasted, ΡΠΎΠ»ΠΈ=70, Π²ΡΠ΅ΠΌΡ=21500.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=4627, ΡΠ°Π·ΠΌΠ΅Ρ=2320, ΡΠΈΠΏ=toasted, ΡΠΎΠ»ΠΈ=39, Π²ΡΠ΅ΠΌΡ=13100.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=4928, ΡΠ°Π·ΠΌΠ΅Ρ=2339, ΡΠΈΠΏ=toasted, ΡΠΎΠ»ΠΈ=70, Π²ΡΠ΅ΠΌΡ=12900.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=3720, ΡΠ°Π·ΠΌΠ΅Ρ=2371, ΡΠΈΠΏ=toasted, ΡΠΎΠ»ΠΈ=62, Π²ΡΠ΅ΠΌΡ=14600.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=3509, ΡΠ°Π·ΠΌΠ΅Ρ=2410, ΡΠΈΠΏ=toasted, ΡΠΎΠ»ΠΈ=400, Π²ΡΠ΅ΠΌΡ=18300.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=4441, ΡΠ°Π·ΠΌΠ΅Ρ=2413, ΡΠΈΠΏ=toasted, ΡΠΎΠ»ΠΈ=45, Π²ΡΠ΅ΠΌΡ=14800.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=1865, ΡΠ°Π·ΠΌΠ΅Ρ=2456, ΡΠΈΠΏ=toasted, ΡΠΎΠ»ΠΈ=95, Π²ΡΠ΅ΠΌΡ=19500.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=2005, ΡΠ°Π·ΠΌΠ΅Ρ=2673, ΡΠΈΠΏ=toasted, ΡΠΎΠ»ΠΈ=265, Π²ΡΠ΅ΠΌΡ=20400.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=2941, ΡΠ°Π·ΠΌΠ΅Ρ=2802, ΡΠΈΠΏ=toasted, ΡΠΎΠ»ΠΈ=71, Π²ΡΠ΅ΠΌΡ=13400.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=2043, ΡΠ°Π·ΠΌΠ΅Ρ=2805, ΡΠΈΠΏ=toasted, ΡΠΎΠ»ΠΈ=67, Π²ΡΠ΅ΠΌΡ=13500.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=3414, ΡΠ°Π·ΠΌΠ΅Ρ=2871, ΡΠΈΠΏ=toasted, ΡΠΎΠ»ΠΈ=224, Π²ΡΠ΅ΠΌΡ=23500.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=2572, ΡΠ°Π·ΠΌΠ΅Ρ=2951, ΡΠΈΠΏ=toasted, ΡΠΎΠ»ΠΈ=102, Π²ΡΠ΅ΠΌΡ=20200.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=2488, ΡΠ°Π·ΠΌΠ΅Ρ=2988, ΡΠΈΠΏ=toasted, ΡΠΎΠ»ΠΈ=57, Π²ΡΠ΅ΠΌΡ=25400.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=4662, ΡΠ°Π·ΠΌΠ΅Ρ=2994, ΡΠΈΠΏ=toasted, ΡΠΎΠ»ΠΈ=65, Π²ΡΠ΅ΠΌΡ=24300.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=3311, ΡΠ°Π·ΠΌΠ΅Ρ=3015, ΡΠΈΠΏ=toasted, ΡΠΎΠ»ΠΈ=60, Π²ΡΠ΅ΠΌΡ=22100.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=3178, ΡΠ°Π·ΠΌΠ΅Ρ=3091, ΡΠΈΠΏ=toasted, ΡΠΎΠ»ΠΈ=72, Π²ΡΠ΅ΠΌΡ=27600.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=1729, ΡΠ°Π·ΠΌΠ΅Ρ=3171, ΡΠΈΠΏ=toasted, ΡΠΎΠ»ΠΈ=73, Π²ΡΠ΅ΠΌΡ=58800.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=4775, ΡΠ°Π·ΠΌΠ΅Ρ=3426, ΡΠΈΠΏ=toasted, ΡΠΎΠ»ΠΈ=85, Π²ΡΠ΅ΠΌΡ=85600.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=4611, ΡΠ°Π·ΠΌΠ΅Ρ=3479, ΡΠΈΠΏ=toasted, ΡΠΎΠ»ΠΈ=76, Π²ΡΠ΅ΠΌΡ=25800.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=2698, ΡΠ°Π·ΠΌΠ΅Ρ=3559, ΡΠΈΠΏ=toasted, ΡΠΎΠ»ΠΈ=145, Π²ΡΠ΅ΠΌΡ=35000.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=3521, ΡΠ°Π·ΠΌΠ΅Ρ=3575, ΡΠΈΠΏ=toasted, ΡΠΎΠ»ΠΈ=101, Π²ΡΠ΅ΠΌΡ=26700.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=3009, ΡΠ°Π·ΠΌΠ΅Ρ=3659, ΡΠΈΠΏ=toasted, ΡΠΎΠ»ΠΈ=93, Π²ΡΠ΅ΠΌΡ=26900.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=2328, ΡΠ°Π·ΠΌΠ΅Ρ=3846, ΡΠΈΠΏ=toasted, ΡΠΎΠ»ΠΈ=266, Π²ΡΠ΅ΠΌΡ=29400.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=2610, ΡΠ°Π·ΠΌΠ΅Ρ=4259, ΡΠΈΠΏ=toasted, ΡΠΎΠ»ΠΈ=154, Π²ΡΠ΅ΠΌΡ=42600.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=2671, ΡΠ°Π·ΠΌΠ΅Ρ=4313, ΡΠΈΠΏ=toasted, ΡΠΎΠ»ΠΈ=102, Π²ΡΠ΅ΠΌΡ=30400.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=3252, ΡΠ°Π·ΠΌΠ΅Ρ=4344, ΡΠΈΠΏ=toasted, ΡΠΎΠ»ΠΈ=105, Π²ΡΠ΅ΠΌΡ=23800.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=3062, ΡΠ°Π·ΠΌΠ΅Ρ=4586, ΡΠΈΠΏ=toasted, ΡΠΎΠ»ΠΈ=96, Π²ΡΠ΅ΠΌΡ=24200.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=2336, ΡΠ°Π·ΠΌΠ΅Ρ=4674, ΡΠΈΠΏ=toasted, ΡΠΎΠ»ΠΈ=99, Π²ΡΠ΅ΠΌΡ=27000.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=4769, ΡΠ°Π·ΠΌΠ΅Ρ=4682, ΡΠΈΠΏ=toasted, ΡΠΎΠ»ΠΈ=127, Π²ΡΠ΅ΠΌΡ=24400.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=2447, ΡΠ°Π·ΠΌΠ΅Ρ=4970, ΡΠΈΠΏ=toasted, ΡΠΎΠ»ΠΈ=130, Π²ΡΠ΅ΠΌΡ=25800.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=2387, ΡΠ°Π·ΠΌΠ΅Ρ=6449, ΡΠΈΠΏ=toasted, ΡΠΎΠ»ΠΈ=602, Π²ΡΠ΅ΠΌΡ=67800.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=3181, ΡΠ°Π·ΠΌΠ΅Ρ=6974, ΡΠΈΠΏ=toasted, ΡΠΎΠ»ΠΈ=184, Π²ΡΠ΅ΠΌΡ=31100.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=4913, ΡΠ°Π·ΠΌΠ΅Ρ=7516, ΡΠΈΠΏ=toasted, ΡΠΎΠ»ΠΈ=286, Π²ΡΠ΅ΠΌΡ=29100.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=3124, ΡΠ°Π·ΠΌΠ΅Ρ=7934, ΡΠΈΠΏ=toasted, ΡΠΎΠ»ΠΈ=319, Π²ΡΠ΅ΠΌΡ=26400.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=3310, ΡΠ°Π·ΠΌΠ΅Ρ=9063, ΡΠΈΠΏ=toasted, ΡΠΎΠ»ΠΈ=184, Π²ΡΠ΅ΠΌΡ=42500.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=2545, ΡΠ°Π·ΠΌΠ΅Ρ=9240, ΡΠΈΠΏ=toasted, ΡΠΎΠ»ΠΈ=539, Π²ΡΠ΅ΠΌΡ=86400.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=4891, ΡΠ°Π·ΠΌΠ΅Ρ=9381, ΡΠΈΠΏ=toasted, ΡΠΎΠ»ΠΈ=210, Π²ΡΠ΅ΠΌΡ=51100.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=4404, ΡΠ°Π·ΠΌΠ΅Ρ=11201, ΡΠΈΠΏ=toasted, ΡΠΎΠ»ΠΈ=270, Π²ΡΠ΅ΠΌΡ=38300.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=3456, ΡΠ°Π·ΠΌΠ΅Ρ=11362, ΡΠΈΠΏ=toasted, ΡΠΎΠ»ΠΈ=922, Π²ΡΠ΅ΠΌΡ=125100.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=3396, ΡΠ°Π·ΠΌΠ΅Ρ=15441, ΡΠΈΠΏ=toasted, ΡΠΎΠ»ΠΈ=448, Π²ΡΠ΅ΠΌΡ=92600.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=2230, ΡΠ°Π·ΠΌΠ΅Ρ=21679, ΡΠΈΠΏ=toasted, ΡΠΎΠ»ΠΈ=504, Π²ΡΠ΅ΠΌΡ=159100.00 Π½Ρ
psql:2-timings/1-timings.sql:99: NOTICE: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ ID=3010, ΡΠ°Π·ΠΌΠ΅Ρ=29281, ΡΠΈΠΏ=toasted, ΡΠΎΠ»ΠΈ=928, Π²ΡΠ΅ΠΌΡ=197700.00 Π½Ρ
DO
storage_type | samples | avg_size_bytes | avg_roles | avg_time_ns | min_time_ns | max_time_ns
--------------+---------+----------------+-----------+-------------+-------------+-------------
inline | 50 | 247 | 2 | 5844 | 3500 | 39700
toasted | 50 | 5250 | 185 | 37476 | 11700 | 197700
(2 rows)
id | jsonb_size | storage_type | roles_count | access_time_ns
------+------------+--------------+-------------+----------------
7579 | 75 | inline | 1 | 39700
1651 | 75 | inline | 1 | 4600
1642 | 76 | inline | 1 | 3600
1640 | 90 | inline | 1 | 3600
1612 | 96 | inline | 1 | 3600
1647 | 102 | inline | 1 | 3500
1632 | 107 | inline | 1 | 3800
1653 | 108 | inline | 1 | 3800
1619 | 110 | inline | 1 | 3700
1660 | 110 | inline | 1 | 3600
1630 | 113 | inline | 1 | 3700
1635 | 115 | inline | 1 | 3800
1641 | 116 | inline | 1 | 3900
1611 | 118 | inline | 1 | 3800
1617 | 119 | inline | 1 | 4000
1615 | 119 | inline | 1 | 3900
1648 | 119 | inline | 1 | 3600
1639 | 123 | inline | 1 | 4100
1621 | 125 | inline | 1 | 4400
1654 | 125 | inline | 1 | 4300
1628 | 125 | inline | 1 | 4300
1633 | 126 | inline | 1 | 4200
1652 | 127 | inline | 1 | 4500
1627 | 131 | inline | 1 | 4500
1622 | 131 | inline | 1 | 5200
1655 | 132 | inline | 1 | 4400
1650 | 133 | inline | 1 | 5100
1623 | 134 | inline | 1 | 5100
1610 | 138 | inline | 1 | 4500
1616 | 150 | inline | 1 | 6200
1609 | 155 | inline | 1 | 7700
1625 | 155 | inline | 1 | 7600
1643 | 163 | inline | 1 | 7900
1614 | 169 | inline | 1 | 7400
1634 | 173 | inline | 2 | 7900
1624 | 175 | inline | 2 | 7900
1646 | 182 | inline | 2 | 8400
1649 | 202 | inline | 2 | 4900
1631 | 203 | inline | 2 | 5100
1656 | 205 | inline | 1 | 6500
1620 | 205 | inline | 2 | 5300
1618 | 231 | inline | 2 | 5300
1636 | 326 | inline | 3 | 5400
1645 | 381 | inline | 3 | 6100
1629 | 681 | inline | 7 | 6200
1613 | 892 | inline | 7 | 6000
1637 | 894 | inline | 8 | 5900
1644 | 933 | inline | 7 | 5900
1638 | 1077 | inline | 19 | 7700
1626 | 1489 | inline | 12 | 6100
2395 | 2116 | toasted | 53 | 22500
2362 | 2132 | toasted | 39 | 17100
2632 | 2139 | toasted | 41 | 11700
4567 | 2222 | toasted | 61 | 15300
3200 | 2246 | toasted | 55 | 20500
2232 | 2249 | toasted | 77 | 11900
3221 | 2264 | toasted | 38 | 17200
3680 | 2270 | toasted | 55 | 18900
4064 | 2279 | toasted | 70 | 21500
4627 | 2320 | toasted | 39 | 13100
4928 | 2339 | toasted | 70 | 12900
3720 | 2371 | toasted | 62 | 14600
3509 | 2410 | toasted | 400 | 18300
4441 | 2413 | toasted | 45 | 14800
1865 | 2456 | toasted | 95 | 19500
2005 | 2673 | toasted | 265 | 20400
2941 | 2802 | toasted | 71 | 13400
2043 | 2805 | toasted | 67 | 13500
3414 | 2871 | toasted | 224 | 23500
2572 | 2951 | toasted | 102 | 20200
2488 | 2988 | toasted | 57 | 25400
4662 | 2994 | toasted | 65 | 24300
3311 | 3015 | toasted | 60 | 22100
3178 | 3091 | toasted | 72 | 27600
1729 | 3171 | toasted | 73 | 58800
4775 | 3426 | toasted | 85 | 85600
4611 | 3479 | toasted | 76 | 25800
2698 | 3559 | toasted | 145 | 35000
3521 | 3575 | toasted | 101 | 26700
3009 | 3659 | toasted | 93 | 26900
2328 | 3846 | toasted | 266 | 29400
2610 | 4259 | toasted | 154 | 42600
2671 | 4313 | toasted | 102 | 30400
3252 | 4344 | toasted | 105 | 23800
3062 | 4586 | toasted | 96 | 24200
2336 | 4674 | toasted | 99 | 27000
4769 | 4682 | toasted | 127 | 24400
2447 | 4970 | toasted | 130 | 25800
2387 | 6449 | toasted | 602 | 67800
3181 | 6974 | toasted | 184 | 31100
4913 | 7516 | toasted | 286 | 29100
3124 | 7934 | toasted | 319 | 26400
3310 | 9063 | toasted | 184 | 42500
2545 | 9240 | toasted | 539 | 86400
4891 | 9381 | toasted | 210 | 51100
4404 | 11201 | toasted | 270 | 38300
3456 | 11362 | toasted | 922 | 125100
3396 | 15441 | toasted | 448 | 92600
2230 | 21679 | toasted | 504 | 159100
3010 | 29281 | toasted | 928 | 197700
(100 rows)
COPY 100
python ./2-timings/2-timings.py# ΠΠ°Π³ΡΡΠΆΠ°Π΅ΠΌ Π΄Π°Π½Π½ΡΠ΅
df = pd.read_csv(file_path)
print(f"ΠΠ°Π³ΡΡΠΆΠ΅Π½ΠΎ {len(df)} Π·Π°ΠΏΠΈΡΠ΅ΠΉ")
# Π Π°Π·Π΄Π΅Π»ΡΠ΅ΠΌ Π΄Π°Π½Π½ΡΠ΅ ΠΏΠΎ ΡΠΈΠΏΡ Ρ
ΡΠ°Π½Π΅Π½ΠΈΡ
inline_data = df[df["storage_type"] == "inline"]
toasted_data = df[df["storage_type"] == "toasted"]- Π‘ΠΊΡΠΈΠΏΡ Π·Π°Π³ΡΡΠΆΠ°Π΅Ρ Π΄Π°Π½Π½ΡΠ΅ ΠΈΠ·ΠΌΠ΅ΡΠ΅Π½ΠΈΠΉ ΠΈΠ· CSV-ΡΠ°ΠΉΠ»Π°.
- Π Π°Π·Π΄Π΅Π»ΡΠ΅Ρ Π΄Π°Π½Π½ΡΠ΅ Π½Π° Π΄Π²Π΅ Π³ΡΡΠΏΠΏΡ: Π²ΡΡΡΠΎΠ΅Π½Π½ΡΠ΅ (<2KB) ΠΈ TOAST (>2KB).
# Π‘ΡΡΠΎΠΈΠΌ ΡΠΎΡΠΊΠΈ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠΈΠΏΠ° Ρ
ΡΠ°Π½Π΅Π½ΠΈΡ
plt.scatter(
inline_data["jsonb_size"],
inline_data["access_time_ns"],
color="blue",
alpha=0.7,
label="ΠΡΡΡΠΎΠ΅Π½Π½ΡΠ΅ (<2kB)",
)- ΠΠ° Π΄ΠΈΠ°Π³ΡΠ°ΠΌΠΌΡ Π½Π°Π½ΠΎΡΡΡΡΡ ΡΠΎΡΠΊΠΈ Ρ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΠ°ΠΌΠΈ:
- X: ΡΠ°Π·ΠΌΠ΅Ρ JSONB (Π² Π±Π°ΠΉΡΠ°Ρ ).
- Y: Π²ΡΠ΅ΠΌΡ Π΄ΠΎΡΡΡΠΏΠ° (Π² Π½Π°Π½ΠΎΡΠ΅ΠΊΡΠ½Π΄Π°Ρ ).
- Π Π°Π·Π½ΡΠ΅ ΡΠΈΠΏΡ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ Π²ΡΠ΄Π΅Π»Π΅Π½Ρ ΡΠ°Π·Π½ΡΠΌΠΈ ΡΠ²Π΅ΡΠ°ΠΌΠΈ (ΡΠΈΠ½ΠΈΠΉ - inline, ΠΊΡΠ°ΡΠ½ΡΠΉ - TOAST).
# ΠΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ Π»ΠΈΠ½ΠΈΠΈ ΡΡΠ΅Π½Π΄Π° Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π³ΡΡΠΏΠΏΡ
if len(inline_data) > 1 and inline_data["jsonb_size"].nunique() > 1:
slope, intercept, r_value, _, _ = linregress(
inline_data["jsonb_size"], inline_data["access_time_ns"]
)- ΠΠ»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π³ΡΡΠΏΠΏΡ Π΄Π°Π½Π½ΡΡ ΡΠ°ΡΡΡΠΈΡΡΠ²Π°Π΅ΡΡΡ Π»ΠΈΠ½ΠΈΡ ΡΡΠ΅Π½Π΄Π° Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ ΡΠ΅Π³ΡΠ΅ΡΡΠΈΠΈ.
- ΠΡΡΠΈΡΠ»ΡΠ΅ΡΡΡ ΠΊΠΎΡΡΡΠΈΡΠΈΠ΅Π½Ρ Π΄Π΅ΡΠ΅ΡΠΌΠΈΠ½Π°ΡΠΈΠΈ
RΒ²Π΄Π»Ρ ΠΎΡΠ΅Π½ΠΊΠΈ ΡΠΈΠ»Ρ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ. - ΠΠ° Π³ΡΠ°ΡΠΈΠΊ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡΡΡ Π»ΠΈΠ½ΠΈΠΈ ΡΡΠ΅Π½Π΄Π° Ρ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΌΠΈ ΠΌΠ΅ΡΠΊΠ°ΠΌΠΈ.
# ΠΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ Π»ΠΈΠ½ΠΈΡ Π³ΡΠ°Π½ΠΈΡΡ TOAST
plt.axvline(
x=2048, color="green", linestyle="--", linewidth=2, label="TOAST Π³ΡΠ°Π½ΠΈΡΠ° (2kB)"
)
# ΠΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ ΡΡΠ΅Π΄Π½ΠΈΠ΅ Π»ΠΈΠ½ΠΈΠΈ Π΄Π»Ρ Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ "ΡΡΡΠΏΠ΅Π½ΡΠΊΠΈ"
if len(inline_data) > 0:
avg_inline = inline_data["access_time_ns"].mean()
plt.axhline(y=avg_inline, ...)- ΠΠ΅ΡΡΠΈΠΊΠ°Π»ΡΠ½Π°Ρ Π·Π΅Π»ΡΠ½Π°Ρ Π»ΠΈΠ½ΠΈΡ ΠΎΡΠΌΠ΅ΡΠ°Π΅Ρ Π³ΡΠ°Π½ΠΈΡΡ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠΈΠΏΠ°ΠΌΠΈ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ (2KB).
- ΠΠΎΡΠΈΠ·ΠΎΠ½ΡΠ°Π»ΡΠ½ΡΠ΅ Π»ΠΈΠ½ΠΈΠΈ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°ΡΡ ΡΡΠ΅Π΄Π½ΠΈΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π΄ΠΎΡΡΡΠΏΠ° Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠΈΠΏΠ°.
print("\n=== Π‘Π’ΠΠ’ΠΠ‘Π’ΠΠΠ ΠΠ ΠΠ Π£ΠΠΠΠ ===")
for name, group in [("ΠΡΡΡΠΎΠ΅Π½Π½ΡΠ΅ (<2kB)", inline_data), ("TOAST (>2kB)", toasted_data)]:
print(f"\n{name}:")
print(f"ΠΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π·Π°ΠΏΠΈΡΠ΅ΠΉ: {len(group)}")
...- Π‘ΠΊΡΠΈΠΏΡ Π²ΡΠ²ΠΎΠ΄ΠΈΡ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΡΡ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΡ ΠΏΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π³ΡΡΠΏΠΏΠ΅ Π΄Π°Π½Π½ΡΡ
:
- Π‘ΡΠ΅Π΄Π½ΠΈΠΉ/ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΡΠΉ/ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΡΠΉ ΡΠ°Π·ΠΌΠ΅ΡΡ;
- Π‘ΡΠ΅Π΄Π½Π΅Π΅ Π²ΡΠ΅ΠΌΡ Π΄ΠΎΡΡΡΠΏΠ°;
- Π‘ΠΎΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠ΅ Π²ΡΠ΅ΠΌΡ/ΡΠ°Π·ΠΌΠ΅Ρ (Π½Ρ/Π±Π°ΠΉΡ).
ΠΠ°Π³ΡΡΠΆΠ΅Π½ΠΎ 100 Π·Π°ΠΏΠΈΡΠ΅ΠΉ
ΠΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π·Π°ΠΏΠΈΡΠ΅ΠΉ inline: 50
ΠΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π·Π°ΠΏΠΈΡΠ΅ΠΉ toasted: 50
ΠΡΠ°ΡΠΈΠΊ ΡΠΎΡ
ΡΠ°Π½Π΅Π½: jsonb_access_time.png
=== Π‘Π’ΠΠ’ΠΠ‘Π’ΠΠΠ ΠΠ ΠΠ Π£ΠΠΠΠ ===
ΠΡΡΡΠΎΠ΅Π½Π½ΡΠ΅ (<2kB):
ΠΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π·Π°ΠΏΠΈΡΠ΅ΠΉ: 50
Π‘ΡΠ΅Π΄Π½ΠΈΠΉ ΡΠ°Π·ΠΌΠ΅Ρ: 247.2 Π±Π°ΠΉΡ
ΠΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΡΠΉ ΡΠ°Π·ΠΌΠ΅Ρ: 75 Π±Π°ΠΉΡ
ΠΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΡΠΉ ΡΠ°Π·ΠΌΠ΅Ρ: 1489 Π±Π°ΠΉΡ
Π£Π½ΠΈΠΊΠ°Π»ΡΠ½ΡΡ
ΡΠ°Π·ΠΌΠ΅ΡΠΎΠ²: 41
Π‘ΡΠ΅Π΄Π½Π΅Π΅ Π²ΡΠ΅ΠΌΡ Π΄ΠΎΡΡΡΠΏΠ°: 5844.00 Π½Ρ
Π‘ΠΎΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠ΅ Π²ΡΠ΅ΠΌΡ/ΡΠ°Π·ΠΌΠ΅Ρ: 23.6427 Π½Ρ/Π±Π°ΠΉΡ
TOAST (>2kB):
ΠΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π·Π°ΠΏΠΈΡΠ΅ΠΉ: 50
Π‘ΡΠ΅Π΄Π½ΠΈΠΉ ΡΠ°Π·ΠΌΠ΅Ρ: 5249.6 Π±Π°ΠΉΡ
ΠΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΡΠΉ ΡΠ°Π·ΠΌΠ΅Ρ: 2116 Π±Π°ΠΉΡ
ΠΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΡΠΉ ΡΠ°Π·ΠΌΠ΅Ρ: 29281 Π±Π°ΠΉΡ
Π£Π½ΠΈΠΊΠ°Π»ΡΠ½ΡΡ
ΡΠ°Π·ΠΌΠ΅ΡΠΎΠ²: 50
Π‘ΡΠ΅Π΄Π½Π΅Π΅ Π²ΡΠ΅ΠΌΡ Π΄ΠΎΡΡΡΠΏΠ°: 37476.00 Π½Ρ
Π‘ΠΎΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠ΅ Π²ΡΠ΅ΠΌΡ/ΡΠ°Π·ΠΌΠ΅Ρ: 7.1388 Π½Ρ/Π±Π°ΠΉΡ
Π ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΡΠΊΡΠΈΠΏΡΠ° Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅ΡΡΡ Π³ΡΠ°ΡΠΈΠΊ, ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°ΡΡΠΈΠΉ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ JSONB-Π΄Π°Π½Π½ΡΠΌ ΠΎΡ ΠΈΡ ΡΠ°Π·ΠΌΠ΅ΡΠ°:
Π Π΅Π·ΡΠ»ΡΡΠ°ΡΡ ΠΏΡΠΎΠ²Π΅Π΄ΡΠ½Π½ΡΡ ΠΈΠ·ΠΌΠ΅ΡΠ΅Π½ΠΈΠΉ Π½Π°Π³Π»ΡΠ΄Π½ΠΎ Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΡΡΡ Π²Π»ΠΈΡΠ½ΠΈΠ΅ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠ° TOAST Π½Π° ΡΠΊΠΎΡΠΎΡΡΡ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ JSONB-Π΄Π°Π½Π½ΡΠΌ Π² PostgreSQL:
-
Π―Π²Π½Π°Ρ "ΡΡΡΠΏΠ΅Π½ΡΠΊΠ°" Π² ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ Π½Π° Π³ΡΠ°Π½ΠΈΡΠ΅ 2KB:
- ΠΠ»Ρ Π΄Π°Π½Π½ΡΡ ΠΌΠ΅Π½ΡΡΠ΅ 2KB (inline Ρ ΡΠ°Π½Π΅Π½ΠΈΠ΅): ΡΡΠ΅Π΄Π½Π΅Π΅ Π²ΡΠ΅ΠΌΡ Π΄ΠΎΡΡΡΠΏΠ° ΡΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ 5844 Π½Ρ;
- ΠΠ»Ρ Π΄Π°Π½Π½ΡΡ Π±ΠΎΠ»ΡΡΠ΅ 2KB (TOAST Ρ ΡΠ°Π½Π΅Π½ΠΈΠ΅): ΡΡΠ΅Π΄Π½Π΅Π΅ Π²ΡΠ΅ΠΌΡ Π΄ΠΎΡΡΡΠΏΠ° ΡΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ 37476 Π½Ρ;
- Π Π°Π·Π½ΠΈΡΠ° ΡΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ 6.4 ΡΠ°Π·Π°, ΡΡΠΎ ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠΆΠ΄Π°Π΅Ρ ΡΠ΅ΠΎΡΠ΅ΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΎ Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎΠΌ Π²Π»ΠΈΡΠ½ΠΈΠΈ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠ° TOAST Π½Π° ΡΠΊΠΎΡΠΎΡΡΡ Π΄ΠΎΡΡΡΠΏΠ°.
-
Π₯Π°ΡΠ°ΠΊΡΠ΅Ρ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ Π²ΡΠ΅ΠΌΡ/ΡΠ°Π·ΠΌΠ΅Ρ ΡΠ°Π·Π»ΠΈΡΠ°Π΅ΡΡΡ Π΄Π»Ρ ΡΠ°Π·Π½ΡΡ ΡΠΈΠΏΠΎΠ² Ρ ΡΠ°Π½Π΅Π½ΠΈΡ:
- ΠΠ»Ρ inline Π΄Π°Π½Π½ΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠ°Π·ΠΌΠ΅ΡΠΎΠΌ ΠΈ Π²ΡΠ΅ΠΌΠ΅Π½Π΅ΠΌ Π΄ΠΎΡΡΡΠΏΠ° ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠ»Π°Π±Π°Ρ;
- ΠΠ»Ρ TOAST Π΄Π°Π½Π½ΡΡ Π½Π°Π±Π»ΡΠ΄Π°Π΅ΡΡΡ Π±ΠΎΠ»Π΅Π΅ Π²ΡΡΠ°ΠΆΠ΅Π½Π½Π°Ρ Π»ΠΈΠ½Π΅ΠΉΠ½Π°Ρ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡ, ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ Π½Π° Π±ΠΎΠ»ΡΡΠΈΡ ΠΎΠ±ΡΡΠΌΠ°Ρ (>10KB).
-
ΠΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Ρ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π΄ΠΎΡΡΡΠΏΠ°:
- Inline: ΠΌΠΈΠ½ΠΈΠΌΡΠΌ 3500 Π½Ρ, ΠΌΠ°ΠΊΡΠΈΠΌΡΠΌ 39700 Π½Ρ (Π²ΡΠ±ΡΠΎΡ Π΄Π»Ρ ID=7579);
- TOAST: ΠΌΠΈΠ½ΠΈΠΌΡΠΌ 11700 Π½Ρ, ΠΌΠ°ΠΊΡΠΈΠΌΡΠΌ 197700 Π½Ρ (Π΄Π»Ρ ΡΠ°ΠΌΠΎΠ³ΠΎ Π±ΠΎΠ»ΡΡΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ° 29281 Π±Π°ΠΉΡ).
-
ΠΠ°ΡΠ°Π΄ΠΎΠΊΡ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΡΡΠΈ:
- ΠΠ΅ΡΠΌΠΎΡΡΡ Π½Π° Π±ΠΎΠ»Π΅Π΅ Π²ΡΡΠΎΠΊΠΎΠ΅ Π°Π±ΡΠΎΠ»ΡΡΠ½ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ Π΄ΠΎΡΡΡΠΏΠ°, TOAST Ρ ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΡΠ΅Ρ Π»ΡΡΡΠ΅Π΅ ΡΠΎΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠ΅ Π²ΡΠ΅ΠΌΡ/ΡΠ°Π·ΠΌΠ΅Ρ: 7.14 Π½Ρ/Π±Π°ΠΉΡ ΠΏΡΠΎΡΠΈΠ² 23.64 Π½Ρ/Π±Π°ΠΉΡ Π΄Π»Ρ inline Ρ ΡΠ°Π½Π΅Π½ΠΈΡ;
- ΠΡΠΎ ΠΎΠ±ΡΡΡΠ½ΡΠ΅ΡΡΡ ΡΠ΅ΠΌ, ΡΡΠΎ Π½Π°ΠΊΠ»Π°Π΄Π½ΡΠ΅ ΡΠ°ΡΡ ΠΎΠ΄Ρ Π½Π° Π΄Π΅ΠΊΠΎΠΌΠΏΡΠ΅ΡΡΠΈΡ TOAST ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»ΡΡΡΡΡ Π½Π° Π±ΠΎΠ»ΡΡΠΈΠΉ ΠΎΠ±ΡΡΠΌ Π΄Π°Π½Π½ΡΡ .
-
ΠΠΎΡΡΠ΅Π»ΡΡΠΈΡ Ρ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎΠΌ ΡΠΎΠ»Π΅ΠΉ:
- Π‘ΡΠ΅Π΄Π½ΠΈΠ΅ Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠΈ inline Ρ ΡΠ°Π½Π΅Π½ΠΈΡ: 247 Π±Π°ΠΉΡ Π½Π° 2 ΡΠΎΠ»ΠΈ;
- Π‘ΡΠ΅Π΄Π½ΠΈΠ΅ Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠΈ TOAST Ρ ΡΠ°Π½Π΅Π½ΠΈΡ: 5250 Π±Π°ΠΉΡ Π½Π° 185 ΡΠΎΠ»Π΅ΠΉ;
- ΠΠ°Π±Π»ΡΠ΄Π°Π΅ΡΡΡ Π·Π°ΠΊΠΎΠ½ΠΎΠΌΠ΅ΡΠ½ΠΎΡΡΡ: Π²ΡΠ΅ΠΌΡ Π΄ΠΎΡΡΡΠΏΠ° ΡΠ°ΡΡΡΡ Ρ ΡΠ²Π΅Π»ΠΈΡΠ΅Π½ΠΈΠ΅ΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π° ΡΠΎΠ»Π΅ΠΉ, ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ Π΄Π»Ρ TOAST Π΄Π°Π½Π½ΡΡ .
-
ΠΡΠ±ΡΠΎΡΡ Π² ΠΈΠ·ΠΌΠ΅ΡΠ΅Π½ΠΈΡΡ :
- ΠΠ»Ρ inline Π΄Π°Π½Π½ΡΡ Π·Π°ΠΌΠ΅ΡΠ΅Π½ ΠΎΠ΄ΠΈΠ½ Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΡΠΉ Π²ΡΠ±ΡΠΎΡ (ID=7579, 39700 Π½Ρ);
- ΠΠ»Ρ TOAST Π΄Π°Π½Π½ΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π²ΡΠ±ΡΠΎΡΠΎΠ² Π½Π° Π±ΠΎΠ»ΡΡΠΈΡ ΠΎΠ±ΡΡΠΌΠ°Ρ , ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠ²ΡΠ·Π°Π½ΠΎ Ρ ΠΏΠΎΠ²ΡΡΠ΅Π½Π½ΠΎΠΉ Π½Π°Π³ΡΡΠ·ΠΊΠΎΠΉ Π½Π° ΡΠΈΡΡΠ΅ΠΌΡ ΠΊΠ΅ΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ.
ΠΡΠΈ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠΆΠ΄Π°ΡΡ Π³ΠΈΠΏΠΎΡΠ΅Π·Ρ ΠΎ Π½Π°Π»ΠΈΡΠΈΠΈ "ΡΡΡΠΏΠ΅Π½ΡΠΊΠΈ" Π² ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ ΠΏΡΠΈ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄Π΅ ΡΠ΅ΡΠ΅Π· ΠΏΠΎΡΠΎΠ³ TOAST (2KB), Π° ΡΠ°ΠΊΠΆΠ΅ Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΡΡΡ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΡΡ Π»ΠΈΠ½Π΅ΠΉΠ½ΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡ Π΄Π»Ρ Π±ΠΎΠ»ΡΡΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² Π΄Π°Π½Π½ΡΡ .
Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°ΡΠΈΠΈ ΠΏΠΎ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ ΡΠ°Π±ΠΎΡΡ Ρ Π±ΠΎΠ»ΡΡΠΈΠΌΠΈ JSONB-Π΄Π°Π½Π½ΡΠΌΠΈ
-
Π‘ΡΡΡΠΊΡΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π°Π½Π½ΡΡ :
- ΠΠΎΡΠΌΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΊΡΠΈΡΠΈΡΠ½ΡΡ ΠΏΠΎΠ»Π΅ΠΉ: Π²ΡΠ½Π΅ΡΠΈΡΠ΅ ΡΠ°ΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠ΅ ΠΈΠ»ΠΈ ΠΊΡΠΈΡΠΈΡΠ½ΡΠ΅ Π΄Π»Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ ΠΏΠΎΠ»Ρ ΠΈΠ· JSONB Π² ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠ΅ ΡΡΠΎΠ»Π±ΡΡ ΡΠ°Π±Π»ΠΈΡΡ;
- ΠΠ΅ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡΠΈΡ Π±ΠΎΠ»ΡΡΠΈΡ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΎΠ²: ΡΠ°Π·Π΄Π΅Π»ΡΠΉΡΠ΅ Π±ΠΎΠ»ΡΡΠΈΠ΅ JSONB-ΠΎΠ±ΡΠ΅ΠΊΡΡ Π½Π° Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΡΠ°ΡΡΠΈ, ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ Π΅ΡΠ»ΠΈ ΡΠ°Π·ΠΌΠ΅Ρ ΠΏΡΠ΅Π²ΡΡΠ°Π΅Ρ 2KB (ΠΏΠΎΡΠΎΠ³ TOAST).
-- ΠΡΠΈΠΌΠ΅Ρ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΉ ΡΡΡΡΠΊΡΡΡΡ CREATE TABLE actors_optimized ( id integer PRIMARY KEY, actor_first_name varchar, actor_second_name varchar, first_role_year integer, -- ΠΡΠ½Π΅ΡΠ΅Π½Π½ΠΎΠ΅ ΠΏΠΎΠ»Π΅ Π΄Π»Ρ Π±ΡΡΡΡΠΎΠ³ΠΎ Π΄ΠΎΡΡΡΠΏΠ° roles_count integer, -- ΠΠ΅Π½ΠΎΡΠΌΠ°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΠΉ ΡΡΠ΅ΡΡΠΈΠΊ roles_data jsonb -- ΠΡΡΠ°Π»ΡΠ½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ ΠΎ ΡΠΎΠ»ΡΡ );
-
ΠΡΡΠ΅ΠΊΡΠΈΠ²Π½Π°Ρ ΠΈΠ½Π΄Π΅ΠΊΡΠ°ΡΠΈΡ:
- Π‘ΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ ΠΈΠ½Π΄Π΅ΠΊΡΡ: ΡΠΎΠ·Π΄Π°Π²Π°ΠΉΡΠ΅ ΠΈΠ½Π΄Π΅ΠΊΡΡ Π΄Π»Ρ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΡ ΠΏΡΡΠ΅ΠΉ JSON, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ°ΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ Π² ΡΡΠ»ΠΎΠ²ΠΈΡΡ ΠΏΠΎΠΈΡΠΊΠ°;
- ΠΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ GIN-ΠΈΠ½Π΄Π΅ΠΊΡΡ: ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΉ ΡΠΈΠΏ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ° Π΄Π»Ρ ΠΈΠ½Π΄Π΅ΠΊΡΠ°ΡΠΈΠΈ (
jsonb_opsΠΈΠ»ΠΈjsonb_path_ops); - Π§Π°ΡΡΠΈΡΠ½ΡΠ΅ ΠΈΠ½Π΄Π΅ΠΊΡΡ: Π΄Π»Ρ Π±ΠΎΠ»ΡΡΠΈΡ ΡΠ°Π±Π»ΠΈΡ ΠΏΡΠΈΠΌΠ΅Π½ΡΠΉΡΠ΅ ΠΈΠ½Π΄Π΅ΠΊΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΊ ΡΠ΅Π»Π΅Π²Π°Π½ΡΠ½ΡΠΌ Π·Π°ΠΏΠΈΡΡΠΌ:
-- ΠΠ½Π΄Π΅ΠΊΡ Π΄Π»Ρ ΡΠ°ΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠΎΠ³ΠΎ ΠΏΠΎΠ»Ρ CREATE INDEX idx_first_role_year ON actors ((RolesName->'roles'->0->>'year')); -- ΠΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ GIN-ΠΈΠ½Π΄Π΅ΠΊΡ Π΄Π»Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π²Ρ ΠΎΠΆΠ΄Π΅Π½ΠΈΡ (@>) CREATE INDEX idx_jsonb_path_ops ON actors USING GIN (RolesName jsonb_path_ops);
-
ΠΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ Π·Π°ΠΏΡΠΎΡΠΎΠ²:
- ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ JSONPath: ΠΏΡΠ΅Π΄ΠΏΠΎΡΠΈΡΠ°ΠΉΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ JSONPath Π²ΠΌΠ΅ΡΡΠΎ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΎΠ²
->ΠΈ->>Π΄Π»Ρ ΡΠ»ΠΎΠΆΠ½ΡΡ ΡΡΠ»ΠΎΠ²ΠΈΠΉ; - ΠΠ°ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ: ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ Π²ΡΡΠΈΡΠ»ΡΠΉΡΠ΅ ΡΠ°ΡΡΠΎ Π·Π°ΠΏΡΠ°ΡΠΈΠ²Π°Π΅ΠΌΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ Π΄Π»Ρ ΡΠ»ΠΎΠΆΠ½ΡΡ Π·Π°ΠΏΡΠΎΡΠΎΠ²:
-- ΠΡΡΠ΅ΠΊΡΠΈΠ²Π½ΡΠΉ Π·Π°ΠΏΡΠΎΡ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ JSONPath SELECT * FROM actors WHERE jsonb_path_exists(RolesName, '$.roles[*] ? (@.year > "2010" && @.credit == "1")');
- ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ JSONPath: ΠΏΡΠ΅Π΄ΠΏΠΎΡΠΈΡΠ°ΠΉΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ JSONPath Π²ΠΌΠ΅ΡΡΠΎ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΎΠ²
ΠΠ·ΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ Π²Π»ΠΈΡΠ½ΠΈΡ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΉ Π½Π° JSONB Ρ ΡΠ°Π·Π½ΡΠΌΠΈ ΡΠ°Π·ΠΌΠ΅ΡΠ°ΠΌΠΈ Π΄Π°Π½Π½ΡΡ
Π‘ΠΊΡΠΈΠΏΡ update-year.sql ΠΏΡΠΎΠ²ΠΎΠ΄ΠΈΡ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½Ρ Π΄Π»Ρ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ Π²Π»ΠΈΡΠ½ΠΈΡ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ JSONB-ΠΏΠΎΠ»Ρ Π½Π° ΠΎΠ±ΡΠ΅ΠΌ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ
Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΡΠ°Π·ΠΌΠ΅ΡΠ° Π΄Π°Π½Π½ΡΡ
. ΠΡΠ½ΠΎΠ²Π½Π°Ρ Π·Π°Π΄Π°ΡΠ° - Π½Π°Π³Π»ΡΠ΄Π½ΠΎ ΠΏΡΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠ°Π·Π½ΠΈΡΡ Π² ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠΈ PostgreSQL ΠΏΡΠΈ ΡΠ°Π±ΠΎΡΠ΅ Ρ Π΄Π°Π½Π½ΡΠΌΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ Ρ
ΡΠ°Π½ΡΡΡΡ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ Π² ΡΡΡΠΎΠΊΠ΅ ΡΠ°Π±Π»ΠΈΡΡ (inline) ΠΈ Π΄Π°Π½Π½ΡΠΌΠΈ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠΈΠΌΠΈ ΠΌΠ΅Ρ
Π°Π½ΠΈΠ·ΠΌ TOAST (The Oversized-Attribute Storage Technique).
ΠΠ°ΠΏΡΡΡΠΈΠΌ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΡ
Π·Π°ΠΏΡΠΎΡΠΎΠ² ΠΈΠ· ΡΠ°ΠΉΠ»Π° ./3-update-year/update-year.sql Π²ΡΠΏΠΎΠ»Π½ΠΈΠ² ΡΠ»Π΅Π΄ΡΡΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ Π² ΡΠ΅ΡΠΌΠΈΠ½Π°Π»Π΅:
psql -U postgres -d imdb -f ./3-update-year/update-year.sql | catCREATE OR REPLACE FUNCTION get_table_size(p_table text)
RETURNS TABLE(
table_size bigint,
toast_size bigint,
total_size bigint
)
AS $$ΠΡΠ° ΡΡΠ½ΠΊΡΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ PostgreSQL Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΡΡΠ΅Ρ ΠΊΠ»ΡΡΠ΅Π²ΡΡ ΠΌΠ΅ΡΡΠΈΠΊ:
table_size- ΡΠ°Π·ΠΌΠ΅Ρ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΡΠ°Π±Π»ΠΈΡΡ Π±Π΅Π· ΡΡΠ΅ΡΠ° TOAST-Π΄Π°Π½Π½ΡΡ .toast_size- ΡΠ°Π·ΠΌΠ΅Ρ TOAST-ΡΠ°Π±Π»ΠΈΡΡ (Π΅ΡΠ»ΠΈ ΠΈΠΌΠ΅Π΅ΡΡΡ).total_size- ΠΎΠ±ΡΠΈΠΉ ΡΠ°Π·ΠΌΠ΅Ρ (ΠΎΡΠ½ΠΎΠ²Π½Π°Ρ + TOAST ΡΠ°Π±Π»ΠΈΡΡ).
CREATE TEMP TABLE test_actors AS
SELECT
*
FROM (
-- ΠΠΊΡΠ΅Ρ Ρ ΠΌΠ°Π»ΡΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎΠΌ ΡΠΎΠ»Π΅ΠΉ
SELECT
id,
ActorFirstName,
ActorSecondName,
RolesName,
'small' AS actor_type,
jsonb_array_length(RolesName -> 'roles') AS roles_count,
pg_column_size(RolesName) AS data_size
FROM
actors
WHERE
pg_column_size(RolesName) < 1000 -- ΠΠ°ΡΠ°Π½ΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎ inline
AND jsonb_array_length(RolesName -> 'roles') BETWEEN 1 AND 5
ORDER BY
pg_column_size(RolesName)
LIMIT 1) AS small
-- ... Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΡΠΉ ΠΊΠΎΠ΄ Π΄Π»Ρ Π±ΠΎΠ»ΡΡΠΎΠ³ΠΎ Π°ΠΊΡΠ΅ΡΠ° ...Π‘ΠΊΡΠΈΠΏΡ Π²ΡΠ±ΠΈΡΠ°Π΅Ρ Π΄Π²Π΅ Π·Π°ΠΏΠΈΡΠΈ Π°ΠΊΡΠ΅ΡΠΎΠ²:
- ΠΠ°Π»Π΅Π½ΡΠΊΠΈΠΉ Π°ΠΊΡΠ΅Ρ - Ρ Π΄Π°Π½Π½ΡΠΌΠΈ ΠΌΠ΅Π½Π΅Π΅ 1000 Π±Π°ΠΉΡ ΠΈ Π½Π΅ Π±ΠΎΠ»Π΅Π΅ 5 ΡΠΎΠ»ΡΠΌΠΈ.
- ΠΠΎΠ»ΡΡΠΎΠΉ Π°ΠΊΡΠ΅Ρ - Ρ Π΄Π°Π½Π½ΡΠΌΠΈ Π±ΠΎΠ»Π΅Π΅ 10000 Π±Π°ΠΉΡ ΠΈ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ 200 ΡΠΎΠ»ΡΠΌΠΈ.
Π€ΡΠ½ΠΊΡΠΈΡ pg_column_size() ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΡΠΎΡΠ½ΠΎΠ³ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΡΠ΅Π°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠ°Π·ΠΌΠ΅ΡΠ° JSONB-Π΄Π°Π½Π½ΡΡ
Π² Π±Π°ΠΉΡΠ°Ρ
.
CREATE OR REPLACE FUNCTION update_actor_role_year(p_id integer, p_iterations integer)
RETURNS VOID
AS $$ΠΡΠ° ΡΡΠ½ΠΊΡΠΈΡ:
- ΠΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ID Π°ΠΊΡΠ΅ΡΠ° ΠΈ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΈΡΠ΅ΡΠ°ΡΠΈΠΉ.
- Π ΡΠΈΠΊΠ»Π΅ ΠΌΠ΅Π½ΡΠ΅Ρ Π³ΠΎΠ΄ ΠΏΠ΅ΡΠ²ΠΎΠΉ ΡΠΎΠ»ΠΈ ΠΌΠ΅ΠΆΠ΄Ρ '1900' ΠΈ '2023'.
- ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ
jsonb_set()Π΄Π»Ρ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠ³ΠΎ Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»Ρ JSONB Π±Π΅Π· ΠΏΠΎΠ»Π½ΠΎΠΉ Π·Π°ΠΌΠ΅Π½Ρ Π²ΡΠ΅Π³ΠΎ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°.
Π‘ΠΊΡΠΈΠΏΡ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΈΠ·ΠΌΠ΅ΡΠ΅Π½ΠΈΠΉ ΡΠ°Π·ΠΌΠ΅ΡΠ° ΡΠ°Π±Π»ΠΈΡΡ:
- ΠΠ°ΡΠ°Π»ΡΠ½ΠΎΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅.
- ΠΠΎΡΠ»Π΅ 100 ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΉ ΠΌΠ°Π»Π΅Π½ΡΠΊΠΎΠ³ΠΎ Π°ΠΊΡΠ΅ΡΠ°.
- ΠΠΎΡΠ»Π΅ 100 ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΉ Π±ΠΎΠ»ΡΡΠΎΠ³ΠΎ Π°ΠΊΡΠ΅ΡΠ°.
ΠΡΠ΅ ΠΈΠ·ΠΌΠ΅ΡΠ΅Π½ΠΈΡ ΡΠΎΡ
ΡΠ°Π½ΡΡΡΡΡ Π² ΡΠ°Π±Π»ΠΈΡΠ΅ size_measurements Π΄Π»Ρ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠ΅Π³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π°.
WITH size_changes AS (
SELECT
-- ΠΠ»Ρ ΠΌΠ°Π»ΠΎΠ³ΠΎ Π°ΠΊΡΠ΅ΡΠ° (ΠΈΠ·ΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ Π΄ΠΎ ΠΈ ΠΏΠΎΡΠ»Π΅ Π΅Π³ΠΎ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ)
m1.actor_type,
m1.id,
m2.table_size - m1.table_size AS table_size_change,
-- ... ΠΊΠΎΠ΄ ...
FROM
size_measurements m1,
size_measurements m2
WHERE
m1.measurement_point = 'before_update'
AND m2.measurement_point = 'after_small_update'
AND m1.actor_type = 'small'
AND m2.actor_type = 'small'
UNION ALL
-- ΠΠ»Ρ Π±ΠΎΠ»ΡΡΠΎΠ³ΠΎ Π°ΠΊΡΠ΅ΡΠ° (ΠΈΠ·ΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎΡΠ»Π΅ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ ΠΌΠ°Π»ΠΎΠ³ΠΎ ΠΈ ΠΏΠΎΡΠ»Π΅ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ Π±ΠΎΠ»ΡΡΠΎΠ³ΠΎ)
SELECT
-- ... ΠΊΠΎΠ΄ ...
)ΠΠ΄Π΅ΡΡ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠ΅ ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ ΡΠ°Π·ΠΌΠ΅ΡΠ° Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π°ΠΊΡΠ΅ΡΠ° Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ CTE (Common Table Expression).
Common Table Expression (CTE) ΠΈΠ»ΠΈ ΠΎΠ±ΡΠ΅Π΅ ΡΠ°Π±Π»ΠΈΡΠ½ΠΎΠ΅ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ - ΡΡΠΎ ΠΌΠΎΡΠ½ΡΠΉ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ SQL, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠΈΠΉ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΡΠ΅ Π½Π°Π±ΠΎΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠ², ΠΊ ΠΊΠΎΡΠΎΡΡΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΡΠ°ΡΠ°ΡΡΡΡ Π² ΡΠ°ΠΌΠΊΠ°Ρ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠ³ΠΎ SQL-Π·Π°ΠΏΡΠΎΡΠ°.
ΠΡΠ½ΠΎΠ²Π½ΡΠ΅ Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠΈ CTE:
- ΠΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠ΅ ΡΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°Π½ΠΈΠ΅: CTE ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΡΠΎΠ»ΡΠΊΠΎ Π²ΠΎ Π²ΡΠ΅ΠΌΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π·Π°ΠΏΡΠΎΡΠ°, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΎΠ½ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΎ.
- Π‘ΠΈΠ½ΡΠ°ΠΊΡΠΈΡ: ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ³ΠΎ ΡΠ»ΠΎΠ²Π°
WITH, Π·Π° ΠΊΠΎΡΠΎΡΡΠΌ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΈΠΌΡ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ ΠΈ ΠΎΠΏΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎ ΡΠΏΠΈΡΠΎΠΊ ΡΡΠΎΠ»Π±ΡΠΎΠ². - ΠΠ±Π»Π°ΡΡΡ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΠΈ: ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ CTE Π΄ΠΎΡΡΡΠΏΠ½Ρ ΡΠΎΠ»ΡΠΊΠΎ Π² ΠΏΡΠ΅Π΄Π΅Π»Π°Ρ
Π·Π°ΠΏΡΠΎΡΠ°, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠ΅Π³ΠΎ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅
WITH.
- ΠΠ΅ΡΡΠΈΠΊΠΈ ΡΠ°Π·ΠΌΠ΅ΡΠ°: ΡΠΊΡΠΈΠΏΡ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π΅Ρ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ±ΡΠΈΠΉ ΡΠ°Π·ΠΌΠ΅Ρ, Π½ΠΎ ΠΈ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎ ΡΠ°Π·ΠΌΠ΅ΡΡ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΠΈ TOAST-ΡΠ°Π±Π»ΠΈΡ, ΡΡΠΎ Π²Π°ΠΆΠ½ΠΎ Π΄Π»Ρ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΡ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠ° ΡΠ°Π±ΠΎΡΡ Ρ Π±ΠΎΠ»ΡΡΠΈΠΌΠΈ Π΄Π°Π½Π½ΡΠΌΠΈ.
- ΠΠ½ΠΎΠ³ΠΎΠΊΡΠ°ΡΠ½ΠΎΠ΅ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅: 100 ΠΈΡΠ΅ΡΠ°ΡΠΈΠΉ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ Π³Π°ΡΠ°Π½ΡΠΈΡΡΡΡ, ΡΡΠΎ ΡΡΡΠ΅ΠΊΡ Π±ΡΠ΄Π΅Ρ Π·Π°ΠΌΠ΅ΡΠ΅Π½ ΠΈ ΡΡΠ°ΡΠΈΡΡΠΈΡΠ΅ΡΠΊΠΈ Π·Π½Π°ΡΠΈΠΌΡΠΌ.
- Π¦Π΅Π»Π΅Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½Π½ΡΠΉ Π²ΡΠ±ΠΎΡ Π·Π°ΠΏΠΈΡΠ΅ΠΉ: ΡΠΊΡΠΈΠΏΡ ΡΡΠ°ΡΠ΅Π»ΡΠ½ΠΎ Π²ΡΠ±ΠΈΡΠ°Π΅Ρ Π°ΠΊΡΠ΅ΡΠΎΠ² Ρ ΡΠ°Π·Π½ΡΠΌΠΈ Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠ°ΠΌΠΈ Π΄Π»Ρ Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠ°ΡΠΈΠΈ ΡΠ°Π·Π»ΠΈΡΠΈΠΉ.
ΠΠΎΡΠ»Π΅ Π·Π°ΠΏΡΡΠΊΠ° ΡΠΊΡΠΈΠΏΡΠ° Π² ΠΊΠΎΠ½ΡΠΎΠ»ΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ²ΠΈΠ΄Π΅ΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ ΠΈΠ·ΠΌΠ΅ΡΠ΅Π½ΠΈΠΉ ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΉ:
CREATE FUNCTION
psql:3-update-year/update-year.sql:18: NOTICE: table "test_actors" does not exist, skipping
DROP TABLE
SELECT 2
actor_type | id | name | roles_count | jsonb_size_bytes | jsonb_size_kb | first_role_year
------------+---------+--------------+-------------+------------------+---------------+-----------------
small | 139194 | Tibor BalΓ‘zs | 1 | 63 | 0.06 | 2009
large | 2555314 | Frank Welker | 5046 | 212356 | 207.38 | 2023
(2 rows)
CREATE FUNCTION
table_size | toast_size | total_size
------------+------------+------------
903233536 | 1021689856 | 1924923392
(1 row)
SELECT 2
id | actorfirstname | actorsecondname | roles_count
--------+----------------+-----------------+-------------
139194 | Tibor | BalΓ‘zs | 1
(1 row)
psql:3-update-year/update-year.sql:118: NOTICE: Updated small actor (ID: 139194) 100 times
DO
INSERT 0 2
id | actorfirstname | actorsecondname | roles_count
---------+----------------+-----------------+-------------
2555314 | Frank | Welker | 5046
(1 row)
psql:3-update-year/update-year.sql:143: NOTICE: Updated large actor (ID: 2555314) 100 times
DO
INSERT 0 2
actor_type | id | ΠΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΡΠ°Π±Π»ΠΈΡΡ (Π±Π°ΠΉΡ) | ΠΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ TOAST-ΡΠ°Π±Π»ΠΈΡΡ (Π±Π°ΠΉΡ) | ΠΠ±ΡΠ΅Π΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ (Π±Π°ΠΉΡ) | ΠΠ±ΡΠ΅Π΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ (KiB)
------------+---------+-----------------------------------+--------------------------------+------------------------+-----------------------
large | 2555314 | 0 | 4169728 | 4169728 | 4072.00
small | 139194 | 0 | 0 | 0 | 0.00
(2 rows)
ΠΡΠΈΠ²Π΅Π΄ΡΠΌ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΡ ΠΈΠ· Π²ΡΠ²ΠΎΠ΄Π° ΡΠΊΡΠΈΠΏΡΠ° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΡΠ°Π·ΠΌΠ΅ΡΠ°Ρ ΡΠ°Π±Π»ΠΈΡ ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡΡ Π² Π±ΠΎΠ»Π΅Π΅ ΡΠ΄ΠΎΠ±Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅:
| actor_type | id | ΠΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΡΠ°Π±Π»ΠΈΡΡ (Π±Π°ΠΉΡ) | ΠΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ TOAST-ΡΠ°Π±Π»ΠΈΡΡ (Π±Π°ΠΉΡ) | ΠΠ±ΡΠ΅Π΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ (Π±Π°ΠΉΡ) | ΠΠ±ΡΠ΅Π΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ (ΠΠ) |
|---|---|---|---|---|---|
| large | 2555314 | 0 | 4169728 | 4169728 | 4072.00 |
| small | 139194 | 0 | 0 | 0 | 0.00 |
-
ΠΠ»Ρ Π°ΠΊΡΠ΅ΡΠ° Ρ ΠΌΠ°Π»ΡΠΌΠΈ Π΄Π°Π½Π½ΡΠΌΠΈ (inline):
- ΠΡΡΡΡΡΡΠ²ΠΈΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² ΡΠ°Π·ΠΌΠ΅ΡΠ΅ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΡΠ°Π±Π»ΠΈΡΡ;
- TOAST-ΡΠ°Π±Π»ΠΈΡΠ° Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»Π°ΡΡ, ΡΡΠΎ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΠΎ, Π²Π΅Π΄Ρ Π΄Π°Π½Π½ΡΠ΅ Ρ ΡΠ°Π½ΡΡΡΡ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ Π² ΡΡΡΠΎΠΊΠ΅.
-
ΠΠ»Ρ Π°ΠΊΡΠ΅ΡΠ° Ρ Π±ΠΎΠ»ΡΡΠΈΠΌΠΈ Π΄Π°Π½Π½ΡΠΌΠΈ (TOAST):
- ΠΠ½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎΠ΅ ΡΠ²Π΅Π»ΠΈΡΠ΅Π½ΠΈΠ΅ ΡΠ°Π·ΠΌΠ΅ΡΠ° TOAST-ΡΠ°Π±Π»ΠΈΡΡ ΠΈΠ·-Π·Π° ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΠΈ ΠΌΠ΅Ρ
Π°Π½ΠΈΠ·ΠΌΠ° TOAST:
- ΠΡΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΈ ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ Π½ΠΎΠ²Π°Ρ Π²Π΅ΡΡΠΈΡ TOAST-Π΄Π°Π½Π½ΡΡ ;
- Π‘ΡΠ°ΡΠ°Ρ Π²Π΅ΡΡΠΈΡ ΠΏΠΎΠΌΠ΅ΡΠ°Π΅ΡΡΡ ΠΊΠ°ΠΊ Π½Π΅Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½Π°Ρ, Π½ΠΎ ΠΌΠ΅ΡΡΠΎ Π½Π΅ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π΅ΡΡΡ;
- ΠΠ»Ρ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π΅Π½ΠΈΡ ΠΌΠ΅ΡΡΠ° ΡΡΠ΅Π±ΡΠ΅ΡΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ
VACUUM.
- ΠΠ½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎΠ΅ ΡΠ²Π΅Π»ΠΈΡΠ΅Π½ΠΈΠ΅ ΡΠ°Π·ΠΌΠ΅ΡΠ° TOAST-ΡΠ°Π±Π»ΠΈΡΡ ΠΈΠ·-Π·Π° ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΠΈ ΠΌΠ΅Ρ
Π°Π½ΠΈΠ·ΠΌΠ° TOAST:
-
ΠΠ±ΡΠΈΠ΅ Π²ΡΠ²ΠΎΠ΄Ρ:
- Π§Π°ΡΡΡΠ΅ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ Π±ΠΎΠ»ΡΡΠΈΡ JSONB-ΠΏΠΎΠ»Π΅ΠΉ ΠΌΠΎΠ³ΡΡ Π²ΡΠ·Π²Π°ΡΡ ΡΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎΠ΅ "ΡΠ°Π·ΡΠ°ΡΡΠ°Π½ΠΈΠ΅" (bloating) TOAST-ΡΠ°Π±Π»ΠΈΡ;
- ΠΠ»Ρ Π±Π°Π· Π΄Π°Π½Π½ΡΡ
Ρ Π°ΠΊΡΠΈΠ²Π½ΡΠΌΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡΠΌΠΈ Π±ΠΎΠ»ΡΡΠΈΡ
JSON-Π΄Π°Π½Π½ΡΡ
Π²Π°ΠΆΠ½ΠΎ ΡΠ΅Π³ΡΠ»ΡΡΠ½ΠΎ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ
VACUUM; - ΠΡΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ ΡΡΡΡΠΊΡΡΡΡ Π΄Π°Π½Π½ΡΡ ΡΡΠΎΠΈΡ Π²ΡΠ½ΠΎΡΠΈΡΡ ΡΠ°ΡΡΠΎ ΠΎΠ±Π½ΠΎΠ²Π»ΡΠ΅ΠΌΡΠ΅ ΠΏΠΎΠ»Ρ Π² ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠ΅ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ, Π΅ΡΠ»ΠΈ ΡΡΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ.
ΠΡΠΎΡ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½Ρ Π½Π°Π³Π»ΡΠ΄Π½ΠΎ Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΡΠ΅Ρ ΠΎΠ΄Π½Ρ ΠΈΠ· Π²Π°ΠΆΠ½ΡΡ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΠ΅ΠΉ ΡΠ°Π±ΠΎΡΡ Ρ JSONB Π² PostgreSQL ΠΈ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ ΠΏΠΎΠ½ΡΡΡ, ΠΏΠΎΡΠ΅ΠΌΡ ΡΠ°ΡΡΡΠ΅ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ Π±ΠΎΠ»ΡΡΠΈΡ JSON-Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΎΠ² ΠΌΠΎΠ³ΡΡ Π²ΡΠ·ΡΠ²Π°ΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡΡ ΠΈ Π΄ΠΈΡΠΊΠΎΠ²ΡΠΌ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎΠΌ.
Π Ρ ΠΎΠ΄Π΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ Π·Π°Π΄Π°Π½ΠΈΡ Π±ΡΠ»ΠΈ ΠΏΡΠΎΠ²Π΅Π΄Π΅Π½Ρ ΠΊΠΎΠΌΠΏΠ»Π΅ΠΊΡΠ½ΡΠ΅ ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΡ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΠ΅ΠΉ ΡΠ°Π±ΠΎΡΡ Ρ JSONB-Π΄Π°Π½Π½ΡΠΌΠΈ Π² PostgreSQL ΠΈ ΠΏΠΎΠ»ΡΡΠ΅Π½Ρ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΠΊΠ»ΡΡΠ΅Π²ΡΠ΅ Π²ΡΠ²ΠΎΠ΄Ρ:
-
ΠΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ JSONB Π½Π°ΠΏΡΡΠΌΡΡ Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ ΡΠ°Π·ΠΌΠ΅ΡΠ° Π΄Π°Π½Π½ΡΡ :
- ΠΠ»Ρ Π΄Π°Π½Π½ΡΡ Π΄ΠΎ 2KB (inline Ρ ΡΠ°Π½Π΅Π½ΠΈΠ΅) ΡΡΠ΅Π΄Π½Π΅Π΅ Π²ΡΠ΅ΠΌΡ Π΄ΠΎΡΡΡΠΏΠ° ΡΠΎΡΡΠ°Π²ΠΈΠ»ΠΎ ΠΎΠΊΠΎΠ»ΠΎ 5844 Π½Π°Π½ΠΎΡΠ΅ΠΊΡΠ½Π΄;
- ΠΠ»Ρ Π΄Π°Π½Π½ΡΡ Π±ΠΎΠ»Π΅Π΅ 2KB (TOAST Ρ ΡΠ°Π½Π΅Π½ΠΈΠ΅) Π²ΡΠ΅ΠΌΡ Π΄ΠΎΡΡΡΠΏΠ° ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°Π΅ΡΡΡ Π΄ΠΎ 37476 Π½Π°Π½ΠΎΡΠ΅ΠΊΡΠ½Π΄ (~6.4 ΡΠ°Π· ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅);
- ΠΠΎΡΠ»Π΅ ΠΏΠΎΡΠΎΠ³Π° Π² 2KB Π½Π°Π±Π»ΡΠ΄Π°Π΅ΡΡΡ Π»ΠΈΠ½Π΅ΠΉΠ½Π°Ρ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡ ΡΠΊΠΎΡΠΎΡΡΠΈ ΠΎΡ ΡΠ°Π·ΠΌΠ΅ΡΠ° Π΄Π°Π½Π½ΡΡ .
-
ΠΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ TOAST Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ Π²Π»ΠΈΡΠ΅Ρ Π½Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π΄ΠΈΡΠΊΠΎΠ²ΠΎΠ³ΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π° ΠΏΡΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡΡ :
- ΠΡΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΈ Π½Π΅Π±ΠΎΠ»ΡΡΠΈΡ JSONB-ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² (inline) ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΡΠ°Π·ΠΌΠ΅ΡΠ° Π±Π°Π·Ρ Π½Π΅Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΈΠ»ΠΈ ΠΎΡΡΡΡΡΡΠ²ΡΠ΅Ρ Π²ΠΎΠ²ΡΠ΅;
- ΠΡΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΈ Π±ΠΎΠ»ΡΡΠΈΡ JSONB-ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² (TOAST) Π½Π°Π±Π»ΡΠ΄Π°Π΅ΡΡΡ ΡΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎΠ΅ ΡΠ²Π΅Π»ΠΈΡΠ΅Π½ΠΈΠ΅ ΡΠ°Π·ΠΌΠ΅ΡΠ° TOAST-ΡΠ°Π±Π»ΠΈΡΡ;
- ΠΡΠΎ ΠΏΡΠΎΠΈΡΡ
ΠΎΠ΄ΠΈΡ ΠΈΠ·-Π·Π° ΡΡΡΠ°ΡΠ΅Π³ΠΈΠΈ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΏΡΠΈ Π·Π°ΠΏΡΠΎΡΠ΅: ΡΡΠ°ΡΠ°Ρ Π²Π΅ΡΡΠΈΡ ΠΎΡΡΠ°ΡΡΡΡ Π² TOAST-ΡΠ°Π±Π»ΠΈΡΠ΅ Π΄ΠΎ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ
VACUUM.
-
Π Π°Π·Π»ΠΈΡΠ½ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΡ ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ JSONB ΠΈΠΌΠ΅ΡΡ ΡΠ°Π·Π½ΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ:
- ΠΠΏΠ΅ΡΠ°ΡΠΎΡ Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ
@>Ρ ΠΈΠ½Π΄Π΅ΠΊΡΠΎΠΌGIN(jsonb_path_ops)ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎ; - ΠΠ±ΡΠ°ΡΠ΅Π½ΠΈΠ΅ ΠΊ Π³Π»ΡΠ±ΠΎΠΊΠΎ Π²Π»ΠΎΠΆΠ΅Π½Π½ΡΠΌ ΠΏΠΎΠ»ΡΠΌ ΡΠ΅ΡΠ΅Π· ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΡ
->ΠΈ->>ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΡΠΌ Π΄Π»Ρ Π±ΠΎΠ»ΡΡΠΈΡ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΎΠ²; - JSONPath ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ Π±ΠΎΠ»Π΅Π΅ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΡΠΉ ΠΈ Π΄Π΅ΠΊΠ»Π°ΡΠ°ΡΠΈΠ²Π½ΡΠΉ ΡΠΏΠΎΡΠΎΠ± ΡΠ°Π±ΠΎΡΡ Ρ Π²Π»ΠΎΠΆΠ΅Π½Π½ΡΠΌΠΈ ΡΡΡΡΠΊΡΡΡΠ°ΠΌΠΈ.
- ΠΠΏΠ΅ΡΠ°ΡΠΎΡ Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ
PostgreSQL Ρ Π΅Π³ΠΎ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΎΠΉ JSONB ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΌΠΎΡΠ½ΡΠΉ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΉ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ ΡΠΎ ΡΠ»Π°Π±ΠΎΡΡΡΡΠΊΡΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌΠΈ Π΄Π°Π½Π½ΡΠΌΠΈ, ΠΎΠ΄Π½Π°ΠΊΠΎ Π΄Π»Ρ Π΄ΠΎΡΡΠΈΠΆΠ΅Π½ΠΈΡ ΠΎΠΏΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠΉ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°ΡΡ Π²Π½ΡΡΡΠ΅Π½Π½ΠΈΠ΅ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΡ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ ΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΡΠ°ΠΊΠΈΡ Π΄Π°Π½Π½ΡΡ ΠΈ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ.
