ãããã®ããŒã¿ããŒã¹ã¯ç¡æã§ãSQLã®ãããã§ã·ã¹ãã å ã®ä»ã®ã³ã³ããŒãã³ããšç°¡åã«çµ±åã§ãã人æ°ããããã»ãšãã©ã®éçºè ãšã¢ããªã¹ãããããã䜿çšã§ããŸãã 圌ãã¯ãäŒç€Ÿãåæãšã¬ããŒãã®ããã®ããè€éãªïŒãããŠé«äŸ¡ãªïŒãœãªã¥ãŒã·ã§ã³ãè³Œå ¥ã§ããããã«ãªããŸã§ãç°¡åã«èããããããã«ååãªéïŒãã©ãã£ãã¯ãšããªã¥ãŒã ïŒãæ¶åã§ããŸãã
éå§äœçœ®
ããããç¹°ãè¿ãç 究ãããŠããæè¡ã§ãã£ãŠããåžžã«ããŸããŸãªãã¥ã¢ã³ã¹ãããããããçªç¶ãšã³ãžãã¢ã®å¿é ã«å ããå¯èœæ§ããããŸãã ä¿¡é Œæ§ã«å ããŠãããŒã¿ããŒã¹ã§æãé »ç¹ã«èšåãããåé¡ã¯ããã®ããã©ãŒãã³ã¹ã§ãã æããã«ãããŒã¿éã®å¢å ã«äŒŽããDBã®å¿ççã¯äœäžããŸããããããäºæž¬ã©ããã«çºçããè² è·ã®å¢å ãšäžèŽããå Žåãããã¯ããã»ã©æªããããŸããã ããŒã¿ããŒã¹ã泚æãå¿ èŠãšããåºæ¬çã«ç°ãªãããŒã¿ããŒã¹ãžã®ã¢ããã°ã¬ãŒããŸãã¯ç§»è¡ãèšç»ãå§ãããšãã¯ãã€ã§ãäºåã«ç¢ºèªã§ããŸãã ããŒã¿ããŒã¹ã®ããã©ãŒãã³ã¹ãäºæž¬ã§ããªãã»ã©äœäžãããšãããã«æªåããŸãã
ããŒã¿ããŒã¹ã®ããã©ãŒãã³ã¹ãåäžããããšãããããã¯ã¯ãäžçãšåããããå€ããéåžžã«åºç¯å²ã«ããããã®ã§ããããã®èšäºã§ã¯ãäžæ¹åã®ã¿ã«çŠç¹ãåœãŠãããšæããŸãã ã€ãŸããPostgreSQLããŒã¿ããŒã¹ã§ã®ã¯ãšãªãã©ã³ã®æå¹æ§ãè©äŸ¡ãããã®å¹çãçµæçã«å€æŽããŠãããŒã¿ããŒã¹ã¹ã±ãžã¥ãŒã©ã®åäœãããäºæž¬å¯èœã«ããŸãã
è°è«ãããããšã®å€ãã¯ãã®ããŒã¿ããŒã¹ã®ãã¹ãŠã®ææ°ããŒãžã§ã³ã«é©çšå¯èœã§ãããšããäºå®ã«ããããããã以äžã®äŸã¯çŸæç¹ã§ã¯åŸè ã®ããŒãžã§ã³11.2ãæå³ããŸãã
詳现ã説æããåã«ããªã¬ãŒã·ã§ãã«ããŒã¿ããŒã¹ã®ããã©ãŒãã³ã¹ã®åé¡ãã©ãããçºçããå¯èœæ§ããããã«ã€ããŠå°ã話ãããã®ã¯çã«ããªã£ãŠããŸãã ãã¹ããŒããŠã³ããããšããããŒã¿ããŒã¹ã¯æ£ç¢ºã«äœã§ããžãŒã§ããïŒ ã¡ã¢ãªäžè¶³ïŒå€æ°ã®ãã£ã¹ã¯ãŸãã¯ãããã¯ãŒã¯ã¢ã¯ã»ã¹ïŒã匱ãããã»ããµããããã¯ãã¹ãŠæ確ãªè§£æ±ºçã®æãããªåé¡ã§ãããã¯ãšãªå®è¡é床ã«åœ±é¿ãããã®ã¯ä»ã«ãããŸããïŒ
æãåºãäžæ°
ããŒã¿ããŒã¹ãSQLã¯ãšãªã«å¿çããã«ã¯ãã¯ãšãªãã©ã³ãäœæããå¿ èŠããããŸãïŒã©ã®ããŒãã«ãšåã§ã©ã®ã€ã³ããã¯ã¹ãå¿ èŠããããããäœãéžæããããäœãæ¯èŒããããã©ã®ãããã®ã¡ã¢ãªãå¿ èŠããªã©ïŒã ãã®èšç»ã¯ããªãŒã®åœ¢ã§åœ¢æããããã®ããŒãã¯èšç®ã®è€éãã®ç°ãªãå žåçãªæäœã®ã»ãã®äžéšã§ãã 以äžã«äŸã瀺ããŸãïŒNã¯æäœãå®è¡ããè¡ã®æ°ã§ãïŒã
| äœããã | è²»çš |
---|---|---|
SELECT ... WHERE ...ããŒã¿ååŸæäœ | ||
| ããŒãã«ããåè¡ãããŒãããæ¡ä»¶ã確èªããŸãã | OïŒNïŒ |
ïŒBããªãŒã€ã³ããã¯ã¹ïŒ | ããŒã¿ã¯çŽæ¥ã€ã³ããã¯ã¹ã«ãããããã€ã³ããã¯ã¹ã®å¿ èŠãªèŠçŽ ãæ¡ä»¶ã§æ€çŽ¢ããããããããŒã¿ãååŸããŸãã | OïŒãã°ïŒNïŒïŒããœãŒããããããªãŒå ã®ã¢ã€ãã ãæ€çŽ¢ããŸãã |
ïŒããã·ã¥ã€ã³ããã¯ã¹ïŒ | ããŒã¿ã¯çŽæ¥ã€ã³ããã¯ã¹ã«ãããããã€ã³ããã¯ã¹ã®å¿ èŠãªèŠçŽ ãæ¡ä»¶ã§æ€çŽ¢ããããããããŒã¿ãååŸããŸãã | OïŒ1ïŒãããã·ã¥ã®äœæã³ã¹ããé€ããããã·ã¥ããŒãã«å ã®ã¢ã€ãã ã®æ€çŽ¢ |
ããããããããŒãã¹ãã£ã³ | å¿ èŠãªè¡ã®çªå·ãã€ã³ããã¯ã¹ã§éžæããå¿ èŠãªè¡ã®ã¿ãããŒãããŠè¿œå ã®ãã§ãã¯ãå®è¡ããŸãã | ã€ã³ããã¯ã¹ã¹ãã£ã³+ã·ãŒã±ã³ã¹ã¹ãã£ã³ïŒMïŒã
ããã§ãMã¯ã€ã³ããã¯ã¹ã¹ãã£ã³åŸã«èŠã€ãã£ãè¡ã®æ°ã§ãã M << Nãã€ãŸã ã€ã³ããã¯ã¹ã¯Seqã¹ãã£ã³ããã䟿å©ã§ãã |
çµåæäœïŒè€æ°ã®ããŒãã«ããã®çµåãéžæïŒ | ||
å ¥ãåã«ãŒã | å·Šã®è¡šã®åè¡ã«ã€ããŠãå³ã®è¡šã§é©åãªè¡ãæ¢ããŸãã | OïŒN 2 ïŒã
ãã ããããŒãã«ã®1ã€ãä»ã®ããŒãã«ïŒèŸæžïŒãããã¯ããã«å°ãããå®éã«ã¯æéãšãšãã«æé·ããªãå Žåãå®éã®ã³ã¹ãã¯OïŒNïŒã«æžå°ããå¯èœæ§ããããŸãã |
ããã·ã¥çµå | å·Šå³ã®ããŒãã«ã®åè¡ã«ã€ããŠãããã·ã¥ãèæ ®ããŸããããã«ãããå¯èœãªæ¥ç¶ãªãã·ã§ã³ã®æ€çŽ¢åæ°ãæžå°ããŸãã | OïŒNïŒããã ããéåžžã«éå¹ççãªããã·ã¥é¢æ°ãŸãã¯æ¥ç¶ã®å€æ°ã®åäžãã£ãŒã«ãã®å ŽåãOïŒN 2 ïŒ |
çµåãçµå | æ¡ä»¶ããšã«ãå·Šå³ã®ããŒãã«ã䞊ã¹æ¿ãããã®åŸã2ã€ã®äžŠã¹æ¿ãããããªã¹ããçµåããŸã | OïŒN *ãã°ïŒNïŒïŒ
䞊ã¹æ¿ãã³ã¹ã+ãªã¹ãã確èªããŸãã |
éçŽæäœïŒGROUP BYãDISTINCTïŒ | ||
ã°ã«ãŒãéå | éèšæ¡ä»¶ã§ããŒãã«ã䞊ã¹æ¿ãã䞊ã¹æ¿ãããããªã¹ãã§é£æ¥ããè¡ãã°ã«ãŒãåããŸãã | OïŒN *ãã°ïŒNïŒïŒ |
ããã·ã¥éèš | åè¡ã®éçŽæ¡ä»¶ã®ããã·ã¥ãèæ ®ããŸãã åãããã·ã¥ãæã€è¡ã®å Žåãéèšãå®è¡ããŸãã | OïŒNïŒ |
ã芧ã®ãšããããªã¯ãšã¹ãã®ã³ã¹ãã¯ãããŒã¿ãããŒãã«ã«ã©ã®ããã«é 眮ãããŠããããããã³ãã®é åºã䜿çšãããããã·ã¥æäœã«ã©ã®ããã«å¯Ÿå¿ãããã«å€§ããäŸåããŸãã ãã¹ããããã«ãŒãã¯ãOïŒN 2 ïŒã®ã³ã¹ãã«ãããããããçµåããŒãã«ã®1ã€ã1ã€ãŸãã¯è€æ°ã®è¡ã«çž®éããŠããå Žåãããã·ã¥çµåãŸãã¯ããŒãžçµåãããåçæ§ãé«ããªããŸãã
CPUãªãœãŒã¹ã«å ããŠãã³ã¹ãã«ã¯ã¡ã¢ãªäœ¿çšéãå«ãŸããŸãã ãããã¯äž¡æ¹ãšããªãœãŒã¹ãéãããŠãããããã¯ãšãªãã©ã³ããŒã¯åŠ¥åããå¿ èŠããããŸãã 2ã€ã®ããŒãã«ãããã·ã¥çµåãä»ããŠçµåããæ¹ãæ°åŠçã«ããæçã§ãããããã®ãããªå€§ããªããã·ã¥ããŒãã«çšã®ã¡ã¢ãªã«åçŽã«å Žæããªãå Žåãããšãã°ãããŒã¿ããŒã¹ã¯ããŒãžçµåã®äœ¿çšã匷å¶ãããå ŽåããããŸãã ãé ãããã¹ãã«ãŒãã¯éåžžãè¿œå ã®ã¡ã¢ãªãå¿ èŠãšãããèµ·åçŽåŸã«çµæãçæããæºåãã§ããŠããŸãã
ãããã®æäœã®çžå¯Ÿçãªã³ã¹ãã¯ãã°ã©ãã§ããæ確ã«ç€ºãããŠããŸãã ãããã¯çµ¶å¯Ÿæ°ã§ã¯ãªããããŸããŸãªæäœã®ããããã®æ¯çã§ãã

ãã¹ããããã«ãŒããã£ãŒãã¯ã以äžã§ãéå§ããããŸãã è¿œå ã®èšç®ãã¡ã¢ãªã®å²ãåœãŠãäžéããŒã¿ã®ã³ããŒã¯å¿ èŠãããŸããããOïŒN 2 ïŒã³ã¹ããããããŸãã çµåã®çµåãšããã·ã¥ã®çµåã¯åæã³ã¹ããé«ããªããŸãããããã€ãã®Nå€ã®åŸããããã¯æéå ã«ãã¹ããããã«ãŒãã«åã¡å§ããŸãã ã¹ã±ãžã¥ãŒã©ã¯ãã³ã¹ããæãäœããã©ã³ãéžæããããšããŸããäžèšã®ãã£ãŒãã§ã¯ãç°ãªãNïŒç·ã®ç Žç·ã®ç¢å°ïŒã§ç°ãªãæäœãé å®ããŠããŸãã N1ãŸã§ã®è¡æ°ã§ã¯ãNested Loopã䜿çšããæ¹ãåçæ§ãé«ããN1ããN2ãŸã§ã¯çµåã®æ¹ãåçæ§ãé«ããN2åŸã¯ããã·ã¥çµåã®æ¹ãåçæ§ãé«ããªããŸãããããã·ã¥çµåã§ã¯ããã·ã¥ããŒãã«ãäœæããããã«ã¡ã¢ãªãå¿ èŠã§ãã ãŸããN3ã«éãããšããã®ã¡ã¢ãªãäžè¶³ããMerge Joinã匷å¶çã«äœ¿çšãããŸãã
èšç»ãéžæãããšããã¹ã±ãžã¥ãŒã©ã¯ãããŒã¿ããŒã¹å ã®äžéšã®ãã¢ãããã¯ãæäœã®çžå¯Ÿã³ã¹ãã®ã»ããã䜿çšããŠãèšç»å ã®åæäœã®ã³ã¹ããæšå®ããŸãã ããšãã°ãèšç®ãæ¯èŒãã¡ã¢ãªãžã®ããŒãžã®ããŒããªã©ã 以äžã«ãããã©ã«ãæ§æããã®ãããã®ãã©ã¡ãŒã¿ãŒã®äžéšã®ãªã¹ãã瀺ããŸãããå€ãã¯ãããŸããã
çžå¯Ÿã³ã¹ãå®æ° | ããã©ã«ãå€ |
---|---|
seq_page_cost | 1.0 |
random_page_cost | 4.0 |
cpu_tuple_cost | 0.01 |
cpu_index_tuple_cost | 0.005 |
cpu_operator_cost | 0.0025 |
parallel_tuple_cost | 0.1 |
parallel_setup_cost | 1000.0 |
確ãã«ããããã®å®æ°ã ãã§ã¯ã»ãšãã©ãããŸããããNããã€ãŸããåæäœã§åã®çµæããåŠçããå¿ èŠãããè¡æ°ãæ£ç¢ºã«ç¥ãå¿ èŠããããŸãã ããã§ã®äžéã¯æããã§ããããŒã¿ããŒã¹ã¯ã©ã®ããŒãã«ã«ã©ãã ãã®ããŒã¿ããããããç¥ã£ãŠããããåžžã«ãæ倧ããŸã§èšç®ã§ããŸãã ããšãã°ãããããã100è¡ã®2ã€ã®ããŒãã«ãããå Žåãããããçµåãããšãåºåã«0ã10,000è¡ãçæãããŸãã ãããã£ãŠã次ã®å ¥åæäœã«ã¯æ倧10,000è¡ãå«ããããšãã§ããŸãã
ãã ããããŒãã«å ã®ããŒã¿ã®æ§è³ªã«ã€ããŠå°ãã§ãç¥ã£ãŠããã°ããã®è¡æ°ãããæ£ç¢ºã«äºæž¬ã§ããŸãã ããšãã°ãäžèšã®äŸã®100è¡ã®2ã€ã®ããŒãã«ã®å Žåãçµåã«ãã£ãŠ10,000è¡ã¯çæããããåã100è¡ãçæãããããšãäºåã«ããã£ãŠããå Žåã次ã®æäœã®æšå®ã³ã¹ãã¯å€§å¹ ã«åæžãããŸãã ãã®å Žåããã®èšç»ã¯ä»ã®èšç»ãããå¹æçã§ãã
ããã«äœ¿ããæé©å
ã¹ã±ãžã¥ãŒã©ãŒãäžéçµæã®ãµã€ãºãããæ£ç¢ºã«äºæž¬ã§ããããã«ããããã«ãPostgreSQLã¯ããŒãã«ã®çµ±èšåéã䜿çšããŸããçµ±èšåéã¯pg_statisticãŸãã¯ããèªã¿ãããããŒãžã§ã³ïŒpg_statsïŒã«èç©ãããŸãã ããã¥ãŒã ã®éå§æã«èªåçã«æŽæ°ãããããANALYZEã³ãã³ãã§æ瀺çã«æŽæ°ãããŸãã ãã®ããŒãã«ã«ã¯ãããŒãã«å ã®ããŒã¿ãšçš®é¡ã«é¢ããããŸããŸãªæ å ±ãæ ŒçŽãããŸãã ç¹ã«ãå€ã®ãã¹ãã°ã©ã ã空ã®ãã£ãŒã«ãã®å²åãããã³ãã®ä»ã®æ å ±ã èšç»è ã¯ããããã¹ãŠã䜿çšããŠãèšç»ããªãŒå ã®åæäœã®ããŒã¿éãããæ£ç¢ºã«äºæž¬ãããããã£ãŠæäœãšèšç»å šäœã®ã³ã¹ããããæ£ç¢ºã«èšç®ããŸãã
ã¯ãšãªãäŸã«åããŸãïŒ
SELECT t1.important_value FROM t1 WHERE t1.a > 100
ãt1.aãåã®å€ã®ãã¹ãã°ã©ã ã«ãããããŒãã«ã®è¡ã®çŽ1ïŒ ã«100ãè¶ ããå€ãèŠã€ãã£ãããšãå€æãããšä»®å®ããŸãã 次ã«ããã®ãããªãµã³ãã«ãããŒãã«ãt1ãã®ãã¹ãŠã®è¡ã®çŽ100åã®1ãè¿ããšäºæž¬ã§ããŸãã
ããŒã¿ããŒã¹ã§ã¯ãEXPLAIN ANALYZEã䜿çšããŠãEXPLAINã³ãã³ããä»ããŠèšç»ã®äºæž¬ã³ã¹ããšãã®æäœã®å®éã®æéã確èªããããšãã§ããŸãã
èªåçµ±èšã§ã¯ãã¹ãŠãããŸãããããã«èŠããŸãããåé¡ãçºçããå¯èœæ§ããããŸãã ããã«ã€ããŠã¯Citus Dataãã ãCREATE STATISTICSïŒPG 10.0ã§å©çšå¯èœïŒã䜿çšããèªåçµ±èšã®éå¹çæ§ãšè¿œå ã®çµ±èšã®åéã®äŸã«é¢ããè¯ãèšäºããããŸãã
ãã®ãããã¹ã±ãžã¥ãŒã©ã®å Žåãã³ã¹ãã®èšç®ã«ã¯2ã€ã®ãšã©ãŒã®åå ããããŸãã
- ããªããã£ãæäœã®çžå¯Ÿã³ã¹ãïŒseq_page_costãcpu_operator_costãªã©ïŒã¯ãããã©ã«ãã§ã¯å®éãšã¯å€§ããç°ãªãå ŽåããããŸãïŒcpuã³ã¹ã0.01ãsrqããŒãžããŒãã³ã¹ã-ã©ã³ãã ããŒãžããŒãã®å Žåã¯1ãŸãã¯4ïŒã 100åã®æ¯èŒã1ããŒãžã®èªã¿èŸŒã¿ã«çãããšããäºå®ããã¯ã»ã©é ãã
- äžéæäœã®è¡æ°ã®äºæž¬ãšã©ãŒã ãã®å Žåã®éçšã®å®éã®ã³ã¹ãã¯ãäºæž¬ãšã¯å€§ããç°ãªãå ŽåããããŸãã
è€éãªã¯ãšãªã§ã¯ãèãããããã¹ãŠã®èšç»ãäœæããŠäºæž¬ããã®ã«ãåç¬ã§å€ãã®æéãããããŸãã ããŒã¿ããŒã¹ãããããªãªã¯ãšã¹ãã®ã¿ãèšç»ããŠããå Žåã1ç§ã§ããŒã¿ãè¿ãã®ã¯ã©ã®ãããªçšéã§ããïŒ PostgreSQLã«ã¯ããã®ç¶æ³ã«å¯Ÿå¿ããGeqoãªããã£ãã€ã¶ãŒããããŸããããã¯ãå¯èœãªãã¹ãŠã®ãã©ã³ã®ããªãšãŒã·ã§ã³ãæ§ç¯ããã®ã§ã¯ãªããããã€ãã®ã©ã³ãã ãªãã©ã³ããå§ããŠæè¯ã®ãã©ã³ãå®æãããã³ã¹ããåæžããæ¹æ³ãäºæž¬ããã¹ã±ãžã¥ãŒã©ãŒã§ãã ããã¯ãã¹ãŠãäºæž¬ã®ç²ŸåºŠãåäžããããã®ã§ã¯ãããŸããããå°ãªããšãããçšåºŠã®æé©ãªèšç»ã®æ€çŽ¢ãé«éåããŸãã
çªç¶ã®èšç»-競åä»ç€Ÿ
ãã¹ãŠãããŸãããã°ããªã¯ãšã¹ãã¯å¯èœãªéãè¿ éã«åŠçãããŸãã ããŒã¿éãå¢å ããã«ã€ããŠãããŒã¿ããŒã¹ã§ã®ã¯ãšãªå®è¡ã®é床ãåŸã ã«å¢å ãããã°ããããŠãããã芳å¯ãããšãã¡ã¢ãªãŸãã¯CPUã³ã¢ã®æ°ãå¢ããããã¯ã©ã¹ã¿ãŒãæ¡åŒµãããªã©ãå¿ èŠã«ãªãææãããããäºæž¬ã§ããŸãã
ããããæé©ãªèšç»ã«ã¯å®è¡ã³ã¹ããè¿ã競åä»ç€Ÿãååšãããšããäºå®ãèæ ®ããå¿ èŠããããŸãããããã¯ããããŸããã ãŸããããŒã¿ããŒã¹ã§ã¯ãšãªãã©ã³ãçªç¶å€æŽãããå Žåãããã¯é©ãã§ãã ããŒã¿ããŒã¹ãããå¹ççãªèšç»ã«ãžã£ã³ãããã®ã¯è¯ãããšã§ãã ããã§ãªãå Žåã¯ïŒ ããšãã°ãåçãèŠãŠã¿ãŸãããã ããã¯ã2ã€ã®èšç»ïŒèµ€ãšç·ïŒã®å®è£ ã®äºæž¬ã³ã¹ããšãªã¢ã«ã¿ã€ã ã§ãã

ããã§ã¯ã1ã€ã®èšç»ãç·ã§è¡šç€ºãããæãè¿ãã競åä»ç€Ÿããèµ€ã§è¡šç€ºãããŸãã ç¹ç·ã¯äºæž¬ã³ã¹ãã®ã°ã©ãã瀺ããå®ç·ã¯ãªã¢ã«ã¿ã€ã ã§ãã ç°è²ã®ç Žç·ç¢å°ã¯ããã©ã³ããŒã®éžæã瀺ããŠããŸãã
ããéææ¥ã®å€ãããäžéæäœã§äºæž¬ãããè¡æ°ãN1ã«éãããèµ€ãã®äºæž¬ããç·ãã®äºæž¬ãäžåãå§ãããšããŸãã ã¹ã±ãžã¥ãŒã©ãŒã䜿çšãéå§ããŸãã å®éã®ã¯ãšãªå®è¡æéã¯ããã«ãžã£ã³ãããŸãïŒç·ã®å®ç·ããèµ€ã®å®ç·ã«åãæ¿ãããŸãïŒãã€ãŸããããŒã¿ããŒã¹ã®å£åã¹ã±ãžã¥ãŒã«ã¯ã¹ãããïŒãŸãã¯ãå£ãïŒã®åœ¢ããšããŸãã å®éã«ã¯ããã®ãããªãå£ãã¯ãã¯ãšãªã®å®è¡æéã1æ¡ä»¥äžå¢å ãããå¯èœæ§ããããŸãã
ãã®ç¶æ³ã¯ãããã³ããšã³ããããããã¯ãªãã£ã¹ãšåæã®æ¹ãããããäžè¬çã§ããããšã«æ³šæããŠãã ãããåŸè ã¯éåžžãããå€ãã®åæã¯ãšãªã«é©åããŠãããããèšç»äºæž¬ã®ãšã©ãŒãå°ãªãããŒã¿ããŒã¹ã§ããåçŽãªã¯ãšãªã䜿çšããããã§ãã ãããã¬ããŒããŸãã¯åæçšã®ããŒã¿ããŒã¹ã§ããå Žåãã¯ãšãªã¯ä»»æã«è€éã«ãªãå¯èœæ§ããããŸãã
ãããšäžç·ã«æ®ããã«ã¯ïŒ
çåãçããŸãããã®ãããªãæ°Žäžãã®ç®ã«èŠããªãèšç»ãã©ãã«ãäºèŠããããšãã§ããŸãããïŒ çµå±ã®ãšãããåé¡ã¯ããããæé©ã§ã¯ãªããšããããšã§ã¯ãªããå¥ã®èšç»ãžã®åãæ¿ããäºæããã«çºçããå¯èœæ§ããããå¹³åã®æ³åã«ããã°ããã®ããã®æãäžå¹žãªç¬éã§ãã
æ®å¿µãªãããããããçŽæ¥èŠãããšã¯ã§ããŸããããéžæãããå®éã®éã¿ãå€æŽããããšã«ããã代æ¿ãã©ã³ãæ¢ãããšãã§ããŸãã ãã®ã¢ãããŒãã®æå³ã¯ãæãè¿ã競åè ã®1人ãæé©ã«ãªãããã«ã¹ã±ãžã¥ãŒã©ãæé©ãšèŠãªãçŸåšã®èšç»ãèŠéããåé€ããããšã§ãããããã£ãŠãEXPLAINããŒã ãéããŠåœŒãèŠãããšãã§ããŸãã ãã®ãããªã競åä»ç€Ÿããšã¡ã€ã³ãã©ã³ã®ã³ã¹ãã®å€åãå®æçã«ãã§ãã¯ããããšã§ãããŒã¿ããŒã¹ãããã«å¥ã®ãã©ã³ã«ããžã£ã³ããããå¯èœæ§ãè©äŸ¡ã§ããŸãã
代æ¿èšç»ã®äºæž¬ã«é¢ããããŒã¿ãåéããã ãã§ãªããããããå®è¡ããŠãã®ããã©ãŒãã³ã¹ã枬å®ããããšãã§ããŸããããã«ãããããŒã¿ããŒã¹ã®å éšã幞çŠãã®æŠå¿µãããããŸãã
ãã®ãããªå®éšã®ããã«ç§ãã¡ãæã£ãŠããããŒã«ãèŠãŠã¿ãŸãããã
ãŸããã»ãã·ã§ã³å€æ°ã䜿çšããŠç¹å®ã®æäœãæ瀺çã«ãçŠæ¢ãã§ããŸãã 䟿å©ãªããšã«ãèšå®ã§å€æŽããå¿ èŠã¯ãªããããŒã¿ããŒã¹ããªããŒããããŸããå€ã¯çŸåšéããŠããã»ãã·ã§ã³ã§ã®ã¿å€æŽãããä»ã®ã»ãã·ã§ã³ã«ã¯åœ±é¿ããªããããå®éã®ããŒã¿ãçŽæ¥è©Šãããšãã§ããŸãã 以äžã«ãããã®ãªã¹ããšããã©ã«ãå€ã瀺ããŸãã ã»ãšãã©ãã¹ãŠã®æäœãå«ãŸããŸãã
䜿çšãããæäœ | ããã©ã«ãå€ |
---|---|
enable_bitmapscan
enable_hashagg enable_hashjoin enable_indexscan enable_indexonlyscan enable_material enable_mergejoin enable_nestloop enable_parallel_append enable_seqscan enable_sort enable_tidscan enable_parallel_hash enable_partition_pruning | ã« |
enable_partitionwise_join
enable_partitionwise_aggregate | ãªã |
ç¹å®ã®æäœãçŠæ¢ãŸãã¯èš±å¯ããããšã«ãããåãEXPLAINã³ãã³ãã§ç¢ºèªã§ããä»ã®ãã©ã³ãã¹ã±ãžã¥ãŒã©ãŒã«åŒ·å¶çã«éžæãããŸãã å®éãæäœã®ãçŠæ¢ãã¯äœ¿çšãçŠæ¢ãããã®ã§ã¯ãªããåã«ã³ã¹ããå€§å¹ ã«å¢å ãããŸãã PostgreSQLã§ã¯ããçŠæ¢ãæäœããšã«100ååŸæ¥åäœã®ã³ã¹ããèªåçã«ç©ã¿äžããããŸãã ããã«ãEXPLAINã§ã¯ãèšç»ã®ç·ééãéåžžã«é«ããªãããšããããŸããããããã®æ°çŸåãèæ¯ã«ãæ®ãã®æäœã®ééã¯ãéåžžã¯å°ãã泚æã«åãŸããããã¯ã£ãããšèŠããŸãã
ç¹ã«èå³æ·±ãã®ã¯ã次ã®2ã€ã®æäœã§ãã
- ããã·ã¥çµåã ãã®è€éãã¯OïŒNïŒã§ãããçµæã®éã®äºæž¬ã«ãšã©ãŒããããããã¡ã¢ãªã«åãŸãããOïŒN * logïŒNïŒïŒã®ã³ã¹ãã§çµåçµåãå®è¡ããå¿ èŠããããŸãã
- ãã¹ããããã«ãŒãã ãã®è€éãã¯OïŒN 2 ïŒã§ããããããµã€ãºäºæž¬ã®èª€å·®ã¯ãã®ãããªæ¥ç¶ã®é床ã«äºæ¬¡çã«åœ±é¿ããŸãã
ããšãã°ãã¯ãšãªããå®éã®æ°å€ãååŸããŠã¿ãŸããããã¯ãšãªã®æé©åã¯ãåœç€Ÿã§è¡ã£ãŠããŸããã
èšç»1.èš±å¯ããããã¹ãŠã®æäœã§ãæé©ãªèšç»ã®ç·ã³ã¹ãã¯274962.09ãŠãããã§ããã
èšç»2ã ãçŠæ¢ããã¹ãã«ãŒãã䜿çšãããšãã³ã¹ãã40000534153.85ã«å¢å ããŸãã è²»çšã®å€§éšåãå ãããããã®400åã¯ãçŠæ¢ã«ããããããã䜿çšããããã¹ããããã«ãŒãã®4åã§ãã æ®ãã®534153.85-ããã¯ãèšç»å ã®ä»ã®ãã¹ãŠã®æäœã®ã³ã¹ãã®æ£ç¢ºãªäºæž¬ã§ãã ã芧ã®ãšãããããã¯æé©ãªãã©ã³ã®ã³ã¹ãã®çŽ2åã§ããã€ãŸããéåžžã«è¿ãå€ã§ãã
èšç»3ã ãçŠæ¢ãããã·ã¥çµåã§ã¯ãã³ã¹ãã¯383253.77ã§ããã ãã®èšç»ã¯ãäœååãèŠãããªããããããã·ã¥çµåæäœã䜿çšããã«å®éã«äœæãããŸããã ãã ãããã®ã³ã¹ãã¯æé©ãªã³ã¹ãããã30ïŒ é«ãããããéåžžã«è¿ãå€ã§ãã
å®éã«ã¯ãã¯ãšãªã®å®è¡æéã¯æ¬¡ã®ãšããã§ããã
ãã©ã³1 ïŒãã¹ãŠã®æäœãèš±å¯ãããŠããŸãïŒã¯ãçŽ9åã§å®äºããŸããã
èšç»2 ïŒãçŠæ¢ãã®ãã¹ããããã«ãŒãã䜿çšïŒã¯1.5ç§ã§å®äºããŸããã
ãã©ã³3 ïŒãçŠæ¢ãããã·ã¥çµåã䜿çšïŒã¯ãçŽ5åã§å®äºããŸããã
ã芧ã®ããã«ãçç±ã¯ãã¹ããããã«ãŒãã®ã³ã¹ãã®èª€ã£ãäºæž¬ã§ãã å®éãEXPLAINãšEXPLAIN ANALYZEãæ¯èŒãããšãäžéæäœã§ã®äžéãªNã®å®çŸ©ã§ãšã©ãŒãæ€åºãããŸãã äºæž¬ãããåäžã®è¡ã§ã¯ãªãããã¹ããããã«ãŒããæ°åã®è¡ã«ééãããããã¯ãšãªã®å®è¡æéãæ°æ¡å¢å ããŸããã
ãçŠæ¢ãããã·ã¥çµåã«ããç¯çŽã¯ãããã·ã¥ããœãŒããšããŒãžçµåã«çœ®ãæããããšã«é¢é£ããŠããŸãããã®å Žåãããã·ã¥çµåãããéãåäœããŸããã ãã®èšç»2ã¯ãå®éã«ã¯ãæé©ãªãèšç»1ã®ã»ãŒ2åã®éãã§ããããšã«æ³šæããŠãã ããã
å®éã«ã¯ããªã¯ãšã¹ããçªç¶ïŒDBã®ã¢ããã°ã¬ãŒãåŸãŸãã¯åç¬ã§ïŒä»¥åãããé·ãå®è¡ããå§ããå ŽåããŸãããã·ã¥çµåãŸãã¯ãã¹ããããã«ãŒãã®ãããããæåŠãããããã¯ãšãªã®é床ã«ã©ã®ããã«åœ±é¿ãããã確èªããŠãã ããã æåããå Žåãå°ãªããšãæ°ããæé©ã§ãªãèšç»ãçŠæ¢ãã以åã®éãèšç»ã«æ»ãããšãã§ããŸãã
ãããè¡ãããã«ãããŒã¿ããŒã¹ã®åèµ·åã§PostgreSQLæ§æãã¡ã€ã«ãå€æŽããå¿ èŠã¯ãããŸãããã©ã®ã³ã³ãœãŒã«ã§ããããŒã¿ããŒã¹ããéããŠããã»ãã·ã§ã³ã®ç®çã®å€æ°ã®å€ãå€æŽããã®ã¯éåžžã«ç°¡åã§ãã æ®ãã®ã»ãã·ã§ã³ã¯åœ±é¿ãåãããçŸåšã®ã»ãã·ã§ã³ã®æ§æã®ã¿ãå€æŽãããŸãã ããšãã°ã次ã®ããã«ïŒ
SET enable_hashjoin='on'; SET enable_nestloop='off'; SELECT ⊠FROM ⊠( )
èšç»ã®éžæã«åœ±é¿ãäžãã2çªç®ã®æ¹æ³ã¯ãäœã¬ãã«æäœã®éã¿ãå€æŽããããšã§ãã ããã«ã¯æ®éçãªã¬ã·ãã¯ãããŸããããããšãã°ãããŠã©ãŒã ã¢ããããã£ãã·ã¥ãåããããŒã¿ããŒã¹ããããããŒã¿å šäœãã¡ã¢ãªã«æ ŒçŽãããŠããå Žåãã·ãŒã±ã³ã·ã£ã«ããŒãžããŒãã®ã³ã¹ãã¯ã©ã³ãã ããŒãžã®ããŒãã®ã³ã¹ããšå€ãããªãå¯èœæ§ããããŸãã äžæ¹ãããã©ã«ãã®æ§æã§ã¯ãrandomã¯é 次ã®4åã®è²»çšãããããŸãã
ãŸãã¯ãå¥ã®äŸã§ã¯ã䞊ååŠçãå®è¡ããæ¡ä»¶ä»ãã³ã¹ãã¯ããã©ã«ãã§1000ã§ãããããŒãžãããŒãããã³ã¹ãã¯1.0ã§ãã äžåºŠã«1ã€ã®ãã©ã¡ãŒã¿ãŒã®ã¿ãå€æŽããŠããããèšç»ã®éžæã«åœ±é¿ãããã©ãããå€å¥ããããšããå§ããã®ã¯çã«ããªã£ãŠããŸãã æãåçŽãªæ¹æ³ã¯ããã©ã¡ãŒã¿ãŒã0ãŸãã¯é«ãå€ïŒ100äžïŒã«èšå®ããŠéå§ããããšã§ãã
ãã ãããããªã¯ãšã¹ãã®ããã©ãŒãã³ã¹ãæ¹åããããšã§ãå¥ã®ãªã¯ãšã¹ãã®ããã©ãŒãã³ã¹ãäœäžãããå¯èœæ§ãããããšãèŠããŠããå¿ èŠããããŸãã äžè¬çã«ãå®éšã«ã¯å¹ åºãåéããããŸãã é çªã«1ã€ãã€å€æŽããŠã¿ãŠãã ããã
代æ¿æ²»çãªãã·ã§ã³
ã¹ã±ãžã¥ãŒã©ã«é¢ãã話ã¯ãå°ãªããšã2ã€ã®PostgreSQLæ¡åŒµã«ã€ããŠèšåããªããã°äžå®å šã§ãã
1ã€ç®ã¯SR_PLANã§ãèšç®ããããã©ã³ãä¿åãããã以äžäœ¿çšããããšã匷å¶ããŸãã ããã«ããããã©ã³ã®éžæã«é¢ããŠããŒã¿ããŒã¹ã®åäœãããäºæž¬ãããããªããŸãã
2ã€ç®ã¯ã ã¯ãšãªã®ãªã¢ã«ã¿ã€ã å®è¡ããã¹ã±ãžã¥ãŒã©ãŒãžã®ãã£ãŒãããã¯ãå®è£ ããAdaptive Query Optimizerã§ããã€ãŸããã¹ã±ãžã¥ãŒã©ãŒã¯ãå®è¡ãããã¯ãšãªã®å®éã®çµæã枬å®ããããã念é ã«çœ®ããŠå°æ¥ã®èšç»ã調æŽããŸãã ãããã£ãŠãããŒã¿ããŒã¹ã¯ç¹å®ã®ããŒã¿ãšã¯ãšãªã«å¯ŸããŠãèªå·±èª¿æŽããããŸãã
ããŒã¿ããŒã¹ã®é床ãäœäžããå Žåãä»ã«äœãããŸããïŒ
ã¯ãšãªãã©ã³ãå€ããå°ãªããæŽçããã®ã§ãããŒã¿ããŒã¹èªäœãšãããã䜿çšããŠæ倧ã®ããã©ãŒãã³ã¹ãåŸãããã«ããã䜿çšããã¢ããªã±ãŒã·ã§ã³ã®äž¡æ¹ã§ãä»ã«æ¹åã§ãããã®ã確èªããŸãã
ã¯ãšãªãã©ã³ãæ¢ã«æé©ã§ãããšããŸãã æãæãããªåé¡ïŒã¡ã¢ãªäžè¶³ãŸãã¯é ããã£ã¹ã¯/ãããã¯ãŒã¯ïŒãé€å€ããå Žåãããã·ã¥ã®èšç®ã«ã¯äŸç¶ãšããŠã³ã¹ããããããŸãã PostgreSQLã®å°æ¥ã®æ¹åïŒããããGPUãŸãã¯CPUã®SSE2 / SSE3 / AVXåœä»€ã䜿çšïŒã®å€§ããªæ©äŒããããããããŸãããããã¯ãŸã è¡ãããŠããããããã·ã¥èšç®ã¯ããŒããŠã§ã¢ã®ããŒããŠã§ã¢æ©èœãã»ãšãã©äœ¿çšããŠããŸããã ãã®ããŒã¿ããŒã¹ã§å°ãå©ããŠãã ããã
æ°ãä»ããšãããã©ã«ãã§PostgreSQLã®ã€ã³ããã¯ã¹ã¯bããªãŒãšããŠäœæãããŸãã ãããã®æçšæ§ã¯ãéåžžã«çšéãåºãããšã§ãã ãã®ãããªã€ã³ããã¯ã¹ã¯ãç䟡æ¡ä»¶ãšæ¯èŒæ¡ä»¶ïŒå€ããå°ãªããïŒã®äž¡æ¹ã§äœ¿çšã§ããŸãã ãã®ãããªã€ã³ããã¯ã¹ã§ã¢ã€ãã ãèŠã€ããããšã¯å¯Ÿæ°ã³ã¹ãã§ãã ãã ããã¯ãšãªã«çå€æ¡ä»¶ã®ã¿ãå«ãŸããå Žåãã€ã³ããã¯ã¹ã¯ããã·ã¥ã€ã³ããã¯ã¹ãšããŠäœæããããšãã§ããŸããããã®ã³ã¹ãã¯äžå®ã§ãã
ããã«ããªã¯ãšã¹ããä¿®æ£ããŠã䞊åå®è¡ã䜿çšããããšãã§ããŸãã æžãæãæ¹æ³ãæ£ç¢ºã«ç解ããã«ã¯ãã¹ã±ãžã¥ãŒã©ã«ãã£ãŠåæå®è¡ãèªåçã«çŠæ¢ãããŠããå Žåã®ãªã¹ããããç解ãããã®ãããªç¶æ³ãåé¿ããã®ãæåã§ãã ãã®ãããã¯ã®ããã¥ã¢ã«ã§ã¯ããã¹ãŠã®ç¶æ³ã«ã€ããŠç°¡åã«èª¬æããŠãããããããã§ããããç¹°ãè¿ãããšã¯æå³ããããŸããã
ãªã¯ãšã¹ãã®äžŠè¡æ§ããŸã äžååãªå Žåã¯ã©ãããã°ããã§ããïŒ ããªããå¯äžã®ã¯ã©ã€ã¢ã³ãã§ããã1ã€ã®ã³ã¢ã100ïŒ å æãããä»ã®ãã¹ãŠã®ã«ãŒãã«ããããèŠãã ãã§ããã匷åãªãã«ãã³ã¢ããŒã¿ããŒã¹ã§èŠãã®ã¯éåžžã«æ²ããããšã§ãã ãã®å Žåãã¢ããªã±ãŒã·ã§ã³ããããŒã¿ããŒã¹ãæ¯æŽããå¿ èŠããããŸãã åã»ãã·ã§ã³ã«ã¯ç¬èªã®ã³ã¢ãå²ãåœãŠãããŠããããããããã®ããã€ããéããŠãäžè¬çãªã¯ãšãªãéšåã«åå²ããããçãéžæãšããéãéžæãè¡ããããããã¢ããªã±ãŒã·ã§ã³å ã®æ¢ã«å ±éã®çµæã«çµåã§ããŸãã ããã«ãããPostgreSQLããŒã¿ããŒã¹ã§äœ¿çšå¯èœãªæ倧CPUãªãœãŒã¹ã䜿çšãããŸãã
çµè«ãšããŠãäžèšã®èšºæããã³æé©åæ©èœã¯æ°·å±±ã®äžè§ã«ãããŸãããããããã¯éåžžã«äœ¿ãããããæ§æãå°ç¡ãã«ããããä»ã®ã¢ããªã±ãŒã·ã§ã³ã®åäœãäžæãããããããšãªããéçšããŒã¿äžã§åé¡ãçŽæ¥è¿ éã«ç¹å®ããã®ã«åœ¹ç«ã¡ãŸãã
æ£ç¢ºã§çãèšç»ã§ãããªãã®ãªã¯ãšã¹ãã«å¹žéãã