è² è·ã倧ãããæ°åã®RPSããããæ°åã§ã®ããŠã³ã¿ã€ã ã¯ãã¡ããã®ããšã蚱容ç¯å²ãè¶ ããŠããŸãã ãŠãŒã¶ãŒãæ°ä»ããªããã¡ã«ç§»è¡ãè¡ãå¿ èŠããããŸãã ãããŠããã®ãããªè·ç©ããããšãæã®4æã«èµ·ããŠãè·ç©ããªããšãã«äœãã転ãããåã³å¯ãã®ã¯äžå¯èœã§ã-è·ç©ã¯24æéäŒã¿ãŸãã
-ããã°ãã¯ïŒ ç§ã®ååã¯ãŠã©ãžããŒã«ã§ããYandexã§5幎éåããŠããŸãã éå»2幎éã瀟å ãµãŒãã¹ãšçµç¹åããµãŒãã¹ãéçºããŠããŸããã
ãããã®ãµãŒãã¹ãçµç¹ã«ãšã£ãŠäœã§ãããã«ã€ããŠå°ãã ç§ãã¡ã¯é·ãéãå€æ°ã®å éšãµãŒãã¹ã䜿çšããŠããŸããïŒããŒã¿ã®ä¿åãšäº€æã®ããã®ãŠã£ããååãšã®è¿ éãªã³ãã¥ãã±ãŒã·ã§ã³ã®ããã®ã¡ãã»ã³ãžã£ãŒãäœæ¥ããã»ã¹ãæŽçããããã®ãã©ãã«ãŒãå å€ã®èª¿æ»ãå®è¡ããããã®ãã©ãŒã ãããã³ä»ã®å€ãã®ãµãŒãã¹ã
ãã°ããåã«ãç§ãã¡ã®ãµãŒãã¹ã¯ã¯ãŒã«ã§ãããYandexå ã ãã§ãªããå€éšã®äººã ã«ã圹ç«ã€ãšå€æããŸããã ãã¡ã€ã³ã®ã¡ãŒã«ãªã©ã®æ¢åã®å€éšãµãŒãã¹ãè¿œå ããŠãçµ±åYandex.Connectãã©ãããã©ãŒã ã«ããããå°å ¥ãå§ããŸããã
çŸåšããã©ãŒã ãã¶ã€ããšWikiãéçºããŠããŸãã 䜿çšãããã¹ã¿ãã¯ã¯ãäž»ã«2çªç®ãš3çªç®ã®ããŒãžã§ã³ã§Pythonã§èšè¿°ããããµãŒãã¹ã§ãã Django 1.9-1.11ã ããŒã¿ããŒã¹ãšããŠã¯ãã»ãšãã©ãPostgreSQLã§ãã ãŸãããããŒã«ãŒãšããŠMongoDBãšSQSã䜿çšããCeleryã§ãã ããã¯ãã¹ãŠDockerã§æ©èœããŸãã
ç§ãã¡ãçŽé¢ããŠããåé¡ã«ç§»ããŸãããã ãµãŒãã¹ã¯äººæ°ããããæ¯æ¥æ°åäžäººã䜿çšããããŒã¿ãèç©ãããããŒãã«ããŸããŸãå¢ããŠãããæéã®çµéãšãšãã«ãæšæ¥ãŠãŒã¶ãŒã«æ°ä»ãããã«å®è¡ãããŠããããŒã¿ããŒã¹ã¹ããŒããå€æŽããå€ãã®æäœãããµãŒãã¹ã®éåžžã®æäœã劚ãå§ããŠããŸãã
ä»æ¥ã¯ããã®ãããªç¶æ³ã«å¯ŸåŠããæ¹æ³ãšãèªã¿åãããã³æžã蟌ã¿ãµãŒãã¹ã®é«å¯çšæ§ãå®çŸããæ¹æ³ã«ã€ããŠèª¬æããŸãã
æåã«ãPostgreSQLã§ã®æäœã«ããŒãã«ã®é·ãããã¯ãå¿ èŠãªãã®ãèããŠã¿ãŸãããã ããã¯ãšã¯ãããŒãã«ã®éåžžã®æäœã劚ããããããã¿ã€ãã®ããã¯ãæå³ããŸã-æžã蟌ã¿ãšèªã¿åãã®äž¡æ¹ãé²ãæä»çã¢ã¯ã»ã¹ããŸãã¯æžã蟌ã¿ã®ã¿ãé²ã匱ãããã¯ã¬ãã«ã§ãã
次ã«ããã®ãããªæäœäžã«ããã¯ãåé¿ããæ¹æ³ã«ã€ããŠèª¬æããŸãã 次ã«ãPostgreSQLã®æäœãæåã«é«éã§ãé·ãããã¯ãå¿ èŠãšããªãããšã«ã€ããŠèª¬æããŸãã æåŸã«ãzero_downtime_migrationsã©ã€ãã©ãªã«ã€ããŠèª¬æããŸããããã¯ãé·ãããã¯ãåé¿ããããã«åè¿°ã®ææ³ã®äžéšãèªååããããã«äœ¿çšããŸãã
é·ãããã¯ãå¿ èŠãªæäœïŒ
ã€ã³ããã¯ã¹ãäœæããŸãã ããã©ã«ãã§ã¯ãããŒãã«å ã®èªã¿åãæäœã¯ãããã¯ãããŸãããããã¹ãŠã®æžã蟌ã¿æäœã¯ã€ã³ããã¯ã¹ãäœæãããéãããã¯ãããŸã;ãããã£ãŠããµãŒãã¹ã¯èªã¿åãå°çšã«ãªããŸãã
ãŸãããã®ãããªæäœã«ã¯ãPostgreSQLãããŒãã«å šäœãäžæžããããã®éã¯èªã¿åããšæžã蟌ã¿ã®äž¡æ¹ã§ãããã¯ããããããããã©ã«ãå€ã§æ°ããåãè¿œå ããããšãå«ãŸããŸãã ããã«ããã¹ãŠã®ã€ã³ããã¯ã¹ãäžæžããããŸãã
åã®ã¿ã€ãã®å€æŽã«ã€ããŠ-åæ§ã®ããšãèµ·ããããã¬ãŒããåã³äžæžããããŸãã ããã¯ã倧ããªããŒãã«ã§é·æéãããã ãã§ãªããçæéã§ããŒãã«ãå æãã空ãã¡ã¢ãªã®æ倧2åã®éãå¿ èŠãšããããšã«æ³šæããŠãã ããã
ãŸããVACUUM FULLæäœã«ã¯ã以åã®æäœãšåãã¬ãã«ã®ããã¯ãå¿ èŠã§ã-ããã¯ã¢ã¯ã»ã¹å°çšã§ãã VACUUM FULLã¯ãããŒãã«ã«å¯Ÿãããã¹ãŠã®èªã¿åãããã³æžã蟌ã¿æäœããããã¯ããŸãã
æåŸã®2ã€ã®æäœã§ã¯ãäžæã®ããããã£ãåã«è¿œå ããäžè¬ã«CONSTRAINTãè¿œå ããŸãã ãŸããããŒã¿æ€èšŒäžã¯ããã¯ãå¿ èŠãšããŸãããå éšã§ããŒãã«ãäžæžãããªãããã以åã«æ€èšãããã®ãããã¯ããã«çãæéã§æžã¿ãŸãã
ã€ã³ããã¯ã¹ãäœæããŸãã ããã§ã¯éåžžã«ç°¡åã§ããCONCURRENTLYããŒã¯ãŒãã䜿çšããŠäœæã§ããŸãã éãã¯äœã§ããïŒ ãã®æäœã¯1åã§ã¯ãªãããŒãã«ãæ°åå®è¡ãããããæéãããããŸãããŸããã€ã³ããã¯ã¹ãå€æŽããå¯èœæ§ã®ããçŸåšã®ãã¹ãŠã®æäœãå®äºãããŸã§åŸ æ©ããŸãã ãŸãã倱æããå ŽåããããŸã-ããšãã°ãäžæã®ã€ã³ããã¯ã¹ãäœæãããšãã«äžææ§ã®æ¡ä»¶ã®éåãèŠã€ãã£ãå Žåã ãã®åŸãã€ã³ããã¯ã¹ã¯ç¡å¹ãšããŠããŒã¯ãããåé€ããŠåäœæããå¿ èŠããããŸãã REINDEXã³ãã³ãã¯ãéåžžã®CREATE INDEXãšåãããã«æ©èœãããããã€ãŸããæžã蟌ã¿ã®ããã«ããŒãã«ãããã¯ããããããå§ãããŸããã
ã€ã³ããã¯ã¹ã®åé€ã«ã€ããŠ-ããŒãžã§ã³9.3以éã§ã¯ãã€ã³ããã¯ã¹ã®åé€äžã«ãââãã¯ãåé¿ããããã«ã€ã³ããã¯ã¹ã䞊è¡ããŠåé€ããããšãã§ããŸãããäžè¬çã«ã¯ç°¡åãªæäœã§ãã
ããã©ã«ãå€ã§æ°ããåãè¿œå ããŠã¿ãŸãããã Djangoããã®ãããªæäœãå®è¡ãããªã©ããã®ãããªã³ãã³ããå®è¡ãããšãã«å®è¡ãããæšæºæäœã次ã«ç€ºããŸãã
ããŒãã«ãäžæžãããªãããã«æžãæããã«ã¯ã©ãããã°ããã§ããïŒ æåã«ã1ã€ã®ãã©ã³ã¶ã¯ã·ã§ã³ã§ãããã©ã«ãå€ãªãã§æ°ããåãè¿œå ããå¥ã®ãªã¯ãšã¹ãã§ããã©ã«ãå€ãè¿œå ããŸãã ããã®éãã¯äœã§ããïŒ æ¢åã®åã«ããã©ã«ãå€ãè¿œå ããŠããããŒãã«å ã®æ¢åã®ããŒã¿ã¯å€æŽãããŸããã ã¡ã¿ããŒã¿ã®ã¿ãå€æŽãããŸãã ã€ãŸãããã¹ãŠã®æ°ããè¡ã«ã€ããŠããã®ããã©ã«ãå€ã¯ãã§ã«ä¿èšŒãããŠããŸãã ãã®ã³ãã³ããå®è¡ãããæç¹ã§ããŒãã«ã«ãã£ããã¹ãŠã®æ¢åã®è¡ãæŽæ°ããããšã¯æ®ããŸãã 倧éã®ããŒã¿ãé·æéãããã¯ããªãããã«ãæ°åã³ããŒã®ãããã§è¡ãããšã
ãã¹ãŠã®ããŒã¿ãæŽæ°ããåŸãNOT NULLåãäœæããå Žåã«ã®ã¿SET NOT NULLãå®è¡ããŸãã äœæããªãå Žåã¯äœæããŸããã ãã®æ¹æ³ã«ããããã®çš®ã®å€æŽãè¡ããšãã«ããŒãã«ãäžæžãããããšãåé¿ã§ããŸãã
ãã®ãããªã³ãã³ãã®ã·ãŒã±ã³ã¹ã¯ãããŒãã«ã®ãµã€ãºãšã€ã³ããã¯ã¹ã®æ°ã«äŸåãããããéåžžã®ã³ãã³ãã®å®è¡ãããæéãããããŸããéåžžã®ã³ãã³ãã¯ããã¹ãŠã®æäœããããã¯ããè² è·ã«é¢ä¿ãªãããŒãã«ãäžæžãããŸãã ãã ããæäœäžã¯ããŒãã«ãèªã¿æžãã§ãããããããã¯ããã»ã©éèŠã§ã¯ãããŸããã ããã«ã¯é·ãæéãããããŸããããªãã¯ããã«åŸãã ãã§ããã®ã§ãã
åã®ã¿ã€ãã®å€æŽã«ã€ããŠã ãã®ã¢ãããŒãã¯ãããã©ã«ãå€ãæã€åãè¿œå ããã®ã«äŒŒãŠããŸãã ãŸããå¿ èŠãªåã®å¥ã®åãè¿œå ããŠãããå ã®åã®ããŒã¿ãå€æŽããŠäž¡æ¹ã®åã«äžåºŠã«æžã蟌ãããªã¬ãŒãè¿œå ããå¿ èŠãªããŒã¿åã®æ°ããåã«è¿œå ããŸãã ãã¹ãŠã®æ°èŠãšã³ããªã«ã€ããŠããããã®åã®äž¡æ¹ã«ããã«ç§»åããŸãã æ¢åã®ãã®ããã¹ãŠæŽæ°ããå¿ èŠããããŸãã åã®ã¹ã©ã€ãã®ããã«ãç§ãã¡ãå°ããã€è¡ãããšã¯äŒŒãŠããŸããã
ãã®åŸã1ã€ã®ãã©ã³ã¶ã¯ã·ã§ã³ã«æ®ããããªã¬ãŒãåé€ããå€ãåãåé€ããå€ãåã®ååãæ°ãããã®ã«å€æŽããŸãã ãããã£ãŠãåãçµæãåŸãããŸãããåã®ã¿ã€ããå€æŽããŸããããããŒãã«ã®ããã¯ã¯é·ããããŸããã§ããã
äžæã®åã®è¿œå ã«ã€ããŠã ããã¯ã¯äœææã«ååŸãããŸãã äžæã®ã€ã³ããã¯ã¹ãäœæããããšã§PostgreSQLã®äžææ§ãä¿èšŒãããŠããããšãããã£ãŠããå Žåã¯ãåé¿ã§ããŸãã CONCURRENTLYã䜿çšããŠãå¿ èŠãªäžæã®ã€ã³ããã¯ã¹ãäœæã§ããŸãã ãããŠããã®ã€ã³ããã¯ã¹ãæ§ç¯ããåŸããã®ã€ã³ããã¯ã¹ã䜿çšããŠCONSTRAINTãäœæããŸãã ãã®åŸãããŒãã«ã®åæã€ã³ããã¯ã¹ã®å®çŸ©ã¯æ¶ããããŒãã«ã®å®çŸ©ã瀺ãçµæã¯ãããã2ã€ã®æäœãå®è¡ããåŸãå€ãããŸããã
ãããŠäžè¬çã«ãCONSTRAINTãè¿œå ãããšãã ãã®ææ³ã䜿çšããŠãããŒã¿ã®ãã§ãã¯äžã®ãããã¯ãåé¿ã§ããŸãã æåã«ãããŒã¯ãŒãNOT VALIDãæå®ããŠCONSTRAINTãè¿œå ããŸãã ããã¯ããã®CONSTRAINTãããŒãã«å ã®ãã¹ãŠã®è¡ã«å¯ŸããŠå®è¡ãããããšãä¿èšŒãããŠããªãããšãæå³ããŸãã ãããåæã«ããã¹ãŠã®æ°ããè¡ã«å¯ŸããŠããã®CONSTRAINTã¯ãã§ã«é©çšãããŠãããå®è¡ãããªãå Žåã¯å¯Ÿå¿ããäŸå€ãã¹ããŒãããŸãã
æ¢åã®ãã¹ãŠã®å€ã®ã¿ãæ€èšŒã§ããŸããããã¯ãåå¥ã®VALIDATE CONSTRAINTã³ãã³ãã§å®è¡ã§ããåæã«ãã®ã³ãã³ããããŒãã«ã®èªã¿åããŸãã¯æžã蟌ã¿ã®ãããã«ãå¹²æžããªããªããŸãã ãã®æéã®ããŒãã«ãå©çšå¯èœã«ãªããŸãã
æåã«PostgreSQLã§è¿ éã«åäœããé·ãããã¯ãå¿ èŠãšããªãæäœïŒ
ãããã®æäœã®1ã€ã¯ãããã©ã«ãå€ãšå¶éãªãã§åãè¿œå ããããšã§ãã ããŒãã«èªäœã¯å€æŽãããªããããã¡ã¿ããŒã¿ã®ã¿ãå€æŽãããŸãã ãŸããSELECTã®çµæãšããŠè¡šç€ºããããã¹ãŠã®NULLå€ã¯ãåºåã§åçŽã«æ··åãããŸãã
ãŸããã¡ã¿ããŒã¿ã®ã¿ãå€æŽããããããæ¢åã®ã©ãã«ã«ããã©ã«ãå€ãè¿œå ããã®ã¯ç°¡åãªæäœã§ãã ãã®æ å ±ãå ¥åããã®ã«å¿ èŠãªæ°ããªç§ã®éãããŒãã«ãšããã¯ã¯æåéãååŸãããŸãã
ãŸããã¯ã€ãã¯ã»ããã¢ããæäœã¯SET NOT NULLã§ããããã§ã¯ã以åã«èª¬æãããããå°ãæéããããã3000äžã¬ã³ãŒãã®ããŒãã«ã«ã€ãçŽæ°ç§ããããŸãã éèŠãªå Žåã¯ããã®æéãåé¿ã§ããŸãã
åã®ååãå€æŽããåã®é·ããå€æŽããŠããåã¯äžæžããããŸããã PostgreSQLã®åãããã³äžè¬çã«å€ãã®ãšã³ãã£ãã£ãåé€ããããšãç°¡åãªæäœã§ãã
NOT NULLåã®è¿œå ã«ã€ããŠã æ€èšŒäžã®ãããã¯ãåé¿ããã«ã¯ãåè¿°ã®ã¡ãœãããå®è¡ããŸã-CHECKïŒåIS NOT NULLïŒNOT VALIDã«å¯Ÿå¿ããCONSTRAINTãè¿œå ããå¥ã®ã³ãã³ãã§æ€èšŒããŸãã
äžè¬çãªéãã¯ããã®å¶éã¯ããŒãã«å®çŸ©ã®åã¬ãã«ã§ã¯ãªãããŒãã«ã¬ãã«ã«ååšããããšã§ãã ãã1ã€ã®éãã¯ãããã©ãŒãã³ã¹ã«åœ±é¿ãäžããå¯èœæ§ãããããšã§ãïŒçŽ1ïŒ ïŒã ãã®å ŽåããµãŒãã¹ã®è² è·ãé«ãå Žåãããããã³ã°ã¯çºçããŸãããæ°ç§ã®ããããã³ã°ã§ãããã©ã³ã¶ã¯ã·ã§ã³ã®å·šå€§ãªãã¥ãŒãèç©ããããµãŒãã¹ã«åé¡ãçºçããå¯èœæ§ããããŸãã
PostgreSQLã§ã®ããŒã¿ã®åé€ã¯éåžžãè¿ éãªæäœã§ããããŒã¿ã¯ããã«ã¯åé€ããããããŒãã«ã®å±æ§ã§åã®ã¿ãå€ããªã£ãŠãããšããŒã¯ãããå®éã«ããŒã¿ã¯æ¬¡ã®ããã¥ãŒã ã®éå§åŸã«ã®ã¿åé€ãããŸãã
ã©ã€ãã©ãªã«ã€ããŠè©±ããŸãããã Djangoã移è¡ã«ã€ããŠè©±ããŠããã äžè¬ã«ãDjangoã¯Webãã¬ãŒã ã¯ãŒã¯ã§ããPythonã®ã©ã€ãã©ãªã§ãããå ã ã¯ãã¥ãŒã¹ã®ãããªWebãµã€ãããã°ããäœæããããã«äœæãããŸããããã以æ¥ãå€§å¹ ã«ã¢ããã°ã¬ãŒããããŠããŸãã Pythonãªããžã§ã¯ããŸãã¯ã¯ã©ã¹ã§ãããã®ããã«ãããŒã¿ããŒã¹å ã®ã¬ã³ãŒããããŒãã«ãšéä¿¡ã§ããORMã·ã¹ãã ããããŸãã ã€ãŸããåããŒãã«ã«ã¯Pythonã®ç¬èªã®ã¯ã©ã¹ããããŸãã ãããŠãPythonã³ãŒãã«å€æŽãå ãããã€ãŸããããŒãã«ã«åãªã©ã®æ°ããå±æ§ãè¿œå ãããšã移è¡ã®äœæããã»ã¹äžã«Djangoã¯ãããã®å€æŽãèªèããããŒã¿ããŒã¹èªäœã«ãã©ãŒå€æŽãå ãã移è¡ãã¡ã€ã«ãäœæããŠãããããåå²ããªãããã«ããŸãã
ã©ã€ãã©ãªã¯ããã®ãããªç§»è¡äžã«ããŒãã«ã®é·ãããã¯ãåé¿ããããã®åè¿°ã®ææ³ã®äžéšãèªååããããã«äœæãããŸããã ããŒãžã§ã³1.8ãã2.1ãŸã§ã®Djangoãããã³2.7ãã3.7ãŸã§ã®Pythonã§åäœããŸãã
ã©ã€ãã©ãªã®çŸåšã®æ©èœã«é¢ããŠãããã¯ããã¯ãªãã®ããã©ã«ãå€ãnullå¯èœãŸãã¯ç¡å¹ã®åãè¿œå ããŠããŸããããã¯ãCONCURRENTLYã€ã³ããã¯ã¹ãäœæããã¯ã©ãã·ã¥ãããšãã«åèµ·åããæ©èœã§ãã æšæºã®Djangoå®è£ ã§ã¯ãããã©ã«ãå€ã§åãè¿œå ãããšãããŒãã«ãããã¯ããããµã€ãºã倧ããå Žåãç§ã®çµéšã§ã¯40åã®ããã¯ã«ãªãå¯èœæ§ããããŸãã ããŒãã«ã¯ããã¯ãããŠããŸããå€æŽãã³ããŒãããŠè¡ããããŸã§åŸ ã¡ãŸãã 30åãçµéããŸãã-ããŒã¿ããŒã¹ãžã®æ¥ç¶ãšã©ãŒããã£ãããã移è¡ã倱æããå€æŽãã³ãããããããå床éå§ããå¿ èŠããããŸããåã³40ååŸ æ©ããåã³ãã®æéããŒãã«ããããã¯ããŸãã
GitHubãªã³ã¯
ã©ã€ãã©ãªã«ãããäžæãããå Žæãã移è¡ãåéããããšãã§ããŸãã ã¯ã©ãã·ã¥ããŠåèµ·åãããšãã¢ã¯ã·ã§ã³ã®ããŸããŸãªãªãã·ã§ã³ããããã€ã¢ãã°ããã¯ã¹ã衚瀺ãããŸããã€ãŸããããŒã¿ã®æŽæ°ãç¶è¡ããããã«æ瀺ã§ããŸãã ããã¯æé·ã®ããã»ã¹ã§ãããããéåžžã¯ããŒã¿ã®æŽæ°ã§ãã 移è¡ã¯ãäžæãããšããããç¶è¡ãããŸãã ãã®ãããªæäœã¯ãããŒãã«ããã¯ã䜿çšããæšæºã®æäœãããæéãããããŸãããåæã«ããã®æç¹ã§ãµãŒãã¹ã¯æäœå¯èœãªãŸãŸã§ãã
æ¥ç¶å šäœã«ã€ããŠã ããã¥ã¡ã³ãããããŸãã ã€ãŸããDjangoããŒã¿ããŒã¹èšå®ã®ãšã³ãžã³ãã©ã€ãã©ãªã®ãšã³ãžã³ã«çœ®ãæããå¿ èŠããããŸãã ãšã³ãžã³ã䜿çšããŠæ¥ç¶ããå Žåã¯ãããŸããŸãªããã¯ã¹ã€ã³ããããŸãã
äœæ¥ã®äŸã¯ãããã©ã«ãå€ãæã€åãè¿œå ããããšã§ãã ããã§ã¯ãããŒã«å€ïŒããã©ã«ãã§ã¯TrueïŒã®åãè¿œå ããŸãã æšæºã®SchemaEditorã«ãã£ãŠå®è¡ãããæäœã¯äœã§ããïŒ SQLãå®è¡ããå Žåã«ç¢ºèªã§ããæäœã¯ç§»è¡ãããŸãã ããã¯éåžžã«äŸ¿å©ã§ãããŸãã«ç§»è¡ã®ã¿ã€ãã«ãã£ãŠãDjangoãå®éã«ããã§å€æŽã§ããããšã¯å¿ ãããæ確ã§ã¯ãããŸããã ãããŠãç§ãã¡ãæåŸ ããæäœãå®äºãããã©ããããããŠäžå¿ èŠãªãã®ãäžå¿ èŠãªãã®ãããã«å±ããŠãããã©ããã確èªããããšã¯æçšã§ãã
SchemaEditorã¯ã©ã®ã³ãã³ããå®è¡ããŸããïŒ æåã«ã1ã€ã®ãã©ã³ã¶ã¯ã·ã§ã³ã«æ°ããåãè¿œå ãããããã©ã«ãå€ãè¿œå ãããŸãã 次ã«ããã®ãããªæŽæ°ããŒããæŽæ°ããããšãè¿ããŸã§ãããŒã¿ã¯æŽæ°ãããŸãã
次ã«ãåã«SET NOT NULLãèšå®ãããããã©ã«ãå€ãåé€ãããDjangoã®åäœãç¹°ãè¿ãããŸããDjangoã¯ãããŒã¿ããŒã¹ã§ã¯ãªãã³ãŒãã®ç¬èªã®ããžãã¯ã¬ãã«ã§ããã©ã«ãå€ãä¿åããŸãã
ããã§ã¯ãäžè¬çã«ãæé·ããäœå°ããããŸãã ããšãã°ãè£å©çŽ¢åŒãäœæããŠãè¡šå šäœã®æŽæ°ã«è¿ã¥ããšãNULLå€ãæã€ãã®ãããªè¡ããã°ããèŠã€ããããšãã§ããŸãã
ãŸãã移è¡ãéå§ãããšãã®æŽæ°æéã®æ倧IDãä¿®æ£ããŠãIDã«ãã£ãŠãŸã æŽæ°ãããŠããªãå€ããã°ããèŠã€ããããšãã§ããŸãã
äžè¬çã«ãã©ã€ãã©ãªã¯éçºäžã§ãããããŒã«ãªã¯ãšã¹ããåãä»ããŠããŸãã 誰ãæ°ã«ããªã-åå ã
DBã®æé·ã«äŒŽãã移è¡ã«ã¯é床äœäžã®é¿ããããªãç¹æ§ãããããšã«æ³šæãã䟡å€ããããŸãã ããŒãã«ãã©ã®ããã¯ãååŸãããã远跡ããSQL移è¡ãå®è¡ããŠãé©çšãããŠããæäœã確èªããå¿ èŠããããŸãã ç§ãã¡ã®åŽã§ã¯ãYandex.Connectã§ãæ©èœãèš±ãéããã®ã©ã€ãã©ãªã䜿çšããŸãã ãããŠã圌ãããããèš±å¯ããŠããªãå Žåãç§ãã¡ã¯èªåèªèº«ã§ãDjangoã®åœã®ç§»è¡ãè¡ããSQLã¯ãšãªãå®è¡ããŸãã
ãããã£ãŠãèªã¿åãããã³æžã蟌ã¿ãµãŒãã¹ã®é«å¯çšæ§ãå®çŸããŸãã è² è·ã倧ãããæ°åã®RPSããããæ°åã§ã®ããŠã³ã¿ã€ã ã¯ãã¡ããã®ããšã蚱容ç¯å²ãè¶ ããŠããŸãã ãŠãŒã¶ãŒãæ°ä»ããªããã¡ã«ç§»è¡ãè¡ãå¿ èŠããããŸãã ãããŠããã®ãããªè·ç©ããããšãæã®4æã«èµ·ããŠãè·ç©ããªããšãã«äœãã転ãããŠãåã³å¯ãã®ã¯äžå¯èœã§ã-è·ç©ã¯24æéåããŸãã
PostgreSQLã§ã®é«éæäœã§ããPostgreSQLã§ã®ããã¯ãã¥ãŒã®åäœã«ããããµãŒãã¹ã®é床äœäžããšã©ãŒãçºçããå¯èœæ§ãããããšã«æ³šæããŠãã ããã
æ°ããªç§ã§ãã£ãŠããæä»çã¢ã¯ã»ã¹ãå¿ èŠãªæäœãéå§ããããšæ³åããŠãã ããã ãã®ãããªæäœã®äŸã¯ãããã©ã«ãå€ãªãã§åãè¿œå ããããšã§ãã å¥ã®ãã©ã³ã¶ã¯ã·ã§ã³ã§ã®èµ·åæã«ãä»ã®ããã€ãã®é·ãæäœïŒããšãã°ãéèšä»ãã®SELECTïŒããããšæ³åããŠãã ããã ãã®å Žåãæäœã¯åœŒå¥³ã®ããã«ãã¥ãŒã«å ¥ããããŸãã ããã¯ãã¢ã¯ã»ã¹æä»ãä»ã®ãã¹ãŠã®ã¿ã€ãã®ããã¯ãšç«¶åããããã«çºçããŸãã
åãè¿œå ããæäœãããã¯ãåŸ æ©ããŠããéãä»ã®ãã¹ãŠã®åã¯ãã®åã«äžŠã¶ããšã«ãªããå®äºãããŸã§å®è¡ãããŸããã åæã«ãå®è¡äžã®æäœ-éçŽã䌎ãSELECT-ã¯ä»ã®æäœãšç«¶åããªãå¯èœæ§ããããåã®äœæçšã§ãªãå Žåã¯ããã¥ãŒå ã«ç«ã€ããšã¯ãããŸãããã䞊è¡ããŠå®è¡ãããŸãã
ãã®ç¶æ³ã¯ããµãŒãã¹ã«å€§ããªåé¡ãåŒãèµ·ããå¯èœæ§ããããŸãã ãããã£ãŠãALTER TABLEãŸãã¯ã¢ã¯ã»ã¹æä»ããã¯ãå¿ èŠãšãããã®ä»ã®æäœãéå§ããåã«ãé·ãã¯ãšãªãçŸæç¹ã§ããŒã¿ããŒã¹ã«éä¿¡ãããªãããã«æ³šæããå¿ èŠããããŸãã ãŸãã¯ãéåžžã«å°ããªãã°ã¿ã€ã ã¢ãŠããæ¿å ¥ããããšãã§ããŸãã ãã®åŸãããã«ããã¯ãååŸã§ããªãå Žåãæäœã¯å€±æããŸãã ãã ããŒãã«ãåèµ·åããã ãã§ãããŒãã«ãé·æéããã¯ããããšã¯ã§ããŸããããæäœã¯ããã¯èš±å¯ã®ä»äžãåŸ æ©ããŸãã ããã ãã§ããããããšãã