dzÎöSQL ServerÈý´óËã·¨µÄI/O³É±¾
1. Nested Loop Join(ǶÌ×Ñ»·Áª½á)
Ëã·¨£º
Æä˼·Ï൱µÄ¼òµ¥ºÍÖ±½Ó£º¶ÔÓÚ¹ØÏµRµÄÿ¸öÔª×é r ½«ÆäÓë¹ØÏµSµÄÿ¸öÔª×é s ÔÚJOINÌõ¼þµÄ×Ö¶ÎÉÏÖ±½Ó±È½Ï²¢É¸Ñ¡³ö·ûºÏÌõ¼þµÄÔª×顣д³Éα´úÂë¾ÍÊÇ£º
´ú¼Û£º
±»Áª½áµÄ±íËù´¦ÄÚ²ã»òÍâ²ãµÄ˳Ðò¶Ô´ÅÅÌI/O¿ªÏúÓÐ×ŷdz£ÖØÒªµÄÓ°Ïì¡£¶øCPU¿ªÏúÏà¶ÔÀ´ËµÓ°Ïì½ÏС£¬Ö÷ÒªÊÇÔª×é¶ÁÈëÄÚ´æÒÔºó(in-memory)µÄ¿ªÏú£¬ÊÇ O (n * m)
¶ÔÓÚI/O¿ªÏú£¬¸ù¾Ý page-at-a-time µÄǰÌáÌõ¼þ£¬I/O cost = M + M * N£¬
·ÒëһϾÍÊÇ I/OµÄ¿ªÏú = ¶ÁÈ¡MÒ³µÄI/O¿ªÏú + M´Î¶ÁÈ¡NÒ³µÄI/O¿ªÏú¡£
2. Sort-Merge Join (ÅÅÐòºÏ²¢Áª½á)
Nested LoopÒ»°ãÔÚÁ½¸ö¼¯ºÏ¶¼ºÜ´óµÄÇé¿öÏÂЧÂʾÍÏ൱²îÁË£¬¶øSort-MergeÔÚÕâÖÖÇé¿öϾͱÈËüÒª¸ßЧ²»ÉÙ£¬ÓÈÆäÊǵ±Á½¸ö¼¯ºÏµÄJOIN×Ö¶ÎÉ϶¼Óоۼ¯Ë÷Òý(clustered index)´æÔÚʱ£¬Sort-MergeÐÔÄܽ«´ïµ½×îºÃ¡£
Ëã·¨£º
»ù±¾Ë¼Â·Ò²ºÜ¼òµ¥(¸´Ï°Ò»ÏÂÊý¾Ý½á¹¹Öеĺϲ¢ÅÅÐò°É)£¬Ö÷ÒªÓÐÁ½¸ö²½Ö裺
a.°´JOIN×ֶνøÐÐÅÅÐò
b.¶ÔÁ½×éÒÑÅÅÐò¼¯ºÏ½øÐкϲ¢ÅÅÐò£¬´ÓÀ´Ô´¶Ë¸÷×ÔÈ¡µÃÊý¾ÝÁкó¼ÓÒԱȽÏ(ÐèÒª¸ù¾ÝÊÇ·ñÔÚJOIN×Ö¶ÎÓÐÖØ¸´Öµ×öÌØÊâµÄ“·ÖÇø”´¦Àí)
´ú¼Û£º(Ö÷ÒªÊÇI/O¿ªÏú)
ÓÐÁ½¸öÒòËØ×óÓÒSort-MergeµÄ¿ªÏú£ºJOIN×Ö¶ÎÊÇ·ñÒÑÅÅÐò ÒÔ¼° JOIN×Ö¶ÎÉϵÄÖØ¸´ÖµÓжàÉÙ¡£
¡ô×îºÃÇé¿öÏÂ(Á½Áж¼ÒÑÅÅÐòÇÒÖÁÉÙÓÐÒ»ÁÐûÓÐÖØ¸´Öµ)£ºO (n + m) Ö»ÐèÒª¶ÔÁ½¸ö¼¯ºÏ¸÷ɨÃèÒ»±é¡££¨ÕâÀïµÄm£¬nÈç¹û¶¼ÄÜÓõ½Ë÷ÒýÄǾ͸üºÃÁË£©
¡ô×î²îÇé¿öÏÂ(Á½Áж¼Î´ÅÅÐòÇÒÁ½ÁÐÉϵÄËùÓÐÖµ¶¼Ïàͬ)£ºO (n * log n + m * log m + n * m) Á½´ÎÅÅÐòÒÔ¼°Ò»´ÎÈ«²¿Ôª×é¼äµÄµÑ¿¨¶û³Ë»ý
3. Hash Join (¹þÏ£Áª½á)
Hash JoinÔÚ±¾ÖÊÉÏÀàËÆÓÚÁ½Áж¼ÓÐÖØ¸´ÖµÊ±µÄSort-MergeµÄ´¦Àí˼Ïë——·ÖÇø(patitioning)¡£µ«ËüÃÇÒ²ÓÐÇø±ð£ºHash Joinͨ¹ý¹þÏ£À´·ÖÇø(ÿһ¸öͰ¾ÍÊÇÒ»¸ö·ÖÇø)¶øSort-Mergeͨ¹ýÅÅÐòÀ´·ÖÇø(ÿһ¸öÖØ¸´Öµ¾ÍÊÇÒ»¸ö·ÖÇø)¡£
ÖµµÃ×¢ÒâµÄÊÇ£¬Hash JoinÓëÉÏÊöÁ½ÖÖËã·¨Ö®¼äµÄ½Ï´óÇø±ðͬʱҲÊÇÒ»¸ö½Ï´óÏÞÖÆÊÇËüÖ»ÄÜÓ¦ÓÃÓÚµÈÖµÁª½á(equality join)£¬ÕâÖ÷ÒªÊÇÓÉÓÚ¹þÏ£º¯Êý¼°ÆäͰµÄÈ·¶¨ÐÔ¼°ÎÞÐòÐÔËùµ¼Öµġ£
Ëã·¨£º
»ù±¾µÄHash JoinËã·¨ÓÉÒÔÏÂÁ½²½×é³É£º
ͬnested loop£¬ÔÚÖ´Ðмƻ®ÖÐbuild inputλÓÚÉÏ·½£¬probe inputλÓÚÏ·½¡£
hash join²Ù×÷·ÖÁ½¸ö½×¶ÎÍê³É£ºbuild£¨¹¹Ô죩½×¶ÎºÍprobe£¨Ì½²â£©½×¶Î¡£
a.Build Input Phase£º »ùÓÚJOIN×ֶΣ¬Ê¹ÓùþÏ£º¯Êýh2Ϊ½ÏСµÄS¼¯ºÏ¹¹½¨ÄÚ´æÖÐ(in-memory)µÄ¹þÏ£±í£¬Ïàͬ¼üÖµµÄÒÔlinked list×é³ÉÒ»¸ö
Ïà¹ØÎĵµ£º
SQL ServerÊý¾Ý¿âÖвð·Ö×Ö·û´®º¯ÊýµÄ¾ßÌå·½·¨£º
ÒÔÏÂΪÒýÓõÄÄÚÈÝ£º
¡¡¡¡CREATE¡¡ FUNCTION uf_StrSplit '1.1.2.50','.'
¡¡¡¡(@origStr varchar(7000),¡¡ --´ý²ð·ÖµÄ×Ö·û´®
¡¡¡¡@markStr varchar(100))¡¡¡¡--²ð·Ö±ê¼Ç£¬Èç','
¡¡¡¡RETURNS @splittable table
¡¡¡¡(
¡¡ ¡¡str_id¡¡¡¡varchar(4000) NOT NULL, --±àºÅID ......
¾µäSQLÓï¾ä´óÈ«
ÏÂÁÐÓï¾ä²¿·ÖÊÇMssqlÓï¾ä£¬²»¿ÉÒÔÔÚaccessÖÐʹÓá£
¡¡¡¡SQL·ÖÀࣺ
¡¡¡¡DDL—Êý¾Ý¶¨ÒåÓïÑÔ(CREATE£¬ALTER£¬DROP£¬DECLARE)
¡¡¡¡DML—Êý¾Ý²Ù×ÝÓïÑÔ(SELECT£¬DELETE£¬UPDATE£¬INSERT)
¡¡¡¡DCL—Êý¾Ý¿ØÖÆÓïÑÔ(GRANT£¬REVOKE£¬COMMIT£¬ROLLBACK)
¡¡¡¡Ê×ÏÈ,¼òÒª½éÉÜ»ù´¡Óï¾ä£º
¡¡¡¡1¡¢Ë ......
ͨ¹ýË÷Òý£¬¿ÉÒÔ¼Ó¿ìÊý¾ÝµÄ²éѯËٶȺͼõÉÙϵͳµÄÏìӦʱ¼ä£»¿ÉÒÔʹ±íºÍ±íÖ®¼äµÄÁ¬½ÓËٶȼӿ졣µ«ÊÇ£¬²»ÊÇÔÚÈκÎʱºòʹÓÃË÷Òý¶¼Äܹ»´ïµ½ÕâÖÖЧ¹û¡£ÈôÔÚ²»Ç¡µ±µÄ³¡ºÏÏ£¬Ê¹ÓÃË÷Òý·´¶ø»áÊÂÓëԸΥ¡£ Ë÷ÒýÊÇÒÔ±íÁÐΪ»ù´¡µÄÊý¾Ý¿â¶ÔÏó¡£Ë÷ÒýÖб£´æ×űíÖÐÅÅÐòµÄË÷ÒýÁÐ
¡¡¡¡
ͨ¹ýË÷Òý£¬¿ÉÒÔ¼Ó¿ìÊý¾ÝµÄ²éѯËٶȺͼõÉÙϵͳµÄÏìӦʱ¼ä£ ......
Student(S#,Sname,Sage,Ssex) ѧÉú±í
Course(C#,Cname,T#) ¿Î³Ì±í
SC(S#,C#,score) ³É¼¨±í
Teacher(T#,Tname) ½Ìʦ±í
ÎÊÌ⣺
1¡¢²éѯ“001”¿Î³Ì±È“002”¿Î³Ì³É¼¨¸ßµÄËùÓÐѧÉúµÄѧºÅ£»
select a.S# from (select s#,score from SC where C#='001') a,(select s#,score
fr ......