䞊è¡ããŠå®è¡ãããã¯ãšãªã¯ãé æ¬¡å®è¡ãããã¯ãšãªãããå°ãªãCPUã䜿çšããé«éã«å®è¡ã§ããŸããïŒ
ã¯ãïŒãã¢ã³ã¹ãã¬ãŒã·ã§ã³ã§ã¯ã1ã€ã®åã¿ã€ããæã€2ã€ã®ããŒãã«ã䜿çšããŸã
integerã
泚-ããã¹ã圢åŒã®TSQLã¹ã¯ãªããã¯ãèšäºã®æåŸã«ãããŸãã
ãã¢ããŒã¿ã®çæ
#BuildInt5,000åã®ã©ã³ãã ãªæŽæ°ã
ããŒãã«ã«æ¿å
¥ããŸãïŒç§ã®ãã®ãšåãå€ã«ãªãããã«ãã·ãŒããšWHILEã«ãŒãã§RANDã䜿çšããŸãïŒã5,000,000ã¬ã³ãŒãã
ããŒãã«ã«
#Probeæ¿å
¥ããŸãã
ã·ãŒã±ã³ã·ã£ã«ãã©ã³
次ã«ããããã®ããŒãã«ã®å€ã®äžèŽæ°ãã«ãŠã³ãããã¯ãšãªãäœæããŸããããMAXDOP 1ãã³ãã䜿çšããŠãã¯ãšãªã䞊è¡ããŠå®è¡ãããªãããã«ããŸãã
ãã®å®è¡èšç»ãšçµ±èšã¯æ¬¡ã®ãšããã§ãã
ãã®ã¯ãšãªã¯891ããªç§ãããã890ããªç§ã®CPUã䜿çšããŸãã
䞊è¡èšç»
ããã§ãMAXDOP 2ã䜿çšããŠåãã¯ãšãªãå®è¡ããŠã¿ãŸãããã
ã¯ãšãªã«ã¯221ããªç§ãããã436ããªç§ã®CPUã䜿çšããŸããå®è¡æéã4åã®1ã«ççž®ãããCPU䜿çšéãååã«ãªããŸããã
ããžãã¯ãããããã
䞊åã¯ãšãªã®å®è¡ãã¯ããã«å¹ççã§ããçç±ã¯ãããããããæŒç®åã®ããã§ãã
䞊åã¯ãšãªã®å®éã®å®è¡èšç»ã詳ããèŠãŠã¿ãŸãããã
ãããé æ¬¡èšç»ãšæ¯èŒããŸãã
ããããããæŒç®åã®åçã¯ååã«ææžåãããŠãããããããã§ã¯ãèšäºã®æåŸã«ããææžãžã®ãªã³ã¯ãå«ãç°¡åãªèª¬æã®ã¿ãæäŸããŸãã
ããã·ã¥åå
ããã·ã¥çµåã¯2ã€ã®ã¹ãããã§è¡ãããŸãã
- ãæ§ç¯ãã®æ®µéïŒè±èª-æ§ç¯ïŒãããããã®ããŒãã«ã®ãã¹ãŠã®è¡ãèªã¿åãããçµåããŒã®ããã·ã¥ããŒãã«ãäœæãããŸãã
- ãæ€èšŒãã®æ®µéïŒè±èª-ãããŒãïŒã2çªç®ã®ããŒãã«ã®ãã¹ãŠã®è¡ãèªã¿åãããåãæ¥ç¶ããŒã䜿çšããŠåãããã·ã¥é¢æ°ã«ãã£ãŠããã·ã¥ãèšç®ãããäžèŽãããã±ãããããã·ã¥ããŒãã«ã§èŠã€ãããŸãã
åœç¶ãããã·ã¥ã®è¡çªãçºçããå¯èœæ§ããããããããŒã®å®éã®å€ãæ¯èŒããå¿ èŠããããŸãã
翻蚳è ã®ã¡ã¢ïŒããã·ã¥çµåã®ä»çµã¿ã®è©³çްã«ã€ããŠã¯ãããã·ã¥ããã çµåã®èŠèŠåãšåŠçã®èšäºãåç §ããŠãã ããã
ã·ãŒã±ã³ã·ã£ã«ãã©ã³ã®ãããããã
å€ãã®äººã¯ãããã·ã¥ããããã·ãŒã±ã³ã·ã£ã«ãªã¯ãšã¹ãã§ãã£ãŠããåžžã«ããããããã䜿çšããããšãç¥ããŸããããã ãããã®ãããªèšç»ã§ã¯ãããã·ã¥äžèŽæŒç®åã®å éšå®è£ ã®äžéšã§ãããããæç€ºçã«è¡šç€ºãããŸããã
ããã·ã¥ããŒãã«ãäœæããã³äœæããæ®µéã§ã®HASHJOINã¯ãããããããã«1ã€ïŒãŸãã¯è€æ°ïŒã®ããããèšå®ããŸãããã®åŸãããããããã䜿çšããŠãããã·ã¥ããŒãã«ã«ã¢ã¯ã»ã¹ãããªãŒããŒããããªãã«ãããã·ã¥å€ãå¹ççã«ç §åã§ããŸãã
ã·ãŒã±ã³ã·ã£ã«ãã©ã³ã§ã¯ã2çªç®ã®ããŒãã«ã®è¡ããšã«ããã·ã¥ãèšç®ããããããããããšç §åãããŸããããããããã®å¯Ÿå¿ããããããèšå®ãããŠããå Žåãããã·ã¥ããŒãã«ã«äžèŽããå¯èœæ§ããããããæ¬¡ã«ããã·ã¥ããŒãã«ããã§ãã¯ãããŸããéã«ãããã·ã¥å€ã«å¯Ÿå¿ããããããèšå®ãããŠããªãå Žåã¯ãããã·ã¥ããŒãã«ã«äžèŽãããã®ããªãããšã確èªã§ãããã§ãã¯ãããæååãããã«ç Žæ£ã§ããŸãã
ãããããããæ§ç¯ããããã®æ¯èŒçäœãã³ã¹ãã¯ãããã·ã¥ããŒãã«ã«å®å šã«äžèŽãããã®ããªãæååããã§ãã¯ããªãããšã«ããæéã®ç¯çŽã«ãã£ãŠçžæ®ºãããŸããããããããã®ãã§ãã¯ã¯ããã·ã¥ããŒãã«ã®ãã§ãã¯ãããã¯ããã«é«éã§ããããããã®æé©åã¯å€ãã®å Žå广çã§ãã
䞊è¡èšç»ã®ãããããã
䞊åãã©ã³ã§ã¯ãããããããã¯åå¥ã®ããããããã¹ããŒãã¡ã³ããšããŠè¡šç€ºãããŸãã
æ§ç¯æ®µéããæ€èšŒæ®µéã«ç§»è¡ãããšããããããããã¯2çªç®ã®ïŒãããŒãïŒããŒãã«ã®åŽããHASHMATCHãªãã¬ãŒã¿ãŒã«æž¡ãããŸããå°ãªããšããããããããã¯JOINãšäº€ææŒç®åïŒäžŠååŠçïŒã®åã«ãããŒãåŽã«æž¡ãããŸãã
ããã§ãããããããã¯ã亀æã¹ããŒãã¡ã³ãã«æž¡ãããåã«çµåæ¡ä»¶ãæºãããªãæååãé€å€ã§ããŸãã
ãã¡ãããã·ãŒã±ã³ã·ã£ã«ãã©ã³ã«ã¯äº€æã¹ããŒãã¡ã³ãããªãããããããããããHASH JOINã®å€ã«ç§»åããŠããHASHMATCHã¹ããŒãã¡ã³ãå ã®ãåã蟌ã¿ãããããããã«åã远å ã®å©ç¹ã¯ãããŸããã
ç¶æ³ã«ãã£ãŠã¯ïŒäžŠåãã©ã³ã®ã¿ã§ããïŒããªããã£ãã€ã¶ãŒã¯ãããããããæ¥ç¶ã®ãããŒãåŽã®å¹³é¢ã®ããã«äžã«ç§»åããå ŽåããããŸãã
ããã§ã®èãæ¹ã¯ãè¡ã®ãã£ã«ã¿ãªã³ã°ãæ©ããã°æ©ãã»ã©ãã¹ããŒãã¡ã³ãéã§ããŒã¿ãç§»åããããã«å¿ èŠãªãªãŒããŒããããå°ãªããªããäžéšã®æäœãæé€ã§ããå¯èœæ§ãããããšããããšã§ãã
ãŸãããªããã£ãã€ã¶ã¯éåžžãåçŽãªãã£ã«ã¿ãèã®ã§ããã ãè¿ãã«é 眮ããããšããŸããè¡ãã§ããã ãæ©ããã£ã«ã¿ãªã³ã°ããã®ãæãå¹ççã§ãããã ããããã§èª¬æããŠããããããããã¯ãæé©åãå®äºããåŸã«è¿œå ãããããšã«æ³šæããå¿ èŠããããŸãã
æé©ååŸã«ãã®ïŒéçïŒã¿ã€ãã®ããããããããã©ã³ã«è¿œå ãããã©ããã®æ±ºå®ã¯ããã£ã«ã¿ãŒã®äºæ³ãããéžææ§ã«åºã¥ããŠè¡ãããŸãïŒãããã£ãŠãæ£ç¢ºãªçµ±èšãéèŠã§ãïŒã
ãããããããã£ã«ã¿ãŒã®ç§»å
ãããããããã£ã«ã¿ãŒãæ¥ç¶ã®ãããŒãåŽã«ç§»åãããšããæŠå¿µã«æ»ããŸãããã
å€ãã®å Žåããããããããã£ã«ã¿ãŒã¯ã¹ãã£ã³ãŸãã¯ã·ãŒã¯ã¹ããŒãã¡ã³ãã«ç§»åã§ããŸãããããçºçãããšããã©ã³è¿°èªã¯æ¬¡ã®ããã«ãªããŸãã
ã·ãŒã¯è¿°èªïŒã€ã³ããã¯ã¹ã·ãŒã¯ã®å ŽåïŒã«äžèŽãããã¹ãŠã®è¡ããŸãã¯ã€ã³ããã¯ã¹ã¹ãã£ã³ãŸãã¯ããŒãã«ã¹ãã£ã³ã®ãã¹ãŠã®è¡ã«é©çšãããŸããããšãã°ãäžã®ã¹ã¯ãªãŒã³ã·ã§ããã¯ãããŒãããŒãã«ã®ããŒãã«ã¹ãã£ã³ã«é©çšããããããããããã£ã«ã¿ãŒã瀺ããŠããŸãã
æ·±ããªã..ã
ãããããããã£ã«ã¿ãŒãintegerãŸãã¯bigintåã®åäžã®åãŸãã¯åŒã«åºã¥ããŠæ§ç¯ãããintegerãŸãã¯bigintåã®åäžã®åã«é©çšãããå ŽåãBitmapæŒç®åã¯ãSeekãŸãã¯ScanæŒç®åãããããã«å ã«ç§»åã§ããŸãã
è¿°èªã¯ãäžèšã®äŸã®ããã«ScanãŸãã¯Seekã¹ããŒãã¡ã³ãã«åŒãç¶ã衚瀺ãããŸãããINROW屿§ã§ããŒã¯ãããŸããããã¯ããã£ã«ã¿ãŒãã¹ãã¬ãŒãžãšã³ãžã³ã«ç§»åãããèªã¿åããããšãã«è¡ã«é©çšãããããšãæå³ããŸãã
ãã®æé©åã§ã¯ãã¯ãšãªããã»ããµãè¡ãèªèããåã«è¡ããã£ã«ã¿ãªã³ã°ãããŸãã HASH MATCHJOINã«äžèŽããæååã®ã¿ãã¹ãã¬ãŒãžãšã³ãžã³ããéä¿¡ãããŸãã
ãã®æé©åãé©çšãããæ¡ä»¶ã¯ãSQLServerã®ããŒãžã§ã³ã«ãã£ãŠç°ãªããŸããããšãã°ãSQL Server 2005ã§ã¯ãåã«æå®ããæ¡ä»¶ã«å ããŠããããŒãåãNOTNULLãšããŠå®çŸ©ããå¿ èŠããããŸãããã®å¶éã¯
SQLServer2008ã§ç·©åãããŸãããINROWã®æé©åãããã©ãŒãã³ã¹ã«ã©ã®ããã«åœ±é¿ããã®ãçåã«æããããããããŸããããªãã¬ãŒã¿ãŒãã·ãŒã¯ãŸãã¯ã¹ãã£ã³ã«ã§ããã ãè¿ã¥ããããšã¯ãã¹ãã¬ãŒãžãšã³ãžã³ã§ã®ãã£ã«ã¿ãªã³ã°ãšåããããå¹ççã§ããïŒãã®è峿·±ã質åã«ã¯ä»ã®èšäºã§çããŸãããããŠãããã§ã¯MERGEJOINãšNESTEDLOOPJOINã«ã€ããŠãèŠãŠãããŸãã
ãã®ä»ã®JOINãªãã·ã§ã³
ã€ã³ããã¯ã¹ãªãã§ãã¹ããããã«ãŒãã䜿çšããããšã¯æªãèãã§ããä»ã®ããŒãã«ãããã¹ãŠã®è¡ã«ã€ããŠããŒãã«ã®1ã€ãå®å šã«ã¹ãã£ã³ããå¿ èŠããããŸã-åèš50åã®æ¯èŒããã®ãªã¯ãšã¹ãã«ã¯éåžžã«é·ãæéããããå¯èœæ§ããããŸãã
ããŒãžåå
ãã®ã¿ã€ãã®ç©ççµåã«ã¯ãœãŒããããå ¥åãå¿ èŠãªããã匷å¶çãªMERGE JOINã«ããããã®åã«ãœãŒããååšããŸããã·ãŒã±ã³ã·ã£ã«ãã©ã³ã¯æ¬¡ã®ããã«ãªã
ãŸããã¯ãšãªã¯3105msã®CPUã䜿çšããåèšå®è¡æéã¯5632msã§ãã
å šäœçãªå®è¡æéã®å¢å ã¯ããœãŒãæäœã®1ã€ãtempdbã䜿çšããŠããããã§ãïŒSQL Serverã«ã¯ãœãŒãã«ååãªã¡ã¢ãªããããŸããïŒã
tempdbãžã®ãªãŒã¯ã¯ãããã©ã«ãã®ã¡ã¢ãªèš±å¯ã¢ã«ãŽãªãºã ãååãªã¡ã¢ãªãäºåã«äºçŽããŠããªãããã«çºçããŸããããã«æ³šæãæããŸã§ããªã¯ãšã¹ãã3105ããªç§ä»¥å ã«å®äºããªãããšã¯æããã§ãã
åŒãç¶ãMERGEJOINã匷å¶ããŸããã䞊ååŠçãèš±å¯ããŸãïŒMAXDOP 2ïŒïŒ
åã«èŠã䞊åHASH JOINãšåæ§ã«ããããããããã£ã«ã¿ãŒã¯MERGE JOINã®å察åŽãããŒãã«ã¹ãã£ã³ã«è¿ãäœçœ®ã«ãããINROWæé©åã䜿çšããŠé©çšãããŸãã468ããªç§ã®CPUãš240ããªç§ã®çµéæéãMERGEã¯ã远å ã®ãœãŒããšJOINå¹³è¡ããã·ã¥ïŒJOINãšã»ãŒåãé床ã§436ããªç§/ 221ããªç§ïŒã
ãã ãã䞊åMERGE JOINã«ã¯1ã€ã®æ¬ ç¹ããããŸããããã¯ããœãŒãããè¡ã®äºæ³æ°ã«åºã¥ããŠ330KBã®ã¡ã¢ãªãäºçŽããããšã§ãããããã®ã¿ã€ãã®ããããããã¯ã³ã¹ãæé©ååŸã«äœ¿çšãããããã2488è¡ã®ã¿ãæäžäœã®äžŠã¹æ¿ããééããå Žåã§ããèŠç©ããã¯èª¿æŽãããŸããã
ããããããã¹ããŒãã¡ã³ãã¯ãåŸç¶ã®ããããã³ã°ã¹ããŒãã¡ã³ãïŒããšãã°ãäžŠã¹æ¿ãïŒã§ã®ã¿MERGEJOINã䜿çšããŠãã©ã³ã«è¡šç€ºã§ããŸããããããã³ã°ãªãã¬ãŒã¿ãŒã¯ãåºåããæåã®è¡ãçæããåã«ãå¿ èŠãªãã¹ãŠã®å€ãå ¥åãšããŠåãåãå¿ èŠããããŸããããã«ãããJOINããŒãã«ã®è¡ãèªã¿åãããŠãã§ãã¯ãããåã«ããããããããå®å šã«ãã£ã±ãã«ãªããŸãã
ããããã³ã°ã¹ããŒãã¡ã³ããMERGEJOINã®å察åŽã«ããå¿ èŠã¯ãããŸãããããããããããã©ã¡ãã®åŽã§äœ¿çšããããã¯éèŠã§ãã
ã€ã³ããã¯ã¹ä»ã
é©åãªææšãå©çšã§ããå Žåãç¶æ³ã¯ç°ãªããŸãããã©ã³ãã ãããŒã¿ã®ååžã¯ãããŒãã«äžã«
#BuildIntäžæã®ã€ã³ããã¯ã¹ãäœæã§ããããã«ãªã£ãŠããŸãããŸããããŒãã«ã«#Probeã¯éè€ãå«ãŸããŠãããããäžæã§ãªãã€ã³ããã¯ã¹ã䜿çšãã
å¿ èŠããããŸãããã®å€æŽã¯ãHASH JOINïŒã·ãªã¢ã«ãšãã©ã¬ã«ã®äž¡æ¹ïŒã«ã¯åœ±é¿ããŸãããHASH JOINã¯ã€ã³ããã¯ã¹ã䜿çšã§ããªããããèšç»ãšããã©ãŒãã³ã¹ã¯åããŸãŸã§ãã
ããŒãžåå
MERGE JOINã¯ãå€å¯Ÿå€ã®çµåæäœãå®è¡ããå¿ èŠããªããªããå ¥åã«å¯ŸããŠãœãŒãæŒç®åãå¿ èŠãšããªããªããŸããã
ããããã³ã°ãœãŒãæŒç®åããªããšããããšã¯ãããããããã䜿çšã§ããªãããšãæå³ããŸãã
ãã®çµæãMAXDOPãã©ã¡ãŒã¿ã«é¢ä¿ãªããã·ãŒã±ã³ã·ã£ã«ãã©ã³ã衚瀺ãããã€ã³ããã¯ã¹ã远å ããåã®ããã©ãŒãã³ã¹ã¯ãã©ã¬ã«ãã©ã³ãããæªããªããŸããCPUã702ããªç§ãçµéæéã704ããªç§ã§ãã
ãã ããå ã®ã·ãŒã±ã³ã·ã£ã«MERGE JOINãã©ã³ïŒ3105ããªç§ïŒãããå€§å¹ ã«æ¹åãããŠããŸãã/ 5632ããªç§ïŒãããã¯ãäžŠã¹æ¿ããäžèŠã«ãªãã1察å€ã®çµåããã©ãŒãã³ã¹ãåäžããããã§ãã
ãã¹ããããã«ãŒããåå ããŸã
ãæ³åã®ãšãããNESTEDLOOPã®ããã©ãŒãã³ã¹ã¯å€§å¹ ã«åäžããŠããŸãã MERGEãšåæ§ã«ãJOINããªããã£ãã€ã¶ã䜿çšããåæå®è¡ããªãããšã決å®ããïŒ
ããã¯ããããŸã§æãå¹ççãªãã©ã³ã§ã-ã®ã¿16msã®CPUãš16msã®æéãéãããŸãããã
ãã¡ãããããã¯ãèŠæ±ãå®äºããããã«å¿ èŠãªããŒã¿ããã§ã«ã¡ã¢ãªã«ããããšãåæãšããŠããŸãããã以å€ã®å ŽåããããŒãããŒãã«ã®åã«ãã¯ã¢ããã¯ã©ã³ãã ãªI / OãçæããŸãã
NESTED LOOPã³ãŒã«ããã£ãã·ã¥ã®ç§ã®ã©ãããããããã©ãŒãã³ã¹ã§ã¯ã78ããªç§ã®CPUãš2152ããªç§ã®çµéæéãããããŸãããåãç¶æ³äžã§ãMERGEJOINã¯686ããªç§ã®CPUãš1471ããªç§ã䜿çšããŸãããããã·ã¥çµå-391ããªç§ã®CPUãš905ããªç§ã
MERGEJOINãšHASHJOINã¯ãå èªã¿ã䜿çšããå€§èŠæš¡ãªãå Žåã«ãã£ãŠã¯é 次ã®I / Oã®æ©æµãåããŸãã
远å ãªãœãŒã¹
䞊åããã·ã¥çµåïŒCraig FreedmanïŒ
ã¯ãšãªå®è¡ãããããããã£ã«ã¿ãŒïŒSQL Serverã¯ãšãªåŠçããŒã ïŒ
Microsoft SQL Server 2000ã®ããããããïŒMSDNèšäºïŒ
ãããããããã£ã«ã¿ãŒãå«ãå®è¡èšç»ã®è§£éïŒSQL Serverããã¥ã¡ã³ãïŒ
ããã·ã¥çµåã«ã€ããŠïŒSQL Serverããã¥ã¡ã³ãïŒ
ãã¹ãã¹ã¯ãªãã
USE tempdb;
GO
CREATE TABLE #BuildInt
(
col1 INTEGER NOT NULL
);
GO
CREATE TABLE #Probe
(
col1 INTEGER NOT NULL
);
GO
-- Load 5,000 rows into the build table
SET NOCOUNT ON;
SET STATISTICS XML OFF;
DECLARE @I INTEGER = 1;
INSERT #BuildInt
(col1)
VALUES
(CONVERT(INTEGER, RAND(1) * 2147483647));
WHILE @I < 5000
BEGIN
INSERT #BuildInt
(col1)
VALUES
(RAND() * 2147483647);
SET @I += 1;
END;
-- Load 5,000,000 rows into the probe table
SET NOCOUNT ON;
SET STATISTICS XML OFF;
DECLARE @I INTEGER = 1;
INSERT #Probe
(col1)
VALUES
(CONVERT(INTEGER, RAND(2) * 2147483647));
BEGIN TRANSACTION;
WHILE @I < 5000000
BEGIN
INSERT #Probe
(col1)
VALUES
(CONVERT(INTEGER, RAND() * 2147483647));
SET @I += 1;
IF @I % 25 = 0
BEGIN
COMMIT TRANSACTION;
BEGIN TRANSACTION;
END;
END;
COMMIT TRANSACTION;
GO
-- Demos
SET STATISTICS XML OFF;
SET STATISTICS IO, TIME ON;
-- Serial
SELECT
COUNT_BIG(*)
FROM #BuildInt AS bi
JOIN #Probe AS p ON
p.col1 = bi.col1
OPTION (MAXDOP 1);
-- Parallel
SELECT
COUNT_BIG(*)
FROM #BuildInt AS bi
JOIN #Probe AS p ON
p.col1 = bi.col1
OPTION (MAXDOP 2);
SET STATISTICS IO, TIME OFF;
-- Indexes
CREATE UNIQUE CLUSTERED INDEX cuq ON #BuildInt (col1);
CREATE CLUSTERED INDEX cx ON #Probe (col1);
-- Vary the query hints to explore plan shapes
SELECT
COUNT_BIG(*)
FROM #BuildInt AS bi
JOIN #Probe AS p ON
p.col1 = bi.col1
OPTION (MAXDOP 1, MERGE JOIN);
GO
DROP TABLE #BuildInt, #Probe;
ç¶ããèªãïŒ