Vladimir Sitnikov ã® 2016 幎åé ã®ã¬ããŒããPostgreSQL ãš JDBC ããã¹ãŠã®æ©èœãçµãåºããŠãããã®è»¢åãèªãããšããå§ãããŸãã
ããã«ã¡ã¯ç§ã®ååã¯ãŠã©ãžããŒã«ã»ã·ããã³ãã§ãã ç§ã¯ NetCracker 㧠10 幎éåããŠããŸãã ãããŠç§ã¯äž»ã«çç£æ§ãéèŠããŠããŸãã Java ã«é¢é£ãããã®ãã¹ãŠãSQL ã«é¢é£ãããã®ãã¹ãŠãç§ã¯å€§å¥œãã§ãã
ãããŠä»æ¥ã¯ãPostgreSQL ãããŒã¿ããŒã¹ ãµãŒããŒãšããŠäœ¿ãå§ãããšãã«ç€Ÿå ã§ééããåºæ¥äºã«ã€ããŠè©±ããŸãã ãããŠç§ãã¡ã¯äž»ã« Java ã䜿ã£ãŠäœæ¥ããŸãã ããããä»æ¥ç§ãã話ãããããšã¯ Java ã«éã£ã話ã§ã¯ãããŸããã å®éã«ãã£ãŠã¿ããšãããããã«ãããã¯ä»ã®èšèªã§ãçºçããŸãã
次ã®ããšã«ã€ããŠè©±ããŸãã
- ããŒã¿ãµã³ããªã³ã°ã«ã€ããŠã
- ããŒã¿ã®ä¿åã«ã€ããŠã
- ãããŠããã©ãŒãã³ã¹ã«ã€ããŠãã
- ãããŠããã«åããããŠããæ°Žäžçæã«ã€ããŠã
ç°¡åãªè³ªåããå§ããŸãããã äž»ããŒã«åºã¥ããŠããŒãã«ãã XNUMX ã€ã®è¡ãéžæããŸãã
ããŒã¿ããŒã¹ã¯åããã¹ãäžã«ãããŸãã ãã®ãã¹ãŠã®ãã¡ãŒãã³ã°ã«ã¯ 20 ããªç§ããããŸãã
ãã® 20 ããªç§ã¯é·ãã§ãã ãã®ãããªãªã¯ãšã¹ãã 100 件ããå Žåããããã®ãªã¯ãšã¹ããã¹ã¯ããŒã«ããã®ã« XNUMX ç§ãããã®æéãè²»ããããšã«ãªããæéã®ç¡é§ã«ãªããŸãã
ç§ãã¡ã¯ãããè¡ãã®ã奜ãã§ã¯ãªãããã®ããã«åºå°ãç§ãã¡ã«äœãæäŸããããæ€èšããŸãã ããŒã¿ããŒã¹ã§ã¯ãã¯ãšãªãå®è¡ããããã® XNUMX ã€ã®ãªãã·ã§ã³ãæäŸãããŸãã
æåã®ãªãã·ã§ã³ã¯åçŽãªãªã¯ãšã¹ãã§ãã ããã®äœãè¯ãã®ã§ããïŒ ç§ãã¡ããããåãåã£ãŠéä¿¡ãããšããäºå®ã ãã§ããã以äžã®ãã®ã¯äœããããŸããã
ããŒã¿ããŒã¹ã«ã¯ãããè€éã§ã¯ãããŸãããããæ©èœçãªé«åºŠãªã¯ãšãªããããŸãã 解æãå®è¡ãå€æ°ãã€ã³ãã£ã³ã°ãªã©ã®ãªã¯ãšã¹ããåå¥ã«éä¿¡ã§ããŸãã
è¶ æ¡åŒµã¯ãšãªã«ã€ããŠã¯ãçŸåšã®ã¬ããŒãã§ã¯åãäžããŸããã ãããããç§ãã¡ã¯ããŒã¿ããŒã¹ããäœããæãã§ãããäœããã®åœ¢ã§äœæããããŠã£ãã·ã¥ãªã¹ãããããŸããã€ãŸãããããç§ãã¡ãæãã§ããããšã§ãããçŸåšãæ¥å¹Žãããã¯äžå¯èœã§ãã ããã§ãã¡ããã©ãããé²é³ããŠãäž»èŠãªäººã ãæºãã¶ããªããåããŸãã
ãããŠã§ããããšã¯ãåçŽãªã¯ãšãªãšæ¡åŒµã¯ãšãªã§ãã
ããããã®ã¢ãããŒãã®ç¹åŸŽã¯äœã§ãã?
åçŽãªã¯ãšãªã¯ XNUMX åéãã®å®è¡ã«é©ããŠããŸãã äžåºŠçµãã£ããå¿ããŠããŸããŸãã ãããŠåé¡ã¯ããã€ããªããŒã¿åœ¢åŒããµããŒãããŠããªãããšã§ããã€ãŸããäžéšã®é«æ§èœã·ã¹ãã ã«ã¯é©ããŠããŸããã
æ¡åŒµã¯ãšãª â 解ææéãç¯çŽã§ããŸãã ãããç§ãã¡ãå®è¡ãã䜿çšãå§ãããã®ã§ãã ããã¯æ¬åœã«æ¬åœã«å©ãããŸããã ç¯çŽã§ããã®ã¯è§£æã ãã§ã¯ãããŸããã ããŒã¿è»¢éã®ç¯çŽã«ãªããŸãã ãã€ããªåœ¢åŒã§ããŒã¿ã転éããæ¹ãã¯ããã«å¹ççã§ãã
ç·Žç¿ã«ç§»ããŸãããã å žåçãªã¢ããªã±ãŒã·ã§ã³ã¯æ¬¡ã®ããã«ãªããŸãã Javaãªã©ãããããŸããã
ã¹ããŒãã¡ã³ããäœæããŸããã ã³ãã³ããå®è¡ããŸããã è¿ãã§äœæããŸããã ããã®ã©ããééããªã®ã§ããããïŒ äœãåé¡ã§ããïŒ åé¡ãªãã ããã¯ã©ã®æ¬ã«ãæžããŠããããšã§ãã ãã®ããã«æžãã¹ãã§ãã æ倧ã®ããã©ãŒãã³ã¹ãå¿ èŠãªå Žåã¯ã次ã®ããã«èšè¿°ããŸãã
ããããå®éã«ãã£ãŠã¿ããšãããã§ã¯ããŸããããªãããšãããã£ãŠããŸãã ãªãïŒ ãéãããã¡ãœãããããããã§ãã ãããè¡ããšãããŒã¿ããŒã¹ã®èŠ³ç¹ããèŠããšãå«ç è ãããŒã¿ããŒã¹ãæäœããŠãããããªãã®ã§ããããšãããããŸãã ãPARSE EXECUTE DEALLOCATEããšèšããŸããã
ãªããã®ãããªäœåãªã¹ããŒãã¡ã³ãã®äœæãšã¢ã³ããŒããè¡ãããã®ã§ãããã? 誰ãå¿ èŠãšããŠããŸããã ãã ããPreparedStatement ã§éåžžèµ·ããããšã¯ãPreparedStatement ãéãããšãããŒã¿ããŒã¹äžã®ãã¹ãŠãéããããããšã§ãã ããã¯ç§ãã¡ãæãã§ããããšã§ã¯ãããŸããã
ç§ãã¡ã¯å¥åº·ãªäººãšåãããã«ãåºå°ã§åããããšæã£ãŠããŸãã ç§ãã¡ã¯ã¹ããŒãã¡ã³ããäžåºŠäœæããŠæºåãããããäœåºŠãå®è¡ããŸãã å®éãã¢ããªã±ãŒã·ã§ã³ã¯äœåºŠã (ããã¯ã¢ããªã±ãŒã·ã§ã³ã®äžçã®ãã¡ã«äžåºŠã ãã§ãã) 解æãããŠããŸãã ãããŠãç°ãªã REST ã§åãã¹ããŒãã¡ã³ã ID ã䜿çšããŸãã ãããç§ãã¡ã®ç®æšã§ãã
ã©ãããã°ãããéæã§ããã§ãããã?
ãšãŠãç°¡åã§ããã¹ããŒãã¡ã³ããéããå¿ èŠã¯ãããŸããã ãæºåããå®è¡ãã®ããã«æžããŸãã
ãããªãã®ãç«ã¡äžããããã©ããã«äœãã溢ãåºãã®ã¯æããã ã äžæãªå Žåã¯ãè©ŠçããŠã¿ãããšãã§ããŸãã ãã®ç°¡åãªæ¹æ³ã䜿çšãããã³ãããŒã¯ãäœæããŠã¿ãŸãããã ã¹ããŒãã¡ã³ããäœæããŸãã ããããŒãžã§ã³ã®ãã©ã€ããŒã§ãã®ãã©ã€ããŒãèµ·åãããšããã©ã€ããŒãæã£ãŠããã¡ã¢ãªããã¹ãŠå€±ãããããã«ã¯ã©ãã·ã¥ããããšãããããŸããã
ãã®ãããªãšã©ãŒã¯ç°¡åã«ä¿®æ£ã§ããããšã¯æããã§ãã ãããã«ã€ããŠã¯è©±ããŸããã ãã ããæ°ããããŒãžã§ã³ã®æ¹ãã¯ããã«é«éã«åäœãããšèšããŸãã æ¹æ³ã¯æãã§ãããããã§ãã§ãã
æ£ããåãã«ã¯ã©ãããã°ããã§ãããã? ãã®ããã«ã¯äœãããå¿ èŠãããã§ãããã?
å®éã«ã¯ãã¢ããªã±ãŒã·ã§ã³ã¯åžžã«ã¹ããŒãã¡ã³ããéããŸãã ã©ã®æ¬ã«ããéããªããšã¡ã¢ãªããªãŒã¯ãããšèšã£ãŠããŸãã
ãŸããPostgreSQL ã¯ã¯ãšãªããã£ãã·ã¥ããæ¹æ³ãç¥ããŸããã åã»ãã·ã§ã³ãããèªäœã®ããã«ãã®ãã£ãã·ã¥ãäœæããå¿ èŠããããŸãã
ãŸãã解æã«æéãç¡é§ã«ããããããŸããã
ãããŠãã€ãã®ããã«ãéžæè¢ã¯ XNUMX ã€ãããŸãã
æåã®ãªãã·ã§ã³ã¯ããããåãå ¥ããŠããã¹ãŠã PgSQL ã§ã©ããããŸããããšããããšã§ãã ããã«ãã£ãã·ã¥ããããŸãã ãã¹ãŠããã£ãã·ã¥ããŸãã ããã¯çŽ æŽãããçµæã«ãªãã§ãããã ç§ãã¡ã¯ãããèŠãŸããã 100500件ã®ãªã¯ãšã¹ãããããŸãã åäœããŸããã ç§ãã¡ã¯ããªã¯ãšã¹ããæåã§æé ã«å€æããããšã«åæããŸããã ããããã
XNUMX çªç®ã®ãªãã·ã§ã³ããããŸãããããèªåã§ã«ããããŠãã ããã ãœãŒã¹ãéããŠã«ãããéå§ããŸãã ç§ãã¡ã¯äœåºŠãèŠãŸããã ããã¯ããã»ã©é£ããããšã§ã¯ãªãããšãããããŸããã
ãã¡ãã¯2015幎XNUMXæã«ç»å ŽããŸããã çŸåšã¯ãããçŸä»£çãªããŒãžã§ã³ããããŸãã ãããŠãã¹ãŠãçŽ æŽãããã§ãã éåžžã«ããŸãæ©èœããã®ã§ãã¢ããªã±ãŒã·ã§ã³ã«ã¯äœãå€æŽããŸããã ãããŠç§ãã¡ã¯ PgSQL ã®æ¹åã§èããããšãããããŸãããã€ãŸãããã¹ãŠã®ãªãŒããŒããã ã³ã¹ããã»ãŒãŒãã«åæžããã«ã¯ããã§ååã§ããã
ãããã£ãŠããµãŒããŒãæºåããã¹ããŒãã¡ã³ãã¯ã5 åéãã®ãªã¯ãšã¹ãããšã«ããŒã¿ããŒã¹å ã®ã¡ã¢ãªãç¡é§ã«æ¶è²»ãããã®ãé¿ããããã«ãXNUMX åç®ã®å®è¡æã«ã¢ã¯ãã£ãåãããŸãã
ãæ°åã¯ã©ãã«ããã®?ããšçåã«æããããããŸããã äœãåŸãã®ã§ããïŒ ããããã®ãªã¯ãšã¹ãã«ã¯ç¬èªã®ãã®ããããããããã§ã¯æ°åã¯ç€ºããŸããã
ç§ãã¡ã®ã¯ãšãªã¯ãOLTP ã¯ãšãªã®è§£æã«çŽ 20 ããªç§ãè²»ããããã®ã§ããã å®è¡ã«ã¯ 0,5 ããªç§ã解æã«ã¯ 20 ããªç§ããããŸããã ãªã¯ãšã¹ã â ããã¹ã 10 KiBãèšç» 170 è¡ã ãã㯠OLTP ãªã¯ãšã¹ãã§ãã 1ã5ã10 è¡ãå Žåã«ãã£ãŠã¯ãã以äžã®è¡ãèŠæ±ããŸãã
ãããã20 ããªç§ãç¡é§ã«ããããããŸããã§ããã ããã0ã«æžãããŸããã ãã¹ãŠãçŽ æŽãããã§ãã
ããããäœãåŸãããšãã§ããŸãã? Java ã䜿çšããŠããå Žåã¯ãææ°ããŒãžã§ã³ã®ãã©ã€ããŒãå ¥æããŠåã¶ã§ãããã
å¥ã®èšèªã話ãå Žåã¯ãèããŠã¿ãŠãã ãããããããããããããå¿ èŠãªã®ã§ãããã? ãªããªããæçµèšèªã®èŠ³ç¹ããèŠããšãããšãã° PL 8 ã LibPQ ã䜿çšããŠããå Žåãå®è¡ã解æã«æéãè²»ãããŠããããšãæããã§ã¯ãªããããããã¯ç¢ºèªãã䟡å€ããããŸãã ã©ããã£ãŠïŒ ãã¹ãŠç¡æã§ãã
ééããããã€ãã®ç¹æ®æ§ãããããšãé€ããŠã ãããŠããããã«ã€ããŠä»ãã話ããŸãã ãã®ã»ãšãã©ã¯ç£æ¥èå€åŠã«é¢ãããã®ã§ãç§ãã¡ãçºèŠãããã®ãåºäŒã£ããã®ã«ã€ããŠã®ãã®ã«ãªããŸãã
ãªã¯ãšã¹ããåçã«çæãããå Žåã ããã¯èµ·ãããŸãã 誰ããæååãã€ãªãåãããŠãSQL ã¯ãšãªãäœæããŸãã
ãªã圌ãæªãã®ã§ããããïŒ æ¯åéãæååã«ãªã£ãŠããŸãã®ã§ãããã¯åé¡ã§ãã
ãããŠããã®ç°ãªãæååã® hashCode ãå床èªã¿åãå¿ èŠããããŸãã ããã¯å®éã«ã¯ CPU ã®ã¿ã¹ã¯ã§ããæ¢åã®ããã·ã¥ã§ãã£ãŠãé·ããªã¯ãšã¹ã ããã¹ããèŠã€ããã®ã¯ããã»ã©ç°¡åã§ã¯ãããŸããã ãããã£ãŠãçµè«ã¯åçŽã§ãããªã¯ãšã¹ããçæããªãããšã§ãã ãããã XNUMX ã€ã®å€æ°ã«æ ŒçŽããŸãã ãããŠåã¶ã
次ã®åé¡ã ããŒã¿åã¯éèŠã§ãã ORM ã®äžã«ã¯ãã©ã®ãããªçš®é¡ã® NULL ããããã¯åé¡ã§ã¯ãªããäœããã®çš®é¡ã® NULL ãããããã«ãããšãããã®ããããŸãã Int ã®å Žåã¯ãsetInt ãšèšããŸãã NULL ã®å Žåã¯ãåžžã« VARCHAR ã«ããŠãã ããã ãããŠãNULL ãååšããããšã§ãæçµçã«ã¯ã©ã®ãããªéããçããã®ã§ãããã? ããŒã¿ããŒã¹èªäœããã¹ãŠãç解ããŸãã ãããŠããã®åçã¯æ©èœããŸããã
å®éã«ã¯ãããŒã¿ããŒã¹ã¯ãŸã£ããæ°ã«ããŸããã æåã«ããã¯æ°å€ã§ãããšèšããXNUMX åç®ã«ã¯ VARCHAR ã§ãããšèšã£ãå ŽåããµãŒããŒã§æºåãããã¹ããŒãã¡ã³ããåå©çšããããšã¯äžå¯èœã§ãã ãã®å Žåãã¹ããŒãã¡ã³ããåäœæããå¿ èŠããããŸãã
åãã¯ãšãªãå®è¡ããŠããå Žåã¯ãåã®ããŒã¿åãæ··åãããŠããªãããšã確èªããŠãã ããã NULL ã«æ³šæããå¿ èŠããããŸãã ããã¯ãPreparedStatements ã䜿çšãå§ããåŸã«çºçããäžè¬çãªãšã©ãŒã§ãã
ã¯ãããªã³ã«ãªããŸããã ãããã圌ãã¯é転æãé£ããŠè¡ã£ãã®ã§ãããã ãããŠçç£æ§ãäœäžããŸããã äºæ ã¯æªåããã
ããã¯ã©ãããŠèµ·ããã®ã§ãããã? ããã¯ãã°ã§ããããããšãæ©èœã§ãã? æ®å¿µãªãããããããã°ãªã®ãæ©èœãªã®ããç解ããããšã¯ã§ããŸããã§ããã ãã ãããã®åé¡ãåçŸããããã®éåžžã«ç°¡åãªã·ããªãªããããŸãã 圌女ã¯ãŸã£ããäºæ³å€ã«ç§ãã¡ãåŸ ã¡äŒãããŠããã ãããŠãããã¯æåéã XNUMX ã€ã®ããŒãã«ããã®ãµã³ããªã³ã°ã§æ§æãããŸãã ãã¡ããããã®ãããªèŠæã¯ãã£ãšãããŸããã ååãšããŠãXNUMX ã€ãŸã㯠XNUMX ã€ã®ããŒãã«ãå«ãŸããŠããŸãããããã®ãããªåçã·ããªãªããããŸãã ããŒã¿ããŒã¹ããä»»æã®ããŒãžã§ã³ãååŸããŠåçããŸãã
éèŠãªã®ã¯ãåã 20 ã€ãããããããã«ã€ã³ããã¯ã¹ãä»ããŠãããšããããšã§ãã XNUMX ã€ã® NULL åã«ã¯ XNUMX äžè¡ããããŸãã ãããŠãXNUMX åç®ã«ã¯ XNUMX è¡ããå«ãŸããŠããŸããã ãã€ã³ããããå€æ°ã䜿çšããã«å®è¡ãããšããã¹ãŠãããŸãåäœããŸãã
ãã€ã³ããããå€æ°ã䜿çšããŠå®è¡ãéå§ãããšãã€ãŸãã?ããå®è¡ããŸãã ãªã¯ãšã¹ãã«å¯ŸããŠã$1ããèŠæ±ããå Žåãæçµçã«äœãåŸãããã®ã§ãããã?
æåã®å®è¡ã¯äºæ³éãã§ãã XNUMX çªç®ã®æ¹ãå°ãéãã§ãã äœãããã£ãã·ã¥ãããŸããã XNUMXçªç®ãXNUMXçªç®ãXNUMXçªç®ã ãããããã³ããããŠãã®ãããªããšã ãããŠææªãªã®ã¯ãããã XNUMX åç®ã®å®è¡ã§èµ·ããããšã§ãã å®éã®å®è¡èšç»ãäœã§ããããç解ããã«ã¯ãæ£ç¢ºã« XNUMX åã®å®è¡ãå¿ èŠã§ããããšã誰ãç¥ã£ãŠããã§ããããã
誰ãæ眪ã§ããïŒ ã©ãããã®ïŒ ããŒã¿ããŒã¹ã«ã¯æé©åãå«ãŸããŠããŸãã ãããŠãäžè¬çãªã±ãŒã¹ã«æé©åãããŠããããã§ãã ãããã£ãŠãããæç¹ããã圌女ã¯äžè¬çãªãã©ã³ã«åãæ¿ããããšã«ãªããŸãããæ®å¿µãªãããããã¯ç°ãªãããšãå€æããå¯èœæ§ããããŸãã åãã«ãªããããããªãããéããããããªãã ãããŠããã®åäœã«ã€ãªããããçš®ã®ãããå€ãååšããŸãã
ããã«ã€ããŠäœãã§ããã§ããããïŒ ãã¡ãããããã§äœããä»®å®ããããšã¯ããã«å°é£ã§ãã ç§ãã¡ã䜿çšããç°¡åãªè§£æ±ºçããããŸãã ãã㯠+0ãOFFSET 0 ã§ãããã£ãšããªãã¯ãã®ãããªè§£æ±ºçãç¥ã£ãŠããŸãã ãããåãåã£ãŠãªã¯ãšã¹ãã«ã+0ããè¿œå ããã ãã§ããã¹ãŠåé¡ãããŸããã åŸã§çŽ¹ä»ããŸãã
ãããŠãå¥ã®ãªãã·ã§ã³ããããŸã - èšç»ããã泚ææ·±ãèŠãŠãã ããã éçºè ã¯ãªã¯ãšã¹ããæžãã ãã§ãªãããåæããŠèª¬æããŠãã ããããš 6 åèšããªããã°ãªããŸããã 5ã ãšæ©èœããŸããã
ãã㊠XNUMX çªç®ã®ãªãã·ã§ã³ããããŸã - pgsql-hackers ã«æçŽãæžããŸãã ãšæžããŸããããããããã°ãªã®ãä»æ§ãªã®ãã¯ãŸã äžæã§ãã
ããããã°ãªã®ãæ©èœãªã®ããèããªãããä¿®æ£ããŠã¿ãŸãããã ãªã¯ãšã¹ããåãå ¥ããŠã+0ããè¿œå ããŸãããã ãã¹ãŠé 調ã ã·ã³ãã«ã 0 ã€ããã°ããããã©ã®ãããªãã®ã§ãããããããäœã§ãããã«ã€ããŠèããå¿ èŠãããããŸããã ãšãŠãã·ã³ãã«ã§ãã ããŒã¿ããŒã¹ããã®åã®ã€ã³ããã¯ã¹ã䜿çšããããšãçŠæ¢ããã ãã§ãã ã+XNUMXãåã«ã¯ã€ã³ããã¯ã¹ããããŸãããããŒã¿ããŒã¹ã¯ã€ã³ããã¯ã¹ã䜿çšããªãã®ã§ããã¹ãŠåé¡ãããŸããã
ããã6ã€ã®èª¬æã®æ³åã§ãã çŸåšã®ããŒãžã§ã³ã§ã¯ããã€ã³ããããå€æ°ãããå Žåãããã 6 åå®è¡ããå¿ èŠããããŸãã ãã€ã³ããããå€æ°ããªãå Žåã¯ããããè¡ãããŸãã ãããŠæçµçã«ã¯ããŸãã«ãã®ãªã¯ãšã¹ãã倱æããŸãã ããã¯é£ããããšã§ã¯ãããŸããã
ã©ããŸã§å¯èœã§ããïŒ ããã«ããã°ããããã«ããã°ã å®éããã°ã¯ã©ãã«ã§ãååšããŸãã
詳ããèŠãŠã¿ãŸãããã ããšãã°ãXNUMX ã€ã®ã¹ããŒãããããŸãã ã¹ããŒã A ãšããŒãã« Sãå³ B ãšããŒãã« Sã ã¯ãšãª - ããŒãã«ããããŒã¿ãéžæããŸãã ãã®å ŽåãäœãåŸãããã§ããããïŒ ãšã©ãŒãçºçããŸãã äžèšã®ãã¹ãŠããçšæããããŸãã ã«ãŒã«ã¯ããã°ã¯ã©ãã«ã§ããããŸãããäžèšã®ãã¹ãŠã解決ãããšããããšã§ãã
ããã§åé¡ãšãªãã®ã¯ãããªãã§ãã?ããšããããšã§ãã ã¹ããŒããããå ŽåãããŒãã«ãæ¢ãå Žæã瀺ããsearch_pathãå€æ°ããããšããããã¥ã¡ã³ããããããã§ãã å€æ°ãããããã§ãã
äœãåé¡ã§ããïŒ åé¡ã¯ããµãŒããŒã§æºåãããã¹ããŒãã¡ã³ãããsearch_path ã誰ãã«ãã£ãŠå€æŽãããå¯èœæ§ãããããšãçããªãããšã§ãã ãã®å€ã¯ãããã°ããŒã¿ããŒã¹ã«å¯ŸããŠäžå®ã®ãŸãŸã§ãã ãŸããäžéšã®éšåã¯æ°ããæå³ãæããããªãå¯èœæ§ããããŸãã
ãã¡ãããããã¯ãã¹ãããŠããããŒãžã§ã³ã«ãã£ãŠç°ãªããŸãã ããŒãã«ã®éããã©ãã»ã©æ·±å»ãã«ãã£ãŠç°ãªããŸãã ãŸããããŒãžã§ã³ 9.1 ã§ã¯å€ãã¯ãšãªãå®è¡ãããã ãã§ãã æ°ããããŒãžã§ã³ã§ã¯ãã°ãæ€åºããããã°ãããããšãéç¥ãããå ŽåããããŸãã
æ²»çæ¹æ³ã¯ïŒ ç°¡åãªã¬ã·ãããããŸãããããã¯ãããŠãã ããã ã¢ããªã±ãŒã·ã§ã³ã®å®è¡äžã« search_path ãå€æŽããå¿ èŠã¯ãããŸããã å€æŽããå Žåã¯ãæ°ããæ¥ç¶ãäœæããããšããå§ãããŸãã
è°è«ããããšãã§ããŸããã€ãŸããéããè°è«ãããè¿œå ããããšãã§ããŸãã ããããã誰ããå€ãå€æŽãããšããããŒã¿ããŒã¹ã¯ãã®ããšãã¯ã©ã€ã¢ã³ãã«äŒããã¹ãã§ãããšããŒã¿ããŒã¹éçºè ã説åŸã§ãããããããŸããã ããããã¹ããŒãã¡ã³ãããªã»ããããŠåäœæããå¿ èŠãããã§ãããã?ã çŸåšãããŒã¿ããŒã¹ã¯ç§å¯è£ã«åäœããã¹ããŒãã¡ã³ããå éšã®ã©ããã§å€æŽãããããšãäžåå ±åããŸããã
ããäžåºŠåŒ·èª¿ããŠãããŸããããã㯠Java ã§ã¯äžè¬çã§ã¯ãªãããšã§ãã PL/pgSQL ã§ãåãããšã XNUMX 察 XNUMX ã§èŠãããŸãã ããããããã§ãåçŸãããŠããŸãã®ã§ãã
ããã«ããŒã¿éžæãè©ŠããŠã¿ãŸãããã ç§ãã¡ã¯éžæããéžæããŸãã 128äžè¡ã®ããŒãã«ããããŸãã åè¡ã¯ XNUMX ãããã€ãã§ãã çŽã®ã¬ãã€ãã®ããŒã¿ã Java ãã·ã³ã«ã¯ XNUMX ã¡ã¬ãã€ãã®äœæ¥ã¡ã¢ãªããããŸãã
ãã¹ãŠã®æžç±ã§æšå¥šãããŠããããã«ãç§ãã¡ã¯ã¹ããªãŒã åŠçã䜿çšããŸãã ã€ãŸããresultSet ãéããŠãããããããŒã¿ãå°ããã€èªã¿èŸŒã¿ãŸãã ããŸããããŸããïŒ èšæ¶ããæ¶ããŠããŸãã®ã§ããããïŒ å°ãèªãã§ã¿ãŸããïŒ ããŒã¿ããŒã¹ãä¿¡é ŒããŸããããPostgres ãä¿¡é ŒããŸãããã ç§ãã¡ã¯ãããä¿¡ããŸããã ã¡ã¢ãªããèœã¡ãŠããŸãã®ã§ããããïŒ OutOfMemory ãçµéšããã®ã¯èª°ã§ãã? ãã®åŸèª°ããããä¿®æ£ã§ããã§ããããïŒ èª°ããããããªããšãä¿®æ£ããŠãããŸããã
XNUMX äžè¡ããå Žåããã éžæããããšã¯ã§ããŸããã OFFSET/LIMIT ã¯å¿ é ã§ãã ãã®ãªãã·ã§ã³ã«è³æãã人ã¯èª°ã§ãã? autoCommit ã䜿çšããããšã«è³æããŠããã®ã¯èª°ã§ãããã?
ããã§ã¯ããã€ãã®ããã«ãæãäºæ³å€ã®éžæè¢ãæ£ããããšãå€æããŸãã ãŸããçªç¶ autoCommit ããªãã«ããå Žåã«ã圹ç«ã¡ãŸãã äœæ ã§ããïŒ ç§åŠã¯ããã«ã€ããŠç¥ããŸããã
ãã ããããã©ã«ãã§ã¯ãPostgres ããŒã¿ããŒã¹ã«æ¥ç¶ããŠãããã¹ãŠã®ã¯ã©ã€ã¢ã³ããããŒã¿å šäœãååŸããŸãã ãã®ç¹ã§ã¯ PgJDBC ãäŸå€ã§ã¯ãªãããã¹ãŠã®è¡ãéžæããŸãã
FetchSize ããŒãã«ã¯ããªãšãŒã·ã§ã³ããããŸããã€ãŸããå¥ã®ã¹ããŒãã¡ã³ãã®ã¬ãã«ã§ãããã§ã¯ããŒã¿ã 10ã50 ãã€éžæããŠãã ãããšèšãããšãã§ããŸãããã ãããã㯠autoCommit ããªãã«ãããŸã§æ©èœããŸããã autoCommit ããªãã«ãããšãåäœãéå§ãããŸãã
ããããã³ãŒãã調ã¹ãŠããããå Žæã« setFetchSize ãèšå®ããã®ã¯äžäŸ¿ã§ãã ãããã£ãŠãæ¥ç¶å šäœã®ããã©ã«ãå€ã瀺ãèšå®ãäœæããŸããã
ãããç§ãã¡ãèšã£ãããšã§ãã ãã©ã¡ãŒã¿ãèšå®ãããŸããã ãããŠäœãåŸãããã§ããããïŒ å°éãéžæããå Žåãããšãã°äžåºŠã« 10 è¡ãéžæãããšãéåžžã«å€§ããªãªãŒããŒããã ã³ã¹ããçºçããŸãã ãããã£ãŠããã®å€ã¯çŽ XNUMX ã«èšå®ããå¿ èŠããããŸãã
ãã¡ãããçæ³çã«ã¯ããã€ãåäœã§å¶éããæ¹æ³ãåŠã¶å¿ èŠããããŸããããã®ã¬ã·ãã¯æ¬¡ã®ãšããã§ããdefaultRowFetchSize ã XNUMX ãè¶ ããå€ã«èšå®ããã°æºè¶³ã§ãã
ããŒã¿ã®æ¿å ¥ã«é²ã¿ãŸãããã æ¿å ¥ã¯ç°¡åã§ãããŸããŸãªãªãã·ã§ã³ããããŸãã ããšãã°ãINSERTãVALUES ãªã©ã§ãã ããã¯è¯ãéžæè¢ã§ãã ãINSERT SELECTããšèšãããšãã§ããŸãã å®éã«ã¯åãããšã§ãã æ§èœã«éãã¯ãããŸããã
æ¬ã«ã¯ Batch ã¹ããŒãã¡ã³ããå®è¡ããå¿ èŠããããšæžãããŠããŸãããæ¬ã«ã¯ããã€ãã®æ¬åŒ§ã䜿çšããŠããè€éãªã³ãã³ããå®è¡ã§ãããšæžãããŠããŸãã Postgres ã«ã¯çŽ æŽãããæ©èœããããŸããCOPY ãå®è¡ã§ãããã€ãŸããããé«éã«å®è¡ã§ããŸãã
枬å®ããŠã¿ããšããŸãé¢çœãçºèŠãã§ããŸãã ãããã©ã®ããã«æ©èœããããã§ãããã? äžèŠãªã³ãã³ãã解æãããå®è¡ãããããããªãã®ã§ãã
å®éã«ã¯ãTCP ã§ã¯ãããè¡ãããšã¯ã§ããŸããã ã¯ã©ã€ã¢ã³ãããªã¯ãšã¹ãã®éä¿¡ã§å¿ããå ŽåãããŒã¿ããŒã¹ã¯å¿çãéä¿¡ããããšããŠãªã¯ãšã¹ããèªã¿åããŸããã æçµçã«ãã¯ã©ã€ã¢ã³ãã¯ããŒã¿ããŒã¹ããªã¯ãšã¹ããèªã¿åãã®ãåŸ ã¡ãããŒã¿ããŒã¹ã¯ã¯ã©ã€ã¢ã³ããå¿çãèªã¿åãã®ãåŸ ã¡ãŸãã
ãããã£ãŠãã¯ã©ã€ã¢ã³ãã¯å®æçã«åæãã±ãããéä¿¡ããå¿ èŠããããŸãã äœåãªãããã¯ãŒã¯ ã€ã³ã¿ã©ã¯ã·ã§ã³ãçºçããäœåãªæéã®ç¡é§ãçºçããŸãã
ãããŠãããããè¿œå ããã°ããã»ã©ãç¶æ³ã¯æªåããŸãã ãã©ã€ããŒã¯éåžžã«æ²èŠ³çã§ãè¡ã®ãµã€ãºãªã©ã«å¿ããŠãçŽ 200 è¡ã« XNUMX åãªã©ãéåžžã«é »ç¹ã«è¿œå ããŸãã
ãã£ã 10 è¡ä¿®æ£ããã ãã§ããã¹ãŠã 128 åé«éåãããããšããããŸãã ããã¯èµ·ãããŸãã ãªãïŒ ãã€ãã®ããã«ããã®ãããªå®æ°ã¯ãã§ã«ã©ããã§äœ¿çšãããŠããŸãã ãŸããå€ãXNUMXãã¯ãããåŠçã䜿çšããªãããšãæå³ããŸãã
ãããæ£åŒçã«å«ãŸããŠããªãã®ã¯è¯ãããšã§ãã çºå£²éå§åã«çºèŠãããŸããã ç§ãäžããæå³ã¯ãã¹ãŠçŸä»£çã«åºã¥ããŠããŸãã
è©ŠçããŠã¿ãŸãããã InsertBatch ãç°¡åã«æž¬å®ããŸãã InsertBatch ãè€æ°å枬å®ããŸããã€ãŸããåãããšã§ãããå€ãã®å€ããããŸãã ããªãããŒãªåãã 誰ãããããå®è¡ã§ããããã§ã¯ãããŸããããéåžžã«åçŽãªæäœã§ãããCOPY ãããã¯ããã«ç°¡åã§ãã
COPYãã§ããŸãã
ãããŠããããæ§é äœã«å¯ŸããŠè¡ãããšãã§ããŸãã ãŠãŒã¶ãŒã®ããã©ã«ãã®åã宣èšããé åãš INSERT ãããŒãã«ã«çŽæ¥æž¡ããŸãã
ãªã³ã¯ pgjdbc/ubenchmsrk/InsertBatch.java ãéããšããã®ã³ãŒãã GitHub ã«ãããŸãã ããã§çæããããªã¯ãšã¹ããå ·äœçã«ç¢ºèªã§ããŸãã ããã¯åé¡ã§ã¯ãããŸããã
ç«ã¡äžããŸããã ãããŠç§ãã¡ãæåã«æ°ã¥ããã®ã¯ããããã䜿çšããªããšããããšã¯åçŽã«äžå¯èœã§ãããšããããšã§ããã ãã¹ãŠã®ãããåŠçãªãã·ã§ã³ã¯ãŒãã§ããã€ãŸããXNUMX åéãã®å®è¡ãšæ¯èŒããŠå®è¡æéã¯å®è³ªçã«ãŒãã§ãã
ããŒã¿ãæ¿å ¥ããŠãããŸãã ãšãŠãã·ã³ãã«ãªããŒãã«ã§ãã XNUMX ã€ã®åã ããã§äœãèŠããã§ããããïŒ ããã XNUMX ã€ã®ãªãã·ã§ã³ã¯ãã¹ãŠã»ãŒåçã§ããããšãããããŸãã ãã¡ãã COPY ã®æ¹ãåªããŠããŸãã
ããŒã¹ãæ¿å ¥ãããšãã§ãã 10 ã€ã® VALUES å€ã1 ã€ã® VALUES å€ã2 ã€ã® VALUES å€ããŸãã¯ã«ã³ãã§åºåããã 4 åã® VALUES å€ã瀺ããå Žåã ããã§ã¡ããã©æ°Žå¹³ã«ãªããŸããã 128ãXNUMXãXNUMXãXNUMXãéã§æãããäžæ¬æ¿å ¥ã«ããã圌ã®æ°åãããªãè¯ããªã£ãŠããããšãããããŸãã ã€ãŸããäžåºŠã« XNUMX ã€ãã€æ¿å ¥ããå Žåã§ããäžåºŠã« XNUMX ã€æ¿å ¥ããå Žåã§ããVALUES ã«ããå°ãè©°ã蟌ãã ã ãã§ãå¹æ㯠XNUMX åã«ãªããŸãã EXECUTE æäœãå°ãªããªããŸãã
å°èŠæš¡ãªããªã¥ãŒã 㧠COPY ã䜿çšããããšã¯éåžžã«æåŸ ã§ããŸããã æåã®XNUMXæã¯æããŠãŸããã§ããã 圌ãã¯å€©åœã«è¡ããŸããã€ãŸããã³ããŒçšã®ãããã®ç·è²ã®æ°åã§ãã
COPY ã¯ãå°ãªããšã XNUMX è¡ã®ããŒã¿ãããå Žåã«äœ¿çšããå¿ èŠããããŸãã ãã®æ¥ç¶ãéãéã®ãªãŒããŒãããã¯å€§ãããªããŸãã æ£çŽã«èšããšãç§ã¯ãã®æ¹åã«é²ãã§ããŸããã§ããã Batch ã¯æé©åããŸããããCOPY ã¯æé©åããŸããã§ããã
次ã¯äœãããã®ïŒ è©ŠçããŠã¿ãŸããã ç§ãã¡ã¯ãæ§é ããè€æ°ã®æå³ãçµã¿åãããè³¢ãæ¹æ³ã®ããããã䜿çšããå¿ èŠãããããšãç解ããŠããŸãã
ä»æ¥ã®ã¬ããŒãããäœãåŠã¹ã°ããã§ãããã?
- PreparedStatement ããã¹ãŠã§ãã ããã«ãããçç£æ§ãå€§å¹ ã«åäžããŸãã è»èã«å€§ããªãããããçããŸãã
- ãããŠEXPLAIN ANALYZEã6åè¡ãå¿ èŠããããŸãã
- ãããŠãåé¡ã®ããã¯ãšãªã®æ®ãã®å²åãä¿®æ£ããã«ã¯ãOFFSET 0 ãèãã+0 ãªã©ã®ããªãã¯ãè¡ãå¿ èŠããããŸãã
åºæïŒ habr.com