1.ãã«ããã¹ã¿ãŒã¯ã©ã¹ã¿ãŒ
Postgres Pro EnterpriseããŒãžã§ã³ã§ã®ã¿äœ¿çšå¯èœãª
multimaster
æ¡åŒµæ©èœãšã«ãŒãã«ã§ã®ãã®ãµããŒãã«ãããé«å¯çšæ§ãµãŒããŒã®ã¯ã©ã¹ã¿ãŒãæ§ç¯ã§ããŸãã åãã©ã³ã¶ã¯ã·ã§ã³ã®åŸãã°ããŒãã«ãªæŽåæ§ïŒã¯ã©ã¹ã¿ãŒå
šäœã®ããŒã¿æŽåæ§ïŒãä¿èšŒãããŸãã åããŒãã§ããŒã¿ã¯åäžã«ãªããŸãã åæã«ãããŒãæ°ã®å¢å ã«äŒŽã£ãŠèªã¿åãããã©ãŒãã³ã¹ãçŽç·çã«ã¹ã±ãŒãªã³ã°ããããšãç°¡åã«å®çŸã§ããŸãã
ããã©PostgreSQLã§ã¯ãã¹ããªãŒãã³ã°ã¬ããªã±ãŒã·ã§ã³ã䜿çšããŠã¢ã¯ã»ã¹ããããã¯ã©ã¹ã¿ãŒãæ§ç¯ã§ããŸãããé害ãçºçããããŒããç¹å®ããé害åŸã«ããŒãã埩å
ããã«ã¯ããµãŒãããŒãã£ã®ãŠãŒãã£ãªãã£ãšç¬åµçãªã¹ã¯ãªãããå¿
èŠã§ãã
multimaster
ã¯ç¬èªã«ãããè¡ããå€éšãŠãŒãã£ãªãã£ããµãŒãã¹ã䜿çšããã«ãã®ãŸãŸåäœããŸãã
ããã©
PostgreSQL
èªã¿åãã¹ã±ãŒãªã³ã°ã¯ããããã¹ã¿ã³ãã€ã¢ãŒãã§ã®ã¬ããªã±ãŒã·ã§ã³ã§
PostgreSQL
å¯èœã§ãããéèŠãªæ³šæäºé
ããããŸããã¢ããªã±ãŒã·ã§ã³ã¯ã
read-write
read-only
ã¯ãšãªãš
read-write
ã¯ãšãªãåé¢ã§ããå¿
èŠããããŸãã ã€ãŸããããã©ã¯ã©ã¹ã¿ã§äœæ¥ããã«ã¯ãã¢ããªã±ãŒã·ã§ã³ãæžãçŽãå¿
èŠããããŸããå¯èœã§ããã°ãèªã¿åãå°çšãã©ã³ã¶ã¯ã·ã§ã³çšã«ããŒã¿ããŒã¹ãžã®åå¥ã®æ¥ç¶ã䜿çšãããããã®æ¥ç¶ããã¹ãŠã®ããŒãã«åæ£ããŸãã
multimaster
åããã¯ã©ã¹ã¿ãŒã®å Žåãä»»æã®ããŒãã«æžã蟌ãããšãã§ãããããããŒã¿ããŒã¹æ¥ç¶ãæžã蟌ã¿æ¥ç¶ãšèªã¿åãæ¥ç¶ã®ã¿ã«åå²ããŠãåé¡ã¯ãããŸããã ã»ãšãã©ã®å Žåãã¢ããªã±ãŒã·ã§ã³ãæžãæããå¿
èŠã¯ãããŸããã
ãã©ãŒã«ããã¬ã©ã³ã¹ã確ä¿ããã«ã¯ãã¢ããªã±ãŒã·ã§ã³ã
reconnect
ã§ããå¿
èŠããããŸãã éåãçºçããå ŽåãããŒã¿ããŒã¹ãšã®æ¥ç¶ã埩å
ããããšããŸãã ããã¯ãããã©ã¯ã©ã¹ã¿ãš
multimaster
äž¡æ¹ã«é©çšãããŸãã
ããã©
PostgreSQL
è«çã¬ããªã±ãŒã·ã§ã³ã䜿çšãããšãéåæã®åæ¹åã¬ããªã±ãŒã·ã§ã³ïŒããšãã°ã
2ndQuadrantã® BDR
ïŒãå®è£
ã§ããŸãããããã¯ã°ããŒãã«ãªæŽåæ§ãæäŸããã競åã解決ããå¿
èŠããããããã¯å
éšããžãã¯ã«åºã¥ããŠã¢ããªã±ãŒã·ã§ã³ã¬ãã«ã§ã®ã¿å®è¡ã§ããŸãã ã€ãŸãããããã®åé¡ã¯ã¢ããªã±ãŒã·ã§ã³ããã°ã©ãã«æž¡ãããŸãã
multimaster
èªäœããã©ã³ã¶ã¯ã·ã§ã³åé¢ãæäŸããŸãïŒ
Repeatable Read
ããã³
Read Committed
ãã©ã³ã¶ã¯ã·ã§ã³åé¢ã¬ãã«ãå®è£
ãããŸããããã©ã³ã¶ã¯ã·ã§ã³ã®ã³ãããäžããã¹ãŠã®ã¬ããªã«ã¯äžè²«æ§ãããããŠãŒã¶ãŒã¢ããªã±ãŒã·ã§ã³ã¯åãç¶æ
ã«ãªããŸããããŒã¹ã¯ã圌ååŒãéå§ãããªãããããè¡ããšãããŒãã«é害ãçºçããå Žåã«äºæž¬å¯èœãªå¿çæéãåŸãããã«èŠæ±ããŠããè»ã®çš®é¡ãç¥ãå¿
èŠã¯ãããŸãããæã
ã¯ã3ãã§ãŒãºã»ã³ãããã»ãã©ã³ã¶ã¯ã·ã§ã³ïŒ3çž,.å®æœããŠãã
commit protocol
ããã¯ãããŸãïŒã ã¡ã«ããºã ã¯ãããå€ãã®ããã«ãç§ãã¡ã¯ãã®ä»çµã¿ã説æãããŠãããããç¥ããã2çžãããè€éã«ãªã£ãŠãããç°¡åã«ããããã«ãäºã€ã®ããŒããããŒã2ãšåæ§ãå®éã«äžè¬ã®ããŒãã®å¶æ°ãåäœããããšã念é ã«çœ®ããŠãã¢ãªã³ã°ã瀺ããŠããŸãã
å³ 1.äœæ¥èšç»ãã«ããã¹ã¿ãŒãã©ã³ã¶ã¯ã·ã§ã³ã³ãããèŠæ±ãããŒã1ã«å°çããããŒãWALã«èšé²ãããŸãã ã¯ã©ã¹ã¿ãŒã®æ®ãã®ããŒãïŒå³ã®ããŒã2ïŒã¯ãè«çã¬ããªã±ãŒã·ã§ã³ãããã³ã«ã䜿çšããŠããŒã¿å€æŽã«é¢ããæ
å ±ãåãåãããã©ã³ã¶ã¯ã·ã§ã³ã³ããããæºåããèŠæ±ãåãåããšãå€æŽãé©çšããŸãïŒã³ããããªãïŒã ãã®åŸããã©ã³ã¶ã¯ã·ã§ã³ãéå§ããããŒãã«ããã©ã³ã¶ã¯ã·ã§ã³ãã³ãããããæºåãã§ããããšãéç¥ããŸãïŒ
transaction prepared
ïŒã å°ãªããšã1ã€ã®ããŒããå¿çããŠããªãå Žåããã©ã³ã¶ã¯ã·ã§ã³ã¯ããŒã«ããã¯ãããŸãã ãã¹ãŠã®ããŒã
precommit
è¯å®çã«
precommit
å ŽåãããŒã1ã¯ããã©ã³ã¶ã¯ã·ã§ã³ãã³ãããã§ãããšããã¡ãã»ãŒãžãããŒãã«éä¿¡ããŸãïŒãã©ã³ã¶ã¯ã·ã§ã³ã®
precommit
ã³ãããïŒã
ããã¯ã2ãã§ãŒãºãã©ã³ã¶ã¯ã·ã§ã³ãšã®éãã§ãã ãã®ã¢ã¯ã·ã§ã³ã¯äžèŠäœåã«èŠãããããããŸããããå®éã«ã¯ããã¯éèŠãªãã§ãŒãºã§ãã 2ãã§ãŒãºãã©ã³ã¶ã¯ã·ã§ã³ã®å ŽåãããŒãã¯ãã©ã³ã¶ã¯ã·ã§ã³ãèšé²ãããã©ã³ã¶ã¯ã·ã§ã³ãéå§ããæåã®ããŒãã«å ±åããŸãã ãã®æç¹ã§æ¥ç¶ãåæãããå ŽåãããŒã2ã§ã®ãã©ã³ã¶ã¯ã·ã§ã³ã®æå/倱æã«ã€ããŠäœãç¥ããªãããŒã1ã¯ãæŽåæ§ãç¶æããããã«äœããã¹ãããæããã«ãªããŸã§åçãåŸ
ã€å¿
èŠããããŸãïŒãã©ã³ã¶ã¯ã·ã§ã³ãããŒã«ããã¯ãŸãã¯ã³ãããïŒãŸãã¯ã³ãããïŒãªã¹ã¯ã䌎ããŸãïŒã ãããã£ãŠã3ãã§ãŒãºã¹ããŒã ã§ã¯ã2çªç®ã®ãã§ãŒãºã§ããã¹ãŠã®ããŒããæ祚ããŸãïŒãã©ã³ã¶ã¯ã·ã§ã³ãã³ããããããã©ããã ã»ãšãã©ã®ããŒããã³ãããã®æºåãã§ããŠããå Žåãã¢ãŒãã¿ãŒã¯ãã©ã³ã¶ã¯ã·ã§ã³ãã³ããããããããšããã¹ãŠã®ããŒãã«éç¥ããŸãã ããŒã1ã¯ããã©ã³ã¶ã¯ã·ã§ã³ã
commit
ããè«çã¬ããªã±ãŒã·ã§ã³
commit
ä»ããŠ
commit
ãéä¿¡ãããã©ã³ã¶ã¯ã·ã§ã³ã³ãããã¿ã€ã ã¹ã¿ã³ããå ±åããŸãïŒãã¹ãŠã®ããŒããèªã¿åãèŠæ±ã®ãã©ã³ã¶ã¯ã·ã§ã³åé¢ãç¶æããå¿
èŠããããŸããå°æ¥ãã¿ã€ã ã¹ã¿ã³ãã¯
CSN
ãã©ã³ã¶ã¯ã·ã§ã³ã³ãããèå¥åã
Commit Sequence Number
眮ãæããããŸãïŒã ããŒããå°æ°ã§ããå Žåãæžã蟌ã¿ãèªã¿åããã§ããŸããã æ¥ç¶ãåæãããŠããæŽåæ§ã®éåã¯çºçããŸããã
å°æ¥çã«
multimaster
ã¢ãŒããã¯ãã£ãéžæããŸãããå¹ççãªã·ã£ãŒãã£ã³ã°ã®éçºã«åãçµãã§ããŸãã ããŒãã«ãåæ£ããããšïŒã€ãŸããããŒãäžã®ããŒã¿ãæ¢ã«ç°ãªãå ŽåïŒãã¯ã©ã¹ã¿ãŒã®ãã¹ãŠã®ããŒãã«ãã¹ãŠã®ããŒã¿ã䞊è¡ããŠæžã蟌ãå¿
èŠããªããããèªã¿åãã ãã§ãªãæžã蟌ã¿ã«ãã£ãŠãã¹ã±ãŒãªã³ã°ããããšãå¯èœã«ãªããŸãã ããã«ãããŒããä»ã®ããŒãã®ã¡ã¢ãªãšçŽæ¥éä¿¡ããå Žåã
RDMA
ãããã³ã«ã䜿çšããŠïŒ
InfiniBand
ã¹ã€ãããŸãã¯
RDMA
ãµããŒããããŠãã
Ethernet
ããã€ã¹ã§ïŒããŒãéã®éä¿¡æ段ãéçºã
Ethernet
ã ãã®ããããããã¯ãŒã¯ãã±ããã®ãããã³ã°ãšã¢ã³ãããã³ã°ã«è²»ããããæéãçããªããããŒã¿éä¿¡ã®é
延ãå°ãããªããŸãã å€æŽãåæãããšãã«ããŒãã¯éäžçã«éä¿¡ãããããããã«ããã¯ã©ã¹ã¿ãŒå
šäœã®ããã©ãŒãã³ã¹ãåäžããŸãã
2. 64ããããã©ã³ã¶ã¯ã·ã§ã³ã«ãŠã³ã¿ãŒ
DBMSã«ãŒãã«ã®ãã®åºæ¬çãªå€æŽã¯ãè² è·ã®é«ãã·ã¹ãã ã«ã®ã¿å¿
èŠã§ããããããã«ãšã£ãŠã¯æãŸããããšã§ã¯ãããŸããã 圌女ãå¿
èŠã§ãã
PostgreSQL
ã«ãŒãã«ã«ã¯32ãããã®ãã©ã³ã¶ã¯ã·ã§ã³ã«ãŠã³ã¿ãŒããããŸããã€ãŸãã40åãè¶
ããŠã«ãŠã³ãããããšã¯ã§ããŸããã ããã¯ããããªãŒãºã
VACUUM FREEZE
ç¹å¥ãªå®æã¡ã³ããã³ã¹æé ã«ãã£ãŠè§£æ±ºãããåé¡ã«ã€ãªãããŸãã ãã ããã«ãŠã³ã¿ãŒãé »ç¹ã«ãªãŒããŒãããŒãããšããã®æé ã®ã³ã¹ããéåžžã«é«ããªããããŒã¿ããŒã¹ã«äœããæžã蟌ãããšãã§ããªããªãå¯èœæ§ãããããŸãã ãã·ã¢ã§ã¯çŸåšã1æ¥ã«ãªãŒããŒãããŒãçºçããäŒæ¥ã·ã¹ãã ã¯ããã»ã©å€ããªããããæ¯é±ã®ééã§ãªãŒããŒãããŒããããŒã¹ã¯ãã¯ãçãããããŸããã ãªã¿ã¯ã§éå¬ããã
PGCon 2017éçºè
äŒè°ã§ã2ã3æéã§ã¡ãŒã¿ãŒã®ãªãŒããŒãããŒãçºçãã顧客ããããšè¿°ã¹ãŸããã ä»æ¥ã人ã
ã¯ä»¥åã«æšãŠãããããŒã¿ãããŒã¿ããŒã¹ã«å
¥ããåŸåããããåœæã®ãã¯ãããžãŒã®éãããæ©èœãç解ããŠåŠçããŠããŸããã çŸä»£ã®ããžãã¹ã§ã¯ãåæã«å¿
èŠãªããŒã¿ãäºåã«ããããªãããšããããããŸãã
ã«ãŠã³ã¿ãŒãªãŒããŒãããŒã®åé¡ã¯ããã©ã³ã¶ã¯ã·ã§ã³çªå·ã®ã¹ããŒã¹ãã«ãŒãããããïŒ
transaction ID wraparound
ïŒãšåŒã°ã
transaction ID wraparound
ïŒããã«ã€ããŠã¯ã
Dmitry Vasilievã® èšäºã§æ確ã«èª¬æãããŠã
ãŸã ïŒã ãªãŒããŒãããŒãããšãã«ãŠã³ã¿ãŒã¯ãŒãã«ãªã»ããããã次ã®ã©ãŠã³ãã«é²ã¿ãŸãã
å³2.ãã©ã³ã¶ã¯ã·ã§ã³ã®ããªãŒãºãåå以äžé
ããæ¹æ³ãéåžžã®
PostgreSQL
ïŒã€ãŸããæ¢ç¥ã®32ããããã©ã³ã¶ã¯ã·ã§ã³ã«ãŠã³ã¿ãŒïŒã§ã¯ããã©ã³ã¶ã¯ã·ã§ã³ã©ããã¢ã©ãŠã³ãã®åé¡ã軜æžããããã«äœããè¡ãããŸãã ãããè¡ãããã«ãããŒãžã§ã³9.6ã§ã¯ã
all-frozen
ãããã
(visibility map)
圢åŒã«è¿œå ãããããŒãžå
šäœãããªãŒãºãšããŠããŒã¯ããããããã¹ã±ãžã¥ãŒã«ãããïŒå€ãã®å€ããã©ã³ã¶ã¯ã·ã§ã³ãèç©ããïŒããã³ç·æ¥ïŒãªãŒããŒãããŒãè¿ã¥ããšïŒããªãŒãºãã¯ããã«éããªããŸãã æ®ãã®ããŒãžã§ã¯ãDBMSã¯éåžžã©ããåäœããŸãã ãã®ããããªãŒããŒãããŒåŠçäžã®ã·ã¹ãã å
šäœã®ããã©ãŒãã³ã¹ã¯äœäžããŸããããåé¡ã¯ååãšããŠè§£æ±ºãããŠããŸããã 説æãããŠããã·ã¹ãã ã®ã·ã£ããããŠã³ã®ç¶æ³ã¯ããã®å¯èœæ§ã¯æžå°ããŸãããããŸã é€å€ãããŠããŸããã ããã§ãã
VACUUM FREEZE
ã®èšå®ã泚ææ·±ãç£èŠããŠããã®æäœã«ããäºæããªãããã©ãŒãã³ã¹ã®äœäžããªãããã«ããå¿
èŠããããŸãã
32ãããã«ãŠã³ã¿ãŒã64ãããã«ãŠã³ã¿ãŒã«çœ®ãæãããšããªãŒããŒãããŒã¯ã»ãŒç¡éã«ãªããŸãã
VACUUM FREEZE
ã®å¿
èŠæ§ã¯å®è³ªçã«ãªããªããŸãïŒçŸåšã®ããŒãžã§ã³ã§ã¯ã以äžã«èª¬æããç·æ¥ã®å Žåã«
pg_clog
ãš
pg_multixact
ãåŠçããããã«åçµã䜿çšãããŸãïŒã ããããä»äºã¯é¡ã§è§£æ±ºãããŸããã ããŒãã«ã«ãã£ãŒã«ããã»ãšãã©ãªãå Žåãç¹ã«ãããã®ãã£ãŒã«ããæŽæ°ã§ããå Žåããã®ããªã¥ãŒã ã¯å€§å¹
ã«å¢å ããå¯èœæ§ããããŸãïŒåã¬ã³ãŒãã«ã¯ãã¬ã³ãŒããçæãããã©ã³ã¶ã¯ã·ã§ã³çªå·ãšãã®ããŒãžã§ã³ã®ã¬ã³ãŒããåé€ãããã©ã³ã¶ã¯ã·ã§ã³çªå·ãå«ãŸããŠãããåçªå·ã¯4ã§ã¯ãªã8ãã€ãã§æ§æãããŠããããïŒã éçºè
ã¯32ããããè¿œå ããã ãã§ã¯ãããŸããã
Postgres Pro Enterprise
äžäœ4ãã€ãã¯ã¬ã³ãŒãã«å«ãŸããããæ代ããã€ãŸãããŒã¿ããŒãžã¬ãã«ã§ã®
(offset)
ãè¡šããŸãã å
å·ã¯ãããŒãã«ãšã³ããªã®éåžžã®32ããããã©ã³ã¶ã¯ã·ã§ã³çªå·ã«è¿œå ãããŸãã ãããŠãããŒãã«ã¯èšåŒµããŸããã
ã·ã¹ãã ãããŒãžã®æ代ã«ãã£ãŠå®çŸ©ãããç¯å²ã«åãŸããªã
XID
ãæžã蟌ãããšããå Žåãã·ãããå¢ããããããŒãžå
šäœãããªãŒãºããå¿
èŠããããŸãã ããããããã¯ã¡ã¢ãªå
ã§ç°¡åã«å®è¡ãããŸãã
(snapshots)
ããŸã èŠæ±ã§ããæå°ã®
XID
ãããã®ããŒãžã«æžã蟌ã¿ãã
XID
ããã2
32以äžé
ããŠããå Žåã«ã¯å¶éããããŸãã ããããããã¯ã»ãšãã©ãããŸããã ããã«ãè¿ãå°æ¥ããã®å¶éãå
æããå¯èœæ§ããããŸãã
32ãããã«ãŠã³ã¿ãŒã®ãã1ã€ã®åé¡ã¯ããªãŒããŒãããŒåŠçãéåžžã«è€éãªããã»ã¹ã§ããããšã§ãã ããŒãžã§ã³9.5ãŸã§ã¯ã察å¿ããã³ãŒãã§éåžžã«é倧ãªãã°ãæ€åºããã³ä¿®æ£ãããå°æ¥ã®ããŒãžã§ã³ã§ãã°ã衚瀺ãããªããšããä¿èšŒã¯ãããŸããã 64ããããã©ã³ã¶ã¯ã·ã§ã³ã«ãŠã³ã¿ãŒã®å®è£
ã«ã¯ãã·ã³ãã«ã§æ確ãªããžãã¯ãããããããªãŒããŒãããŒãšæŠããããããããæäœããŠããã«éçºããæ¹ãç°¡åã§ãã
64ãããã«ãŠã³ã¿ãŒãåããã·ã¹ãã ã®ããŒã¿ãã¡ã€ã«ã¯32ãããã«ãŠã³ã¿ãŒãšãã€ããªäºæã§ã¯ãããŸããããããŒã¿ãå€æããããã®äŸ¿å©ãªãŠãŒãã£ãªãã£ããããŸãã
3.ããŒãžããŒã·ã§ã³
PostgreSQLã§ã¯ãä»ã®ã»ãšãã©ã®DBMSãšã¯ç°ãªãã
(page level compression)
ã¯ãããŸããã
TOAST
ããŒã¿ã®ã¿ãå§çž®ãããŸãã ããŒã¿ããŒã¹ã«æ¯èŒçå°ããªããã¹ããã£ãŒã«ããæã€ã¬ã³ãŒããå€æ°ããå Žåãå§çž®ã«ããããŒã¿ããŒã¹ã®ãµã€ãºãæ°åå°ãããªãããã£ã¹ã¯ã«ä¿åããã ãã§ãªããDBMSã®ããã©ãŒãã³ã¹ãåäžããŸãã ãã£ã¹ã¯ãã倧éã®ããŒã¿ãèªã¿åããããŸãå€æŽããªãåæã¯ãšãªã¯ãI / Oæäœãæžããããšã§ç¹ã«å¹ççã«å éã§ããŸãã
Postgres
ã³ãã¥ããã£ã¯ãå§çž®ã®å§çž®ãµããŒããåãããã¡ã€ã«ã·ã¹ãã ã®äœ¿çšãææ¡ããŠããŸãã ããããããã¯åžžã«äŸ¿å©ã§å¯èœãšã¯éããŸããã ãã®ããã
Postgres Pro Enterprise
ãããŒãžã³ã°å§çž®ã®ç¬èªã®å®è£
ãè¿œå ããŸããã ããŸããŸãª
Postgres Pro
ãŠãŒã¶ãŒã®ãã¹ãçµæã«ãããšãããŒã¿ããŒã¹ãµã€ãºã¯2åãã5åã«æžå°ããŸããã
å®è£
ã§ã¯ãããŒãžã¯ãã£ã¹ã¯ã«å§çž®ãããŠä¿åãããŸããããããã¡ã«èªã¿èŸŒãŸãããšå±éãããŸãããããã£ãŠãRAMã§ã®ããŒãžã®æäœã¯éåžžãšãŸã£ããåãã§ãã å§çž®ããŒã¿ã®å±éãšãã®å§çž®ã¯è¿
éã«è¡ãããå®éã«ã¯ããã»ããµã®è² è·ã¯å¢å ããŸããã
ããŒãžã®å§çž®äžã«å€æŽãããããŒã¿ã®éã¯å¢å ããå¯èœæ§ããããããåžžã«å
ã®å Žæã«æ»ãããšã¯ã§ããŸããã å§çž®ãããããŒãžããã¡ã€ã«ã®æåŸã«æžã蟌ã¿ãŸãã ãã£ã¹ã¯ã«ããŒãžãé çªã«æžã蟌ããšãã·ã¹ãã å
šäœã®ããã©ãŒãã³ã¹ã倧å¹
ã«åäžããŸãã ããã«ã¯ãè«çã¢ãã¬ã¹ãç©çã¢ãã¬ã¹ã«ããããããã¡ã€ã«ãå¿
èŠã§ããããã®ãã¡ã€ã«ã¯å°ããããªãŒããŒãããã¯èŠããŸããã
é 次èšé²äžã®ãã¡ã€ã«èªäœã®ãµã€ãºã¯å¢å ããŸãã èŠåã«åŸã£ãŠããŸãã¯æåã§ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãèµ·åããããšã«ããã空ã§ãªãããŒãžããã¹ãŠãã¡ã€ã«ã®å
é ã«ç§»åããããšã«ãããå®æçã«ãã¡ã€ã«ãããã³ã³ãã¯ãã«ããïŒããã©ã°ããïŒããšãã§ããŸãã ããã¯ã°ã©ãŠã³ãã§ã¬ããŒãžãåéã§ããŸãïŒã»ã°ã¡ã³ãã¯ãããã¯ãããŸãããããŒãã«å
šäœã§ã¯ãããŸããïŒããŸããã¬ããŒãžãåéããããã¯ã°ã©ãŠã³ãããã»ã¹ã®æ°ãèšå®ã§ããŸãã
å§çž®ïŒã¢ã«ãŽãªãºã ïŒ | ãµã€ãºïŒGBïŒ | æéïŒç§ïŒ |
---|
å§çž®ãªã | 15.31 | 92 |
ã¹ããã㌠| 5.18 | 99 |
lz4 | 4.12 | 91 |
postgreså
éšlz | 3.89 | 214 |
lzfse | 2.80 | 1099 |
zlibïŒæé«éåºŠïŒ | 2.43 | 191 |
zlibïŒããã©ã«ãã¬ãã«ïŒ | 2.37 | 284 |
zstd | 1.69 | 125 |
å§çž®ã¡ã«ããºã ã®æ¯èŒã ãã¹ããã©ã¡ãŒã¿ãŒïŒpgbench -i -s 1000å§çž®ã«ã¯ãææ°ã®zstdã¢ã«ãŽãªãºã ãéžæããŸããïŒ
Facebookã§éçºãã
ãŸãã ïŒã ããŸããŸãªå§çž®ã¢ã«ãŽãªãºã ãè©Šãã
zstd
ã§è§£æ±ºã
zstd
ãããã¯ãè¡šãããããããã«ãå質ãšå§çž®é床ã®æé©ãªåŠ¥åç¹ã§ãã
4.ãªãã©ã€ã³ãã©ã³ã¶ã¯ã·ã§ã³
æè¡çã«ã¯ãèªåŸåãã©ã³ã¶ã¯ã·ã§ã³ã®æ¬è³ªã¯ã芪ã®ã³ããã/ããŒã«ããã¯ã«é¢ä¿ãªããã¡ã€ã³ã®èŠªãã©ã³ã¶ã¯ã·ã§ã³ããäœæããããã®ãã©ã³ã¶ã¯ã·ã§ã³ãã³ããããŸãã¯ããŒã«ããã¯ã§ããããšã§ãã èªåŸåãã©ã³ã¶ã¯ã·ã§ã³ã¯ãç¬èªã®ã³ã³ããã¹ãã§å®è¡ãããŸãã èªåŸã§ã¯ãªããå¥ã®å
éšã®éåžžã®ãã©ã³ã¶ã¯ã·ã§ã³ïŒãã¹ãããããã©ã³ã¶ã¯ã·ã§ã³ïŒãå®çŸ©ããå Žåã芪ãã©ã³ã¶ã¯ã·ã§ã³ãããŒã«ããã¯ããããšãå
éšãã©ã³ã¶ã¯ã·ã§ã³ãåžžã«ããŒã«ããã¯ãããŸãã ãã®åäœã¯ãã¢ããªã±ãŒã·ã§ã³éçºè
ã«åžžã«é©ããŠãããšã¯éããŸããã
èªåŸåãã©ã³ã¶ã¯ã·ã§ã³ã¯ãã¢ã¯ã·ã§ã³ã®ãã°èšé²ãŸãã¯ç£æ»ãå¿
èŠãªå Žåã«ãã䜿çšãããŸãã ããšãã°ããã©ã³ã¶ã¯ã·ã§ã³ãããŒã«ããã¯ãããç¶æ³ã§ããã°ã§äœããã®ã¢ã¯ã·ã§ã³ãå®è¡ããããšããè©Šã¿ã®èšé²ãå¿
èŠã§ãã èªåŸåãã©ã³ã¶ã¯ã·ã§ã³ã䜿çšãããšãåŸæ¥å¡ã®ãæ©å¯ãã¢ã¯ã·ã§ã³ïŒé¡§å®¢ã¢ã«ãŠã³ãã®è¡šç€ºãŸãã¯å€æŽïŒã«ãã£ãŠãç·æ¥æã«ç»åã埩å
ããããã«äœ¿çšã§ãããã¬ãŒã¹ãåžžã«æ®ãããšãã§ããŸãïŒãã®ãããã¯ã®äŸã以äžã«ç€ºããŸãïŒã
Oracle
ã
DB2
ãªã©ã®DBMSïŒ
MS SQL
ã¯ãããŸããïŒã§ã¯ãèªåŸåãã©ã³ã¶ã¯ã·ã§ã³ã¯æ£åŒã«ãã©ã³ã¶ã¯ã·ã§ã³ãšããŠå®çŸ©ãããã®ã§ã¯ãªããããã·ãŒãžã£ãé¢æ°ãããªã¬ãŒãããã³ååã®ãªããããã¯å
ã®èªåŸåãããã¯ãšããŠå®çŸ©ãããŸãã
SAP HANA
ã«ã¯èªåŸåãã©ã³ã¶ã¯ã·ã§ã³ããã
SAP HANA
ããæ©èœãããã¯ã ãã§ãªãããã©ã³ã¶ã¯ã·ã§ã³ãšããŠå®çŸ©ããããšãã§ããŸãã
ããšãã°ã
Oracle
ã§ã¯ãèªåŸåãã©ã³ã¶ã¯ã·ã§ã³ã¯ãããã¯ã®å
é ã§
PRAGMA AUTONOMOUS_TRANSACTION
ãšããŠå®çŸ©ãããŸãã ããã·ãŒãžã£ãé¢æ°ããŸãã¯ååã®ãªããããã¯ã®åäœã¯ãã³ã³ãã€ã«ã®æ®µéã§æ±ºå®ãããå®è¡äžã«å€æŽããããšã¯ã§ããŸããã
PostgreSQL
ã¯ãªãã©ã€ã³ãã©ã³ã¶ã¯ã·ã§ã³ããŸã£ãããããŸããã ãããã¯ãdblinkã䜿çšããŠæ°ããæ¥ç¶ãèµ·åããããšã§ã·ãã¥ã¬ãŒãã§ããŸãããããã¯ãªãŒããŒãããã«å€æãããããã©ãŒãã³ã¹ã«åœ±é¿ãåãŒããåã«äžäŸ¿ã§ãã æè¿ã
pg_background
ã¢ãžã¥ãŒã«ã®ç»å ŽåŸãããã¯ã°ã©ãŠã³ãããã»ã¹ãéå§ããŠèªåŸåãã©ã³ã¶ã¯ã·ã§ã³ãã·ãã¥ã¬ãŒãããããšãææ¡ãããŸããã ããããããã¯ç¡å¹ã§ããããšãå€æããŸããïŒãã¹ãçµæãåæãããšãã以äžã®çç±ã«æ»ããŸãïŒã
Postgres Pro Enterpriseã§ã¯ã
èªåŸåãã©ã³ã¶ã¯ã·ã§ã³ãå®è£
ããŸããã ããã§ããã¹ããããèªåŸåãã©ã³ã¶ã¯ã·ã§ã³ãšããŠãæ©èœå
ã§ã䜿çšã§ããŸãã
ãã¹ããããèªåŸåãã©ã³ã¶ã¯ã·ã§ã³ã§ã¯ã芪ãã©ã³ã¶ã¯ã·ã§ã³ã®ã¬ãã«ã«é¢ä¿ãªãã䜿çšå¯èœãªãã¹ãŠã®
PostgreSQL
åé¢ã¬ãã«ïŒèªã¿åãã³ããããç¹°ãè¿ãèªã¿åããã·ãªã¢ã«åå¯èœïŒãå®çŸ©ã§ããŸãã äŸïŒ
BEGIN TRANSACTION
<..>
BEGIN AUTONOMOUS TRANSACTION ISOLATION LEVEL REPEATABLE READ
<..>
END ;
END ;
å¯èœãªãã¹ãŠã®çµã¿åãããæ©èœããéçºè
ã«å¿
èŠãªæè»æ§ãäžããŸãã èªåŸåãã©ã³ã¶ã¯ã·ã§ã³ã¯ããŸã ã³ããããããŠããªãããã芪ã®ã¢ã¯ã·ã§ã³ã®çµæãèŠãããšã¯ãããŸããã å察ã¯ãã¡ã€ã³ã®åé¢ã¬ãã«ã«äŸåããŸãã ãã ããç¬ç«ããŠéå§ããããã©ã³ã¶ã¯ã·ã§ã³ãšã®é¢ä¿ã§ã¯ãéåžžã®åé¢ã«ãŒã«ãé©çšãããŸãã
é¢æ°ã®æ§æã¯ãããã«ç°ãªããŸãïŒ
TRANSACTION
ããŒã¯ãŒãã¯ãšã©ãŒãã¹ããŒããŸãã é¢æ°å
ã®èªåŸãŠãããã¯ã次ã®ããã«å®çŸ©ãããŸãã
CREATE FUNCTION <..> AS
BEGIN ;
<..>
BEGIN AUTONOMOUS
<..>
END ;
END ;
ãããã£ãŠãåé¢ã¬ãã«ã¯èšå®ã§ããã芪ãã©ã³ã¶ã¯ã·ã§ã³ã®ã¬ãã«ã«ãã£ãŠæ±ºå®ãããæ瀺çã«èšå®ãããŠããªãå Žåã¯ããã©ã«ãã§èšå®ãããŸãã
äžçã®å€å
žçãªåçšDBMSã®1ã€ãšèããããäŸã瀺ããŸãã äžéšã®éè¡ã§ã¯ãcustomer_infoããŒãã«ã«é¡§å®¢ããŒã¿ãšè² åµãä¿åãããŠããŸã
CREATE TABLE customer_info (acc_id int , acc_debt int );
INSERT INTO customer_info VALUES (1, 1000),(2, 2000);
ãã®ããŒãã«ã«éè¡å¡ãçŽæ¥ã¢ã¯ã»ã¹ã§ããªãããã«ããŸãã ãã ããå©çšå¯èœãªæ©èœã䜿çšããŠé¡§å®¢ã®åµåããã§ãã¯ããããšãã§ããŸãã
CREATE OR REPLACE FUNCTION get_debt (cust_acc_id int ) RETURNS int AS
$$
DECLARE
debt int ;
BEGIN
PERFORM log_query( CURRENT_USER :: text , cust_acc_id, now());
SELECT acc_debt FROM customer_info WHERE acc_id = cust_acc_id INTO debt;
RETURN debt;
END ;
$$ LANGUAGE plpgsql;
ã¯ã©ã€ã¢ã³ãããŒã¿ãã¹ãã€ããåã«ãé¢æ°ã¯DBMSãŠãŒã¶ãŒåãã¯ã©ã€ã¢ã³ãã¢ã«ãŠã³ãçªå·ãããã³æäœæéããã°ããŒãã«ã«æžã蟌ã¿ãŸãã
CREATE TABLE log_sensitive_reads (bank_emp_name text , cust_acc_id int , query_time timestamptz);
CREATE OR REPLACE FUNCTION log_query (bank_usr text , cust_acc_id int , query_time timestamptz ) RETURNS void AS
$$
BEGIN
INSERT INTO log_sensitive_reads VALUES (bank_usr, cust_acc_id, query_time);
END ;
$$ LANGUAGE plpgsql;
åŸæ¥å¡ã«ã¯ã©ã€ã¢ã³ãã®åéã«ã€ããŠåãåãããããšãã§ããããã«ãããã®ã§ãããæ idleãªãŸãã¯æªæã®ãã奜å¥å¿ãå©é·ããªãããã«ãåžžã«ãã°ã§åœŒã®æŽ»åã®çè·¡ãèŠãããšæããŸãã
奜å¥å¿employeeçãªåŸæ¥å¡ãã³ãã³ããå®è¡ããŸãã
BEGIN ;
SELECT get_debt (1);
ROLLBACK ;
ãã®å Žåããã®ã¢ã¯ãã£ããã£ã«é¢ããæ
å ±ã¯ããã©ã³ã¶ã¯ã·ã§ã³å
šäœã®ããŒã«ããã¯ãšãšãã«ããŒã«ããã¯ãããŸãã ããã¯ç§ãã¡ã«ã¯åããªãã®ã§ããã®ã³ã°æ©èœãå€æŽããŸãã
CREATE OR REPLACE FUNCTION
log_query (bank_usr text , cust_acc_id int , query_time timestamptz ) RETURNS void AS
$$
BEGIN
BEGIN AUTONOMOUS
INSERT INTO log_sensitive_reads VALUES (bank_usr, cust_acc_id, query_time);
END ;
END ;
$$ LANGUAGE plpgsql;
ããã§ãåŸæ¥å¡ãã©ã®ããã«ãã©ãã¯ãé ãããšããŠãã顧客ããŒã¿ã®ãã¹ãŠã®ãã¥ãŒãèšé²ãããŸãã
ãªãã©ã€ã³ãã©ã³ã¶ã¯ã·ã§ã³ã¯ãæã䟿å©ãªãããã°ããŒã«ã§ãã çãããã³ãŒãã«ã¯ã倱æãããã©ã³ã¶ã¯ã·ã§ã³ãããŒã«ããã¯ããåã«ãããã°ã¡ãã»ãŒãžãæžã蟌ãæéããããŸãã
BEGIN AUTONOMOUS
INSERT INTO test (msg) VALUES ( 'STILL in DO cycle. after pg_background call: ' ||clock_timestamp():: text );
END ;
ããã©ãŒãã³ã¹ã«ã€ããŠã®çµè«ã èªåŸãã©ã³ã¶ã¯ã·ã§ã³ã®å®è£
ããèªåŸãã©ã³ã¶ã¯ã·ã§ã³ã®ãªãåãSQLãšã
dblink
ã
pgbouncer
ãšæ¥ç¶å¶åŸ¡ãšçµã¿åããã裞ã®
dblink
ãããœãªã¥ãŒã·ã§ã³ãšæ¯èŒããŠãã¹ãããŸããã
pg_background
ã¯3ã€ã®é¢æ°ãäœæã
pg_background_launch(query)
ã¯ã
background worker
ããã¯ã°ã©ãŠã³ãããã»ã¹ãéå§ããæž¡ãããSQLé¢æ°ãå®è¡ããŸãã
pg_background_result(pid)
ã¯
pg_background_launch(query)
ã«ãã£ãŠäœæãããããã»ã¹ããçµæãååŸãã
pg_background_detach(pid)
ã¯ããã¯ã°ã©ãŠã³ãããã»ã¹ãäœæè
ããåæããŸãã ãã©ã³ã¶ã¯ã·ã§ã³ãå®è¡ããã³ãŒãã¯çŽèŠ³çã§ã¯ãããŸããã
PERFORM * FROM pg_background_result(pg_background_launch (query))
AS (result text );
ããããããéèŠãªããšã¯ãäºæ³ã©ãããåSQLã®ããã»ã¹ã®äœæãé
ãããšã§ãã pg_backgroundã®äœæå±¥æŽããã4çªç®ã®é¢æ°
pg_background_run(pid, query)
æ³å®
pg_background_run(pid, query)
ããŠããããš
pg_background_run(pid, query)
ãããã¯ãæ°ããã¿ã¹ã¯ãæ¢ã«å®è¡äžã®ããã»ã¹ã«è»¢éããŸãã ãã®å Žåãããã»ã¹ãäœæããããã®æéã¯ãã¹ãŠã®SQLã«è²»ããããããã§ã¯ãããŸãããããã®é¢æ°ã¯çŸåšã®å®è£
ã§ã¯äœ¿çšã§ããŸããã
pg_background
ã®æåã®ããŒãžã§ã³ãäœæãã
Robert Haasã¯æ¬¡ã®
pg_background
ã«è¿°ã¹ãŠããŸãã
ãç§ã¯ãã®ã¢ãããŒãã«æççã§ãïŒ pg_background]
ã䜿çšããŠèªåŸåãã©ã³ã¶ã¯ã·ã§ã³ãã·ãã¥ã¬ãŒãããpg_background]
ã ,
, , [backend]
, [background_workers]
. [max_worker_processes]
, , , , , , , ».: , , , .
, ,
pg_background
6-7 ,
Postgres Pro Enterprise
.
å³ 3. . pgbech INSERT
pgbench_history
. 10. TPS «» SQL 100.PSã
!PPS.
!