ã·ã£ãŒãã£ã³ã°ãšããŒãã£ã·ã§ã³åå²ã«ããããŒã¿ããŒã¹ã®ã¹ã±ãŒãªã³ã°
ããã¹ã»ã€ã¯ããïŒ2GISïŒ
ã¿ãªããããã«ã¡ã¯ïŒ ç§ã®ååã¯Denis Ivanovã§ããã·ã£ãŒãã£ã³ã°ãšããŒãã£ã·ã§ã³åå²ã«ããããŒã¿ããŒã¹ã®ã¹ã±ãŒãªã³ã°ã«ã€ããŠèª¬æããŸãã ãã®ã¬ããŒãã®åŸã誰ããããŒãã£ãŒãããããäœããç Žçã«ããå¿ èŠããããŸããããªãã¯ãããéåžžã«ç°¡åã§ãé£ã¹ç©ããŸã£ããèŠæ±ãããæ©èœãããã¹ãŠãããŸãããããšãç解ããã§ãããã
ç§èªèº«ã«ã€ããŠå°ãã話ããŸããç§ã¯2GISã®WebAPIããŒã ã§åããŠãããçµç¹ã«APIãæäŸããŠããŸããããŸããŸãªããŒã¿ãããã8ãåœã250ã®å€§éœåžã5äžã®éèœããããŸãã ããªã倧ããªè² è·ããããŸã-ã¢ã¯ãã£ããªãŠãŒã¶ãŒã¯æããã2500äžäººã§ãå¹³åããŠçŽ2000 RPSã®è² è·ãAPIã«ããããŸãã ãããã¯ãã¹ãŠ3ã€ã®ããŒã¿ã»ã³ã¿ãŒã«ãããŸãã
ä»æ¥è§£æ±ºããåé¡ã«ç§»ããŸãããã åé¡ã®1ã€ã¯ã倧éã®ããŒã¿ã§ãã ç¹å®ã®ãããžã§ã¯ããéçºããŠãããšãã倧éã®ããŒã¿ãããããšããã€ã§ãçºçããå¯èœæ§ããããŸãã ããžãã¹ãæ©èœããå Žåãããã¯ãéããããããŸãã ãããã£ãŠããããã®èŠæ±ã¯éåžžã«é·ãæéå®è¡ããå§ãããµãŒããŒã¯ç§ãã¡ãããšã¯ã¹ããŒãããªããããããå€ãã®ããŒã¿ãããå€ãã®ãéãããã³ãã®ããŒã¿ã§äœããè¡ãå¿ èŠããããŸãã ãã®ããŒã¿ãã©ãåŠçãããã«å¯Ÿãã1ã€ã®ãœãªã¥ãŒã·ã§ã³ã¯ãããŒã¿ããŒã¹ãæ¡åŒµããããšã§ãã
ã·ã£ãŒãã£ã³ã°ã«ã€ããŠè©³ãã説æããŸãã 瞊ãšæšªã§ãã ã¬ããªã±ãŒã·ã§ã³ã®ãããªã¹ã±ãŒãªã³ã°ã®æ¹æ³ããããŸãã Sphinxã®Andrei Aksenovã«ããã¬ããŒãã How MySQL Replication Works ãã¯ãããã«é¢ãããã®ã§ããã ãã®ãããã¯ã«ã€ããŠã¯ã»ãšãã©èª¬æããŸããã
ããŒãã£ã·ã§ãã³ã°ïŒåçŽã·ã£ãŒãã£ã³ã°ïŒã®ãããã¯ã«ç§»ããŸãããã ããã¯ãã¹ãŠã©ã®ããã«èŠããŸããïŒ
ããšãã°ããŠãŒã¶ãŒãå«ã倧ããªããŒãã«ããããŸã-å€ãã®ãŠãŒã¶ãŒãããŸãã ããŒãã£ã·ã§ã³åãšã¯ãããååã«åŸã£ãŠã1ã€ã®å€§ããªããŒãã«ãå€æ°ã®å°ããªããŒãã«ã«åå²ããããšã§ãã
æ°Žå¹³ã·ã£ãŒãã£ã³ã°ã§ã¯ããã¹ãŠãã»ãŒåãã§ãããåæã«ããã¬ãŒãã¯ä»ã®ã€ã³ã¹ã¿ã³ã¹ã®ç°ãªãããŒã¹ã«ãããŸãã
æ°Žå¹³ã¹ã±ãŒãªã³ã°ãšåçŽã¹ã±ãŒãªã³ã°ã®å¯äžã®éãã¯ãæ°Žå¹³ã¹ã±ãŒãªã³ã°ã«ãã£ãŠç°ãªãã€ã³ã¹ã¿ã³ã¹ã«ããŒã¿ãåæ£ãããããšã§ãã
ã¬ããªã±ãŒã·ã§ã³ã«ã€ããŠã¯åæ¢ããŸãããããã§ã¯ãã¹ãŠãéåžžã«ç°¡åã§ãã
ãã®ãããã¯ãããã«æ·±ãæãäžããPostgresã®äŸã䜿çšããŠããŒãã£ã·ã§ã³åã«é¢ããã»ãšãã©ãã¹ãŠã®ããšã説æããŸãã
åçŽãªã¿ãã¬ãããèŠãŠã¿ãŸãããã確ãã«ããããžã§ã¯ãã®ã»ãŒ99ïŒ ããã®ãããªã¿ãã¬ãããæã£ãŠããŸããããã¯ãã¥ãŒã¹ã§ãã
ãã¥ãŒã¹ã«ã¯èå¥åãããããã®ãã¥ãŒã¹ã眮ãããŠããã«ããŽãªãããããã¥ãŒã¹ã®èè ããã®è©äŸ¡ãããçš®ã®èŠåºãããããŸã-å®å šã«æšæºçãªè¡šãè€éãªãã®ã¯ãããŸããã
ãã®ããŒãã«ãè€æ°ã«åå²ããæ¹æ³ã¯ïŒ ã©ãããå§ããŸããïŒ
åèšã§ããã¬ãŒãäžã§2ã€ã®ã¢ã¯ã·ã§ã³ãå®è¡ããå¿ èŠããããŸããããã¯ãnews_1ãªã©ã®ã·ã£ãŒãã«å ¥ããŠããã¥ãŒã¹ããŒãã«ã«ç¶æ¿ãããããã«ããããã§ãã ãã¥ãŒã¹ã¯ããŒã¹ããŒãã«ã«ãªããæ§é å šäœãå«ãŸããŸããããŒãã£ã·ã§ã³ãäœæãããšãã«ãããŒã¹ããŒãã«ã«ç¶æ¿ãããããšã瀺ããŸãã ç¶æ¿ãããããŒãã«ã«ã¯ã芪ã®ãã¹ãŠã®åïŒæå®ããããŒã¹ããŒãã«ïŒãå«ãŸããŸãããŸããç¬èªã®åãè¿œå ããããšãã§ããŸãã ããã¯å®å šãªããŒãã«ã«ãªããŸããã芪ããç¶æ¿ããã芪ããã®å¶éãã€ã³ããã¯ã¹ããŸãã¯ããªã¬ãŒã¯ãããŸãã-ããã¯éåžžã«éèŠã§ãã ããŒã¹ããŒãã«ã«ã€ã³ããã¯ã¹ãäœæããŠç¶æ¿ããå Žåãç¶æ¿ãããã€ã³ããã¯ã¹ããŒãã«ã«ã€ã³ããã¯ã¹ãå¶éããŸãã¯ããªã¬ãŒã¯ãããŸããã
å®è¡ãã2çªç®ã®ã¢ã¯ã·ã§ã³ã¯ãå¶éãèšå®ããããšã§ãã ããã¯ããã®å±æ§ãæã€ããŒã¿ããã®ããŒãã«ã«ã®ã¿å ¥ãããšã確èªãããã®ã§ãã
ãã®å Žåãå±æ§ã¯category_id = 1ãã€ãŸã category_id = 1ã®ãšã³ããªã®ã¿ããã®ããŒãã«ã«åé¡ãããŸãã
ããŒãã£ã·ã§ã³ããŒãã«ã«ã¯ã©ã®ãããªçš®é¡ã®ãã§ãã¯ããããŸããïŒ
å³å¯ãªæå³ããããŸãã ãã£ãŒã«ããšæããã«çãããã£ãŒã«ãããããŸãã å€ã®ãªã¹ãããããŸã-ããã¯ãªã¹ãã®ãšã³ããªã§ããããšãã°ããã®ç¹å®ã®ããŒãã£ã·ã§ã³ã«ãã¥ãŒã¹ã®3人ã®äœæè ã眮ãããšãã§ããå€ã®ç¯å²ããããŸã-ããã¯ãããŒã¿ãä¿åãããå€ãšå€ã§ãã
ãã§ãã¯ã¯BETWEENæŒç®åã«ãã£ãŠãµããŒããããŠãããããããã§ããã«è©³ãã説æããå¿ èŠããããŸãã
ãããŠãããªãã¯ããããšãŠãç°¡åã«ããããšãã§ããŸãã ããããã§ããŸããã ç§ãã¡ã¯ãããè¡ãããšãèš±å¯ãããŠãããããPostgreSQLã¯ããããµããŒãããŠããŸãã ã芧ã®ãšãããæåã®ããŒãã£ã·ã§ã³ã§ã¯100ã200ã®ããŒã¿ãååŸãã2çªç®ã®ããŒãã£ã·ã§ã³ã§ã¯200ã300ã®ããŒã¿ãååŸããŸãããããã®ããŒãã£ã·ã§ã³ã®ãã¡ã200ã®ã¬ãŒãã£ã³ã°ã®ã¬ã³ãŒããååŸããã®ã¯ã©ãã§ããã ã©ãã»ã©å¹žéãã¯ããããŸããã ãããã£ãŠãããã¯å®è¡ã§ããŸãããå³å¯ãªå€ãæå®ããå¿ èŠããããŸãã å³å¯ã«ã¯æåã®ããŒãã£ã·ã§ã³ã§ã¯100ãè¶ ã200以äžã®å€ã«ãªãã2çªç®ã®ããŒãã£ã·ã§ã³ã§ã¯200ãè¶ ããã200ã§ã¯ãªãã300以äžã«ãªããŸãã
ã©ã®ããŒãã£ã·ã§ã³ãããŒã¿ãååŸãããããããªãã®ã§ãããã¯èŠããŠããå¿ èŠããããŸãã ãã¹ãŠã®æ€èšŒæ¡ä»¶ãæ確ã«è¿°ã¹ãå¿ èŠããããŸãã
ãŸããç°ãªããã£ãŒã«ãã«ããŒãã£ã·ã§ã³ãäœæããªãã§ãã ããã 1çªç®ã®ããŒãã£ã·ã§ã³ã§ã¯category_id = 1ã®ãšã³ããªãååŸãã2çªç®ã®ããŒãã£ã·ã§ã³ã§ã¯100ã®è©äŸ¡ãååŸããŸãã
ç¹°ãè¿ããŸãããcategory_id = 1ããã³rating = 100ã®ãããªãšã³ããªãååŸããå Žåããã®ã¬ã³ãŒããã©ã®ããŒãã£ã·ã§ã³ã«åé¡ããããã¯ããããŸããã ããŒãã£ã·ã§ãã³ã°ã¯ã1ã€ã®æ©èœã1ã€ã®ãã£ãŒã«ãã«åºã¥ããŠããŸã-ããã¯éåžžã«éèŠã§ãã
ããŒãã£ã·ã§ã³å šäœãèŠãŠã¿ãŸãããã
ããŒãã£ã·ã§ã³ããŒãã«ã¯æ¬¡ã®ããã«ãªããŸãã ããã¯ãcategory_id = 1ã®ã¬ã³ãŒãã®ã¿ãããã«å°éãããšããèšå·ãä»ããnews_1ããŒãã«ã§ããããã®ããŒãã«ã¯ããŒã¹ããŒãã«newsããç¶æ¿ãããŸãããã¹ãŠãéåžžã«åçŽã§ãã
ã¡ã€ã³ããŒãã«ãã¥ãŒã¹ãæäœãããšãã«ãcategory_id = 1ã®ã¬ã³ãŒããžã®æ¿å ¥ãã¡ã€ã³ããŒãã£ã·ã§ã³ã§ã¯ãªããã®ããŒãã£ã·ã§ã³ã«åé¡ãããããã«ãããŒã¹ããŒãã«ã«ã«ãŒã«ãè¿œå ããå¿ èŠããããŸãã åçŽãªã«ãŒã«ãæå®ããå¿ èŠãªãã®ãåŒã³åºããŸããcategory_id= 1ã§ãã¥ãŒã¹ã«ããŒã¿ãæ¿å ¥ããããšã代ããã«news_1ã«ããŒã¿ãæ¿å ¥ãããŸãã ããã§ãããã¹ãŠãéåžžã«åçŽã§ãããã³ãã¬ãŒãã«ãããšããã¹ãŠãå€æŽãããçŽ æŽãããåäœãããŸãã ãã®ã«ãŒã«ã¯ããŒã¹ããŒãã«ã«äœæãããŸãã
ãããã£ãŠãå¿ èŠãªããŒãã£ã·ã§ã³ã®æ°ãéå§ããŸãã ããšãã°ãç°¡åã«ããããã«2ã€ã®ããŒãã£ã·ã§ã³ã䜿çšããŸãã ã€ãŸã ãã®ããŒãã«ã®ååãšããŒã¿ãå°éããæ¡ä»¶ãé€ããŠããã¹ãŠåãã§ãã ãŸããåããŒãã«ã«é©åãªãã³ãã¬ãŒãã«ãŒã«ãèšå®ããŸãã
ããŒã¿æ¿å ¥ã®äŸãèŠãŠã¿ãŸãããã
éåžžã®å€§ããªå€ªãããŒãã«ãããããã«ãéåžžã©ããããŒã¿ãæ¿å ¥ããŸãã category_id = 2ã®category_id = 1ã®ã¬ã³ãŒããæ¿å ¥ããcategory_id = 3ã®ããŒã¿ãæ¿å ¥ããããšãã§ããŸãã
ããã§ãããŒã¿ãéžæããŸãããã¹ãŠæã£ãŠããŸãïŒ
3çªç®ã®ããŒãã£ã·ã§ã³ã¯ãããŸããããããŒã¿ã¯ãããŸãããæ¿å ¥ãããã®ãã¹ãŠã ããã«ã¯ã¡ãã£ãšããéæ³ããããããããŸããããããã§ã¯ãããŸããã
ç¹å®ã®ããŒãã£ã·ã§ã³ã«é©åãªãªã¯ãšã¹ããè¡ãããšãã§ããŸããã€ãŸããcategory_id = 1ããŸãã¯çªå·ïŒ2ã3ïŒã®åºçŸãæ¡ä»¶ãšããŠç€ºããŸãã
ãã¹ãŠãããŸãæ©èœãããã¹ãŠã®ããŒã¿ãéžæãããŸãã ç¹°ãè¿ããŸãããcategory_id = 3ã®ããŒãã£ã·ã§ã³ã¯ãããŸãããã
ããŒãã£ã·ã§ã³ããçŽæ¥ããŒã¿ãéžæã§ããŸã-ããã¯åã®äŸãšåãã§ãããå¿ èŠãªããŒãã£ã·ã§ã³ãæ確ã«ç€ºããŸãã ãã®ç¹å®ã®ããŒãã£ã·ã§ã³ããããŒã¿ãéžæããå¿ èŠããããšããæ£ç¢ºãªæ¡ä»¶ãããå Žåããã®ç¹å®ã®ããŒãã£ã·ã§ã³ãçŽæ¥æå®ããä»ã®ããŒãã£ã·ã§ã³ã«ç§»åããããšã¯ã§ããŸããã ãããã3çªç®ã®ããŒãã£ã·ã§ã³ã¯ãªããããŒã¿ã¯ã¡ã€ã³ããŒãã«ã«éãããŸãã
ãã®ããŒãã«ã«ããŒãã£ã·ã§ã³åå²ãé©çšããŸããããã¡ã€ã³ããŒãã«ã¯ãŸã ååšããŠããŸãã ããã¯å®éã®ããŒãã«ã§ãããããŒã¿ãæ ŒçŽã§ããŸããONLYæŒç®åã䜿çšãããšããã®ããŒãã«ããã®ã¿ããŒã¿ãéžæã§ãããã®ã¬ã³ãŒããããã«é ãããŠããããšãããããŸãã
ããã§ãã¹ã©ã€ããèŠããšãããããã«ãããŒãã£ã·ã§ã³ã«ããŒã¿ãçŽæ¥æ¿å ¥ã§ããŸãã ã¡ã€ã³ããŒãã«ã«ã«ãŒã«ã䜿çšããŠããŒã¿ãæ¿å ¥ã§ããŸãããããŒãã£ã·ã§ã³èªäœã«ãæ¿å ¥ã§ããŸãã
ããšãã°ãcategory_id = 4ã®ãããªå€éšæ¡ä»¶ã®ããããŒãã£ã·ã§ã³ã«ããŒã¿ãæ¿å ¥ãããšãããã®ãããªããŒã¿ã¯ããã«æ¿å ¥ã§ããŸããããšãããšã©ãŒã衚瀺ãããŸãããããéåžžã«äŸ¿å©ã§ããæ¬åœã«å¿ èŠã§ããäœãåé¡ãçºçããå Žåã¯ãåºæ¬ã¬ãã«ã§ãã¹ãŠãææ¡ããŸãã
ããã¯ãã£ãšå€§ããªäŸã§ãã bulk_insertãã€ãŸã è€æ°ã®ã¬ã³ãŒããåæã«æ¿å ¥ãããšããããã¯ãã¹ãŠç®çã®ããŒãã£ã·ã§ã³ã®ã«ãŒã«ã䜿çšããŠé åžãããŸãã ã€ãŸã ç§ãã¡ã¯ãŸã£ããæ°ã«ããããšã¯ã§ããŸãããç§ãã¡ãåããŠããããã«ãç§ãã¡ã®ããŒãã«ã§äœæ¥ããŠãã ããã ã¢ããªã±ãŒã·ã§ã³ã¯åŒãç¶ãåäœããŸãããåæã«ããŒã¿ãããŒãã£ã·ã§ã³ã«åé¡ãããããããã¹ãŠããåå ããã«æ£ã«ããŸãé 眮ãããŸãã
æ¡ä»¶ä»ãã®ã¡ã€ã³ããŒãã«ããããŒã¿ãéžæã§ããããšãæãåºãããŠãã ããããã®æ¡ä»¶ã瀺ãããšãªããããŒãã£ã·ã§ã³ããããŒã¿ãéžæã§ããŸãã ããã次ã®ããã«èŠãããã®ïŒ
ããŒã¿ã¯ãŸã ããã«å°éããããšãã§ããããŒãã£ã·ã§ã³ããšã®ã¹ãã£ã³ããããããããŒãã«å šäœã§Seqã¹ãã£ã³ãè¡ãããŸãã è€æ°ã®ã«ããŽãªã®æ¡ä»¶ãæå®ãããšãæ¡ä»¶ã®ããããŒãã«ã®ã¿ãã¹ãã£ã³ãããŸãã 圌ã¯ããŒãã£ã·ã§ã³ã®æ®ãã®éšåãèŠãŸããã ããããªããã£ãã€ã¶ãŒã®ä»çµã¿ã§ã-ããã§ãããããã£ãŠãéåžžã«é«éã§ãã
ExplainãããŒãã£ã·ã§ã³èªäœã§ã©ã®ããã«èŠãããã確èªã§ããŸãã
ããã¯éåžžã®ããŒãã«ã§ãSeq Scanã ãã§ãè¶ èªç¶çãªãã®ã§ã¯ãããŸããã æŽæ°ãšåé€ãåãããã«æ©èœããŸãã ã¡ã€ã³ããŒãã«ãæŽæ°ã§ããŸãããŸããæŽæ°ãããŒãã£ã·ã§ã³ã«çŽæ¥éä¿¡ããããšãã§ããŸãã åé€ãæ©èœããŸãã æ¿å ¥ã§äœæããã®ãšåãã«ãŒã«ã§äœæããå¿ èŠããããŸãããæ¿å ¥ã§ã¯ãªãæŽæ°ãŸãã¯åé€ãæžã蟌ã¿ãŸãã
ã€ã³ããã¯ã¹ã®ãããªãã®ã«ç§»ããŸãããã
ã¡ã€ã³ããŒãã«ã§äœæãããã€ã³ããã¯ã¹ã¯ãããŒãã£ã·ã§ã³ã®åããŒãã«ã§ã¯ç¶æ¿ãããŸããã ããã¯æ²ããããšã§ããããã¹ãŠã®ããŒãã£ã·ã§ã³ã«åãã€ã³ããã¯ã¹ãäœæããå¿ èŠããããŸãã ããã«ã€ããŠããã¹ãããšããããŸããããã¹ãŠã®ã€ã³ããã¯ã¹ããã¹ãŠã®å¶éãéå§ãããã¹ãŠã®ããŒãã«ã§ãã¹ãŠã®ããªã¬ãŒãè€è£œããå¿ èŠããããŸãã
èªå® ã§ãã®åé¡ã«ã©ã®ããã«åãçµãã ãã çŽ æŽããããŠãŒãã£ãªãã£PartitionMagicãäœæããŸããããã®ãŠãŒãã£ãªãã£ã䜿çšãããšãã€ã³ããã¯ã¹ã®äœæãååšããªãããŒãã£ã·ã§ã³ã®ããªã¬ãŒãçºçããå¯èœæ§ã®ããåé¡ãæ°ã«ããããšãªããããŒãã£ã·ã§ã³ãèªåçã«ç®¡çã§ããŸãã ãã®ãŠãŒãã£ãªãã£ã¯ãªãŒãã³ãœãŒã¹ã§ããã以äžã®ãªã³ã¯ããããŸãã ããŒã¿ããŒã¹ã«ã¹ãã¢ãããã·ãŒãžã£ãšããŠãã®ãŠãŒãã£ãªãã£ãè¿œå ããŸããè¿œå ã®æ¡åŒµæ©èœã¯äžèŠã§ãæ¡åŒµæ©èœã¯äžèŠã§ããåæ§ç¯ããå¿ èŠã¯ãããŸããã éåžžã®æé ã§ããPostgreSQLã䜿çšããŠãããŒã¿ããŒã¹ã«ããã·ã¥ããŠæäœããŸãã
ããã«ç§ãã¡ã調ã¹ãã®ãšåãããŒãã«ããããŸãããæ°ãããã®ã¯äœããããŸããã
ã©ããã£ãŠåå²ããã®ã§ããïŒ ãããŠãã®ããã«ïŒ
ããã·ãŒãžã£ãåŒã³åºããããŒãã«ããã¥ãŒã¹ã«ãªãããšã瀺ããcategory_idã§ããŒãã£ã·ã§ã³åå²ããŸãã ãããŠãããã¯åç¬ã§æ©èœãç¶ããŸããä»ã«äœãããå¿ èŠã¯ãããŸããã ããŒã¿ãæ¿å ¥ããŸãã
category_id = 1ã®3ã€ã®ãšã³ããªãšãcategory_id = 2ã®2ã€ã®ãšã³ããªãcategory_id = 3ã®1ã€ã®ãšã³ããªããããŸãã
æ¿å ¥åŸãããŒã¿ã¯èªåçã«å¿ èŠãªããŒãã£ã·ã§ã³ã«åé¡ãããéžæããããšãã§ããŸãã
ãã¹ãŠãããŒãã£ã·ã§ã³ããã§ã«äœæãããŠããããã¹ãŠã®ããŒã¿ãæ£ã«çœ®ããããã¹ãŠãããŸãæ©èœããŠããŸãã
ãã®å©ç¹ã«ããåŸããããã®ïŒ
- æ¿å ¥æã«ãããŒãã£ã·ã§ã³ãååšããªãå Žåã¯èªåçã«äœæããŸãã
- çŸåšã®æ§é ãç¶æããã€ã³ããã¯ã¹ããã§ãã¯ãããªã¬ãŒãæããŠåãè¿œå ããã ãã§ããŒã¹ããŒãã«ã管çã§ããŸãããã®ããã·ãŒãžã£ãå床åŒã³åºããšãèªåçã«ãã¹ãŠã®ããŒãã£ã·ã§ã³ã«åé¡ãããŸãã
ããã«ã¯éåžžã«å€§ããªå©ç¹ããããŸãã ãªã³ã¯ã¯https://github.com/2gis/partition_magicã§ãã ããã§ãã¬ããŒãã®æåã®éšåãå®æããŸããã ããŒã¿ãåå²ããæ¹æ³ãåŠã³ãŸããã ããŒãã£ã·ã§ãã³ã°ã¯1ã€ã®ã€ã³ã¹ã¿ã³ã¹ã«é©çšãããããšãæãåºãããŠãã ãããããã¯ã倧ããªå€ªãããŒãã«ãæã€ããŒã¿ããŒã¹ã®åãã€ã³ã¹ã¿ã³ã¹ã§ãããå°ããªéšåã«åå²ããŸãã ã¢ããªã±ãŒã·ã§ã³ãå®å šã«å€æŽããããšã¯ã§ããŸãããã¡ã€ã³ããŒãã«ã§ãåãããã«æ©èœããŸããããã«ããŒã¿ãæ¿å ¥ãç·šéãåé€ããŸãã ãã¹ãŠãåäœããŸãããããéãåäœããŸãã ããããå¹³åã§3ã4åé«éã§ãã
ã¬ããŒãã®2çªç®ã®éšåã«é²ã¿ãŸããã-ããã¯æ°Žå¹³ã·ã£ãŒãã£ã³ã°ã§ãã æ°Žå¹³ã·ã£ãŒãã£ã³ã°ãšã¯ãè€æ°ã®ãµãŒããŒã«ããŒã¿ãåæ£ããããšã§ãã ãããã¯ãã¹ãŠéåžžã«ç°¡åã«å®è¡ã§ããŸããäžåºŠèšå®ããã ãã§ååã§ãã ãããã©ã®ããã«è¡ãããšãã§ãããã«ã€ããŠãããã«è©³ãã説æããŸãã
2ã€ã®ã·ã£ãŒããnews_1ãšnews_2ã䜿çšããŠåãæ§é ãæ€èšããŸããããããã¯ç°ãªãã€ã³ã¹ã¿ã³ã¹ã«ãªãã3çªç®ã®ã€ã³ã¹ã¿ã³ã¹ãäœæ¥ã®ã¡ã€ã³ããŒã¹ã«ãªããŸãã
åãè¡šïŒ
ããã§è¿œå ããå¿ èŠãããã®ã¯CONSTRAINT CHECKã ãã§ããã¬ã³ãŒãã¯category_id = 1ã®å Žåã«ã®ã¿ããããã¢ãŠãããŸãã åã®äŸãšåãã§ãããããã¯ç¶æ¿ãããããŒãã«ã§ã¯ãªãããµãŒããŒäžã§äœæããã·ã£ãŒããæã€ããŒãã«ã«ãªããcategory_id = 1ã®ã·ã£ãŒããšããŠæ©èœããŸãã ããã¯èŠããŠããå¿ èŠããããŸãã è¡ãã¹ãå¯äžã®ããšã¯ãå¶çŽãè¿œå ããããšã§ãã
ãªãã·ã§ã³ã§ãcategory_idã«ã€ã³ããã¯ã¹ãäœæããããšãã§ããŸãã
ãã§ãã¯ããããšããäºå®ã«ãããããã-ãã§ãã¯ãPostgreSQLã¯ãŸã ãã®ã·ã£ãŒããåç §ããã·ã£ãŒãã¯éåžžã«é·ãéèããããšãã§ããŸãããªããªãã倧éã®ããŒã¿ãããå¯èœæ§ããããã€ã³ããã¯ã¹ã®å Žåãã€ã³ããã¯ã¹ã«äœããªããããããã«å¿çããããã§ããã®ãããªãªã¯ãšã¹ãã«ãããè¿œå ããæ¹ãè¯ãã§ãããã
ã¡ã€ã³ãµãŒããŒã§ã·ã£ãŒãã£ã³ã°ãèšå®ããæ¹æ³ã¯ïŒ
EXTENSIONãæ¥ç¶ããŸãã EXTENSIONã¯ããã¯ã¹ããPostgresã«ç§»åããŸããããã¯ãCREATE EXTENSIONã³ãã³ãã§å®è¡ãããŸããpostgres_fdwãšåŒã°ããå€éšããŒã¿ã©ãããŒã®ç¥ã§ãã
次ã«ããªã¢ãŒããµãŒããŒãèµ·åããŠã¡ã€ã³ãµãŒããŒã«æ¥ç¶ãã奜ããªååã§åŒã³åºããŠããã®ãµãŒããŒãæå®ããå€éšããŒã¿ã©ãããŒã䜿çšããããšã瀺ããŸãã
åæ§ã«ãMySQLãOracleãMongoãªã©ã®ã·ã£ãŒãã«äœ¿çšã§ããŸããå€éšããŒã¿ã©ãããŒã¯ãéåžžã«å€ãã®ããŒã¿ããŒã¹ã«äœ¿çšã§ããŸãã åå¥ã®ã·ã£ãŒããç°ãªãããŒã¿ããŒã¹ã«ä¿åã§ããŸãã
ãªãã·ã§ã³ã§ã¯ããã¹ããããŒããæäœããããŒã¿ããŒã¹ã®ååãè¿œå ããŸãããµãŒããŒã®ã¢ãã¬ã¹ãããŒãïŒã»ãšãã©ã®å Žåãæšæºã«ãªãïŒãéå§ããããŒã¹ãæå®ããã ãã§ãã
次ã«ããŠãŒã¶ãŒã®ãããã³ã°ãäœæããŸãããããã®ããŒã¿ã«åŸã£ãŠãã¡ã€ã³ãµãŒããŒã¯åã«å¯ŸããŠæ¿èªãããŸãã ãµãŒããŒnews_1ã«ã¯ãpostgresãã¹ã¯ãŒããæã€postgresãŠãŒã¶ãŒãããããšã瀺ããŸãã ãããŠããŠãŒã¶ãŒpostgresãšããŠã¡ã€ã³ããŒã¿ããŒã¹ã«ãããã³ã°ãããŸãã
ãã¹ãŠãæšæºèšå®ã§ç€ºããŸããããããžã§ã¯ããåã ã®ããŒã¿ããŒã¹ã«ç¬èªã®ãŠãŒã¶ãŒãèšå®ã§ããŸããããã§ã¯ããã¹ãŠãæ©èœããããã«æå®ããå¿ èŠããããŸãã
次ã«ãã¡ã€ã³ãµãŒããŒã§ãã¬ãŒããèµ·åããŸãã
åãæ§é ã®ãã¬ãŒãã«ãªããŸãããç°ãªãã®ã¯ãå€éšããŒãã«ã§ãããšãããã¬ãã£ãã¯ã¹ã®ã¿ã§ãã ããã¯ç§ãã¡ã«ãšã£ãŠãªã¢ãŒãã®ãããªãã®ã§ãããã©ã®ãµãŒããŒããååŸãããã瀺ãããªãã·ã§ã³ã§ååŸããå¿ èŠãããããŒãã«ã®ã¹ããŒã ãšååã瀺ããŸãã
ããã©ã«ãã®ã¹ããŒã ã¯ãããªãã¯ã§ãäœæããããŒãã«ã¯ãã¥ãŒã¹ãšåŒã°ããŸãã åæ§ã«ã2çªç®ã®ããŒãã«ãã¡ã€ã³ãµãŒããŒã«æ¥ç¶ããŸãã ãµãŒããŒã®è¿œå ããããã³ã°ã®è¿œå ãããŒãã«ã®äœæã æ®ã£ãŠããã®ã¯ãã¡ã€ã³ããŒãã«ãçšæããããšã ãã§ãã
ããã¯VIEWã䜿çšããŠè¡ããããã¬ãŒã³ããŒã·ã§ã³ãéããŠãUNION ALLã䜿çšããŠãªã¢ãŒãããŒãã«ããã¯ãšãªãçµåãããªã¢ãŒããµãŒããŒãã1ã€ã®å€§ããªã·ãã¯ãã¥ãŒã¹ããŒãã«ãååŸããŸãã
æ¿å ¥ãåé€ã®éã«ãã®ããŒãã«ã«ã«ãŒã«ãè¿œå ããŠãã·ã£ãŒãã®ä»£ããã«ã¡ã€ã³ããŒãã«ãæäœããããšãã§ããŸããããã«ãããã¢ããªã±ãŒã·ã§ã³ã§ã®æžãæããåŠçãäžèŠã«ãªããŸãã
ãã§ãã¯ãæ©èœããªãå Žåã«ããªã¬ãŒãããåºæ¬ã«ãŒã«ãèšå®ããäœãèµ·ãããªãããã«ããŸãã ã€ãŸã DO INSTEAD NOTHINGãæå®ãã以åãšåããã§ãã¯ãéå§ããŸãããæ¡ä»¶ã®è¡šç€ºã®ã¿ã䜿çšããŸãã category_id = 1ããã³ä»£ããã«ããŒã¿ãåé¡ãããããŒãã«ã
ã€ãŸã å¯äžã®éãã¯ãcategory_idã§ããŒãã«ã®ååã瀺ãããšã§ãã ããŒã¿æ¿å ¥ãèŠãŠãã ããã
ååšããªãããŒãã£ã·ã§ã³ãç¹ã«åŒ·èª¿è¡šç€ºããã®ã¯ã æ¡ä»¶ã«å¿ããŠããã®ããŒã¿ã¯ã©ãã«ãå±ããŸããã ããã¯VIEWã§ãããããã¯å®éã®ããŒãã«ã§ã¯ãªããããŒã¿ãããã«æ¿å ¥ã§ããªããããæ¡ä»¶ããªãå Žåã¯äœãããªãããšã瀺ããŠããŸãã ãã®ç¶æ ã§ãããŒã¿ã3çªç®ã®ããŒãã«ã«æ¿å ¥ãããããšãèšè¿°ã§ããŸãã ãããã¡ããã¹ã±ããã®ãããªãã®ãååŸããããŒãã«ã«INSERT INTOãå®è¡ããŠãçªç¶ããŒãã£ã·ã§ã³ããªããªããã·ã£ãŒãã®ãªãããŒã¿ãæ¥å§ããå Žåãããã«ããŒã¿ãèç©ãããããã«ããŸãã
ããŒã¿ãéžæ
èå¥åã®ãœãŒãã«æ³šæããŠãã ãã-æåã«æåã®ã·ã£ãŒãã®ãšã³ããªã衚瀺ãã次ã«2çªç®ã®ã·ã£ãŒããã衚瀺ããŸãã ããã¯ãpostgresãVIEWãé çªã«åŠçããããã§ãã UNION ALLãä»ããŠéžæãæå®ãããã®ããã«å®è¡ããŸã-ãªã¯ãšã¹ãããªã¢ãŒããã·ã³ã«éä¿¡ãããã®ããŒã¿ãåéããŠæ¥çããŸãããããŠããã®VIEWãäœæãããã®ãµãŒããŒãããŒã¿ãæäŸããååã«åŸã£ãŠäžŠã¹æ¿ããããŸãã
ã«ããŽãªã䜿çšããŠã¡ã€ã³ããŒãã«ãã以åã«äœæããã¯ãšãªãäœæãããšãpostgresã¯2çªç®ã®ã·ã£ãŒãããã®ã¿ããŒã¿ãè¿ãããã·ã£ãŒãã«çŽæ¥æ¥ç¶ããŸãã
äžèšã®äŸã®ããã«ãç°ãªããµãŒããŒãç°ãªãã€ã³ã¹ã¿ã³ã¹ã®ã¿ãããããã¹ãŠã以åãšåãããã«æ©èœããŸãã
説æãã芧ãã ããã
ããŒãã£ã·ã§ã³åå²ãšåæ§ã«ãnews_1ã«ããå€éšã¹ãã£ã³ãšnews_2ã«ããå€éšã¹ãã£ã³ããããŸãããSeqã¹ãã£ã³ã®ä»£ããã«å€éšã¹ãã£ã³ããããŸããããã¯å¥ã®ãµãŒããŒã§å®è¡ããããªã¢ãŒãã¹ãã£ã³ã§ãã
ããŒãã£ã·ã§ãã³ã°ã¯éåžžã«ç°¡åã§ãå®äºããã®ã«ããããªã¢ã¯ã·ã§ã³ããå¿ èŠãªãããã¹ãŠãã»ããã¢ãããããã¹ãŠãããŸãæ©èœããé£äºãæ±ããŸããã 以åã«äœæ¥ããããã«ã¡ã€ã³ããŒãã«ã䜿çšããããšãã§ããŸãããåæã«ããã¹ãŠãæ£ã«çŸããé 眮ãããŠãããå€ãã®ããŒã¿ã«å¯Ÿå¿ã§ããããã«æ¡åŒµããæºåãã§ããŠããŸãã , 3-4 , , , .. .
â , , , , , .
é£çµ¡å
2