Skolkovoã§éå¬ãããHigload ++ 2017ã§ãåœç€Ÿã®Postgres Professionalã¯ããã·ã¥ãã£ã€ã¯ã®åŸæ¥ã®é
åžã§ã¯ã€ãºãéå¬ããŸãããããã¯ã2æã®
PgConf.Russia 2018ã®ãã±ããã§ããã
ãã®èšäºã§ã¯ãã¯ã€ãºã®è³ªåã調ã¹ãŸãã

1. SELECT * FROMãŠãŒã¶ãŒWHERE lowerïŒnameïŒ= 'vasya'ã¯ãšãªãå¹æçã«å®è¡ã§ããã®ã¯ã©ã®ã¿ã€ãã®ã€ã³ããã¯ã¹ã§ããïŒ
PostgreSQLã®loweré¢æ°ã¯ãæååãå°æåã«ãã£ã¹ãããŸãã
aïŒéšåç
bïŒæ©èœ
cïŒã«ããŒ
dïŒäºæ¬¡
å€ãã®äººã¯ããã®ã¯ãšãªãã¯ãšãªã§äœ¿çšããã
lower(name)
åŒã䜿çšããŠæ©èœã€ã³ããã¯ã¹ãå®è¡ããã®ã«åœ¹ç«ã€ãšæšæž¬ããŸããã
CREATE INDEX ON users ( lower(name) );
ãã ããã¯ã€ãºã®åè
ã®1人ã ããã
éšåã€ã³ããã¯ã¹ CREATE INDEX ON users ( somefield) WHERE lower(name) = 'vasya' ;
somefield
ã¯
users
ããŒãã«ã®ä»»æã®ãã£ãŒã«ãã§ãæå¹ã§ãã
citextããŒã¿åã䜿çšããŠãã³ã³ããã¹ãã«äŸåããªãæååãæŽçããããšãã§ããŸãã
2.次ã®ãªã¹ãã®ã©ã®ã¿ã€ãã®ã€ã³ããã¯ã¹ã¯ååšããŸãããïŒ
aïŒéšåç
bïŒäºæ¬¡
cïŒéäŒ
dïŒæ©èœ
æ£è§£ã¯ãéãããã§ãã ã«ããŒããã€ã³ããã¯ã¹ã¯ãã§ã«ååšããã¯ããŒãºããã€ã³ããã¯ã¹ã¯ãŸã äœæè
ãåŸ
ã£ãŠããŸãã ããªãã¯äžã€ã«ãªããïŒ
ãªã¯ãšã¹ãã®ã«ããªã³ã°ã€ã³ããã¯ã¹ã¯ããã®ãªã¯ãšã¹ããå®è¡ããã®ã«ååãªããŒã¿ãå«ãã€ã³ããã¯ã¹ã§ãã
æçšãªã«ããªã³ã°ã€ã³ããã¯ã¹ãç°¡åã«äœæã§ããããã«ããããã«ã
CREATE INDEX...INCLUDE
ã³ã³ã¹ãã©ã¯ããPostgreSQLçšã«éçºãããŸããã ããã«ã€ããŠã¯ãPostgreSQLã®ãã®æ©èœã®äœæè
ã§
ããAnastasia LubennikovaãšIvan Frolkovã®ãã¬ãŒã³ããŒã·ã§ã³ã§èªãããšãã§ããŸãã ãããŸã§ã®ãšãããã³ãã¥ããã£ããŒãžã§ã³ã«ã¯å«ãŸããŠããããPostgres Proã§ã®ã¿äœ¿çšã§ããŸãã
INCLUDE
ã³ã³ã¹ãã©ã¯ãã®æ¬è³ªã¯ãã€ã³ããã¯ã¹ã®ã¿ã®ã¹ãã£ã³ã®é©çšæ§ãæ¡åŒµããè¿œå ã®ïŒããŒã§ã¯ãªãïŒæ
å ±ãã€ã³ããã¯ã¹ã«è¿œå ããããšã§ãã ç°¡åãªäŸã§åœŒã®ä»äºã説æããŸãã
ã€ã³ããã¯ã¹ã®ã¿ã®ã¹ãã£ã³ã¯ãçµæãå€æããã®ã«ååãªæ
å ±ãã€ã³ããã¯ã¹ã«ããå Žåã«ã¯ãšãªå®è¡ã¢ãŒãã§ãããããŒãã«èªäœã調ã¹ãå¿
èŠã¯ãããŸããã
yã«ãã£ãŒã«ããšã€ã³ããã¯ã¹ãå«ãŸããããŒãã«ãçšæããŸãã
CREATE TABLE users ( name text, score int ); REATE INDEX users_name_score ON users ( name, score );
ã¯ãšãªãããŒãã«ã§å®è¡ãããå Žå
SELECT name, score FROM users WHERE name = 'vasya';
ãã®ã¯ãšãªã¯ãã€ã³ããã¯ã¹ã®ã¿ã®ã¹ãã£ã³ã¢ãŒãã§å®è¡ã§ããŸãã
ã¿ã¹ã¯ãè€éã«ããŸãããã
name
ãã£ãŒã«ãã®äžææ§ãå¶åŸ¡ããå¿
èŠããããŸãã
ãã®ããã
users_name_score
ã€ã³ããã¯ã¹
users_name_score
é©åã§
users_name_score
ãŸããã
UNIQUE
ãã©ã¡ãŒã¿ãŒãå®çŸ©ã«è¿œå ãããšããã£ãŒã«ãã®ãã¢ïŒ
name, score
ïŒã®äžææ§ãå¶åŸ¡ãããŸãã
ååãã£ãŒã«ãã«å¥åã®äžæã®ã€ã³ããã¯ã¹ãäœæã§ããŸãããããã¯ãªãœãŒã¹ã倧éã«æ¶è²»ãããããããã§ã¯ã«ããŒã€ã³ããã¯ã¹ã圹ç«ã¡ãŸãã
CREATE UNIQUE INDEX ON users ( name ) INCLUDE ( score );
ããã§ãã¹ã³ã¢ãã£ãŒã«ãã®å€ã¯ã€ã³ããã¯ã¹ã«è¿œå ãããŸãããããŒéšåã«ã¯è¿œå ãããŸãããããã«ããã1ã€ã®ã€ã³ããã¯ã¹ã§2ã€ã®åé¡ã解決ã§ããŸãã
3.次ã®ãªã¹ãã®ãã¡ãã€ã³ããã¯ã¹ã§ã¯ãªããã®ã¯ã©ãã§ããïŒ
aïŒããã·ã¥
bïŒãžã³
cïŒãŠã€ã¹ããŒ
dïŒã©ã
WHISKEYã€ã³ããã¯ã¹ã¯ãŸã ãããŸããã ãããäœãæå³ããã®ãèããŠã¿ãŠãã ããã ç¹å®ã®ããŒãªãïŒ ãšããã§ãRUMãã©ã®çšåºŠæ£ç¢ºã«åŸ©å·åããããã¯ãŸã 決å®ãããŠããŸããã
PostgreSQLã«ã¯é·ãé
Hashã®ãããªã€ã³ããã¯ã¹ããããŸããããå®éã«ã¯ãWALãã°ã®ãµããŒããã€ãã«ç»å Žãã10çªç®ã®ããŒãžã§ã³ãããã䜿çšã§ããŸããã BããªãŒãšæ¯èŒããŠãHASHã€ã³ããã¯ã¹ã®æå¹æ§ã«ã¯å€§ããªçåããããŸããã
GINïŒGeneralized Inverse iNdexïŒã¯ãOleg BartunovãšFedor Sigaevã«ãã£ãŠéçºãããäžè¬åãããéã€ã³ããã¯ã¹ã§ãã 圌ã®ããã€ã¹ã«é¢ãã詳现ã¯
Yegor Rogovã®èšäºã«æžãããŠã
ãŸã ã å
šææ€çŽ¢ãã€ã³ããã¯ã¹é
åãJSONããã³JSONBã«é©ããŠããŸãã
RUMã¯ãå
šææ€çŽ¢ãé«éåããããã«Postgres Professionalã«ãã£ãŠéçºãããæ°ããã¿ã€ãã®ã€ã³ããã¯ã¹ã§ãã
RUM㯠Postgres Pro Enterpriseã«å«ãŸããŠ
ããæ¡åŒµæ©èœã«å®è£
ãããŠããŸããããã®ãœãŒã¹ã¯ãªãŒãã³ãœãŒã¹ã§ããã
githubã§å
¥æã§ããŸãã RUMã¯ãããŒã¿ãå€æŽããå ŽåãGINãããããã«éãã§ãããã€ã³ããã¯ã¹ã«è¿œå æ
å ±ãä¿åããããšã§æ€çŽ¢ãé«éåã§ããŸãã
4. ACIDã§æåIã®å®è¡ãä¿èšŒãããã®ã¯äœã§ããïŒ
aïŒãã©ã³ã¶ã¯ã·ã§ã³ãã°
bïŒMVCC
cïŒå€éšããŒ
dïŒå
±æããŒãžãã£ãã·ã¥
æ£è§£ã¯MVCCïŒMultiVersion Concurrency ControlïŒã§ãã ACID-DBMSããã€ã¹ã®ååãã¢ãããã¯æ§ãäžè²«æ§ãåé¢ãèä¹
æ§ãæå³ããç¥èªã ãã®åé¡ã§ã¯ãI-ãã©ã³ã¶ã¯ã·ã§ã³åé¢ã«èå³ãããããããå®çŸããããã«ãã«ãããŒãžã§ã³æ§ã䜿çšãããŸãã åæç¹ã§ãå¿
èŠãªæ°ã®ããŒã¿ããŒã¹å
ã®åã¬ã³ãŒãã®ããŒãžã§ã³ããããããåãã©ã³ã¶ã¯ã·ã§ã³ã¯ããã«å¯ŸããŠæ£ããããŒãžã§ã³ãèŠãããšãã§ããŸãã ããšãã°ãMVCCã®ãããã§ãã¬ã³ãŒããå€æŽããUPDATEã®ãã©ã³ã¶ã¯ã·ã§ã³ã¯ãä»ã®å
šå¡ãåãã¬ã³ãŒããèªã¿åãããšã劚ããŸããã 誰ãå¿
èŠãšããªãå€ãããŒãžã§ã³ã¯ãç¹å¥ãªããã¥ãŒã ããã»ã¹ïŒ
ç空 ïŒã§åé€ãããŸãã ã»ãšãã©ã®ãªã¬ãŒã·ã§ãã«ããŒã¿ããŒã¹ã·ã¹ãã ã§
㯠ã
競äºåã®ããããŒã¿
ã¢ã¯ã»ã¹ã«ãããã©ã³ã¶ã¯ã·ã§ã³åé¢ãä¿èšŒãããã«ãããŒãžã§ã³æ§
ã 䜿çšãããŠããŸãã
5.è«çè€è£œã¯åæã§ããŸããïŒ
PostgreSQL 10ã¯
è«çè€è£œãå
¬ââåŒã«å°å
¥ããŸããã åæã¢ãŒãã§æ©èœããã«ã¯ã
CREATE SUBSCRIPTION
ã³ãã³ãã§å®çŸ©ããããµãã¹ã¯ãªãã·ã§ã³åããŠã£ã¶ãŒãã®
synchronous_standby_names
ãã©ã¡ãŒã¿ãŒã§æå®ããå¿
èŠããããŸãã
6.ãŠãŒã¶ãŒXã¯ããŠãŒã¶ãŒYãäœæããäžæããŒãã«ãèŠã€ããããšãã§ããŸããïŒ ãããããªããã©ã®ããã«ãããã§ãªããã°-ãªãïŒ
ãã¶ã äžæããŒãã«ã¯éåžžã®ããŒãã«ãšã»ãŒåãæ¹æ³ã§é
眮ãããç¹å¥ãªã¹ããŒã ã®ã¿ãå²ãåœãŠãããŸãïŒãŠãŒã¶ãŒã»ãã·ã§ã³ããšã«1ã€ïŒã
SELECT nspname, ( SELECT json_agg(json_build_object('name',relname, 'owner', rolname)) FROM pg_class JOIN pg_roles ON pg_roles.oid = relowner WHERE relnamespace = pg_namespace.oid ) FROM pg_namespace WHERE nspname LIKE 'pg_temp%';
ãã®ã¯ãšãªã䜿çšãããšãã·ã¹ãã å
ã®ãã¹ãŠã®äžæããŒãã«ãšãããã®äœæè
ã確èªã§ããŸãã
7.ã¹ãã¢ãããã·ãŒãžã£ãæãè¿
éã«å®è¡ããããã«ãã©ã®èšèªã§èšè¿°ããå¿
èŠããããŸããïŒ
ããªãã¯ã®è³ªåã ãã¡ãããæéã¯Cã§ããããããSQLã®æ¹ãéãå ŽåããããŸãã SQLã®é¢æ°ã¯ããããåŒã³åºãã¯ãšãªã«å«ããŠãæé©åããããšãã§ããŸãã
Ivan Frolkovã®èšäºã§ãSQLã®é¢æ°ã®ãã®ããããã£ã®è©³çŽ°ïŒPL /
PGSQLãšæ··åããªãã§ãã ããïŒãèªãããšãã§ããŸãã
äžè¬çãªæç¶ãåèšèªã®äžã§ãPL / PgSQLã¯æéã§ã¯ãããŸããã å Žåã«ãã£ãŠã¯ãPL / PerlãŸãã¯PL / Pythonãããã«ã¯PL / v8ãèããé«éã§ãã ããã·ãŒãžã£ãããŒã¿ããŒã¹ã®æäœã ãã§ãªããã³ã³ãã¥ãŒãã£ã³ã°ãããŒã¿åŠçã«ãé¢äžããŠããå Žåãéãã¯ç¹ã«é¡èã«èŠããŸãã
æç¶ãåèšèªã®æ¯èŒã«é¢ãã質åã«ã€ããŠã¯ããããã®ããã¥ã¡ã³ãïŒ
PL / Perl ã
PL / Python ã
PL / v8 ïŒããã³
Ivan Panchenkoã®ã¬ããŒããåç
§ã§ããŸãã
8.èŠæ±ã§é¢æ°FãåŒã³åºãããåæ°
SELECT F(a%a) FROM generate_series(-1,1) a
ïŒ
æ£è§£ã¯1åã§ãã åŒ
a%a
ã¯ãå€æ°
a
ãããèªäœã§å²ã£ãäœããååŸ
a%a
ããšãæå³ããŸãã ãŒãã§é€ç®ããããšã¯äžå¯èœã§ããããã2åç®ã®å埩ã§èŠæ±ã¯å€±æããŸãã ãããã£ãŠãå€æ°
a
æåã®å€ã®ã¿ãé¢æ°
F
ãã€ãã¹1ã«ãªããŸãã
ããã¥ã¡ã³ã㧠generate_series
é¢æ°ã«ã€ããŠèªãããšãã§ã
ãŸã ã
9. SELECT t.abc FROM tãèŠæ±ããŸãã æåããŸãããããŒãã«tã«ã¯åabcããããŸããïŒtã¯å®éã«ã¯ããŒãã«ã§ãïŒã ããã¯ã©ã®ããã«å¯èœã§ããããµã³ãã«ã®abcåã«äœã衚瀺ãããŸããïŒ
ããã¯ãé¢æ°
abc(t%rowtype)
ããå Žåã«å¯èœã§ãã ãã®å Žåã®è¡šèš
t.abc
ã¯ãè¡šèš
abc(t)
ãšåçã§ãã ããã¯
ææžåãããæ©äŒã§ãããpostgresã«ããã客芳æ§ã®çè·¡ã§ãã
10. PostgreSQLã€ã³ã¹ã¿ã³ã¹ã¯fsync = offãã©ã¡ãŒã¿ãŒã䜿çšããŠåäœãïŒãããè¡ãããšã¯ãå§ãããŸããïŒãããŒã¿ããŒã¹ã«ã¢ã¯ãã£ãã«æžã蟌ã¿ãè¡ãã»ãã·ã§ã³ãæäŸããŸãã OOMã®æäžã«ããã©ãŒãããã¯ãšã³ãã®1ã€ã殺ããããã«å¿ããŠãã¹ããã¹ã¿ãŒãã€ã³ã¹ã¿ã³ã¹å
šäœã殺ããŸããã ãã®åŸãPostgreSQLã€ã³ã¹ã¿ã³ã¹ãåèµ·åãããŸããã å埩ããã»ã¹ã¯ã©ã®ããã«çµäºããŸããïŒ
ã»ãšãã©ã®åå è
ã¯ã
fsync=off
ãéåžžã«æªãããšãç¥ã£ãŠããŸããã倱æãããšãããŒã¿ã倱ãå¯èœæ§ããããŸãã ããããã©ã®ãããªå€±æã§ïŒ
fsync
ã¯OSãããã¡ããã£ã¹ã¯ã«ãã©ãã·ã¥ããŠããŸãã OSãããã¡ãŒããã£ã¹ã¯ã«ãã©ãã·ã¥ã§ããªãã®ã¯ãã€ã§ããïŒ ãã¡ãããOSã®ã«ãŒãã«ã®æ©èœãäžæããããšãã ããšãã°ãããŒããŠã§ã¢é害äžã ã¿ã¹ã¯ã®ç¶æ
ã§ã¯ãOSã¯æ£åžžã«æ©èœããŸãããããã£ãŠããã£ã¹ã¯äžã®ããŒã¿ããã©ãã·ã¥ããã次ã«postgresãéå§ããããšãããŒã¿ããŒã¹ãWALãã埩å
ãããããšãæåŸ
ããããããçç±ããããŸãã
è¬èŸ
Ivan FrolovãAlexander AlekseevãArseniy SherãIvan Panchenkoã質çå¿çã®æºåã«åå ããŸããã ãããŠããã¡ãããHighLoad ++ãšãã®ãªãŒã¬ãã€ã¶ãŒã«åãããã称è³ãæãããšã¯é¿ããããŸããã ãã€ãã®ããã«ããããã£ãããšã¯æé«ã§ããã æ¬åœã®äŒæ¥ã

ã¯ã€ãºçµæ
ã¯ã€ãºã®è³ªåã«ã¯50人ã®Highloadåå è
ãåçããŸããã ãã®çµæã2018幎2æ5ã7æ¥ã«ã¢ã¹ã¯ã¯ã§äºå®ãããŠãã
PgConf.Russia 2018äŒè°ãžã®7ã€ã®ç¡ææåŸ
ãè¡ãããŸããã