¡¡¡¡ÖÚËùÖÜÖª£¬SQL ServerÖ´ÐÐSQLÓï¾äµÄÐÔÄÜÅж¨±ê×¼Ö÷ÒªÊÇIO¶ÁÈ¡Êý´óС¡£±¾ÎÄÔÚ²»Î¥·´ÕâÒ»ÔÔòÇé¿öÏ£¬Í¬Ê±À´·ÖÎöһϲ¿·ÖSQLÓï¾äÖ´ÐÐʱ£¬SQL ServerÄÚ´æµÄ±ä»¯Çé¿ö¡£
¡¡¡¡Ê×ÏȼòÊöÒ»ÏÂSQL ServerÄÚ´æÕ¼ÓõÄÌص㡣SQL ServerËùÕ¼ÓõÄÄÚ´æ³ý³ÌÐò(¼´SQL ServerÒýÇæ)Í⣬Ö÷Òª°üÀ¨»º´æµÄÊý¾Ý(Buffer)ºÍÖ´Ðмƻ®(Cache)¡£SQL ServerÒÔ8KB´óСµÄҳΪµ¥Î»´æ´¢Êý¾Ý¡£Õâ¸öºÍSQL ServerÊý¾ÝÔÚ´ÅÅÌÉϵĴ洢ҳ´óСÏàͬ¡£µ±SQL ServerÖ´ÐÐSQL Óï¾äʱ£¬Èç¹ûÐèÒªµÄÊý¾ÝÒѾÔÚÆäÄÚ´æÖУ¬ÔòÖ±½Ó´ÓÄڴ滺³åÇø¶ÁÈ¡²¢½øÐбØÒªµÄÔËËãÈ»ºóÊä³öÖ´Ðнá¹û¡£Èç¹ûÊý¾Ý»¹Î´ÔÚÄÚ´æÖУ¬ÔòÊ×ÏȽ«Êý¾Ý´Ó´ÅÅÌÉ϶ÁÈëÄÚ´æBufferÖС£¶øÎÒÃÇͨ³£ÆÀ¼ÛSQLÐÔÄÜÖ¸±êÖеÄIOÂß¼¶ÁÈ¡Êý¶ÔÓ¦µÄÕýÊÇ´ÓÄڴ滺³åÇø¶ÁÈ¡µÄÒ³Êý£¬¶øIOÎïÀí¶ÁÈ¡ÊýÔò¶ÔÓ¦Êý¾Ý´Ó´ÅÅ̶ÁÈ¡µÄÒ³Êý¡£
¡¡¡¡×¢£ºÒÔϵÄÊÔÑéÔÚ¶àÈ˹²ÏíµÄ¿ª·¢²âÊÔ·þÎñÆ÷ÉÏÒ²¿ÉÒÔ½øÐУ¬ÒòΪʵ¼ÊÉÏ¿ÉÒԷֱ𿴵½Ä³¸ö±íËùÕ¼ÓõÄÄÚ´æÇé¿ö¡£µ«ÎªÁË·½±ã£¬±ÊÕßÔÚ×ö´ËÊÔÑéʱ£¬ÔÚÒ»¸öµ¥¶ÀµÄ¡¢È·ÈÏûÓÐÆäËü²¢·¢ÈÎÎñµÄÊý¾Ý¿âÉϽøÐУ¬Òò´ËËù¿´µ½µÄÄÚ´æ±ä»¯ÕýÊÇÿһ´ÎËùÖ´ÐеÄSQLÓï¾äÒýÆðµÄ¡£
¡¡¡¡ÎÒÃÇÊ×ÏÈÀ´¿´Ò»¸ö¼òµ¥µÄʵÀý¡£´´½¨ÏÂ±í£º
ÒÔÏÂÊÇÒýÓÃƬ¶Î£ºCreate Table P_User ¡¡¡¡( UserMobileStatus int NOT NULL, ¡¡¡¡MobileNo int NOT NULL, ¡¡¡¡LastOpTime DateTime Not NULL ¡¡¡¡)
¡¡¡¡È»ºóΪ¸Ã±í²åÈëÒ»¶¨µÄÊý¾Ý£º
ÒÔÏÂÊÇÒýÓÃƬ¶Î£ºDeclare @i int ¡¡¡¡Set @i=28000 ¡¡¡¡WHILE @i<29000 ¡¡¡¡BEGIN ¡¡¡¡Insert Into P_User ¡¡¡¡Select @i % 2,@i,GetUTCDate() ¡¡¡¡Set @i=@i 1 ¡¡¡¡END
¡¡¡¡È»ºóÎÒÃÇÔÚ²éѯ·ÖÎöÆ÷ÖÐÊ×ÏÈÖ´ÐÐ:
ÒÔÏÂÊÇÒýÓÃƬ¶Î£ºSet Statistics IO ON
¡¡¡¡²¢°´ÏÂCtrl MÒÔÏÔʾʵ¼ÊµÄÖ´Ðмƻ®¡£
¡¡¡¡´Ëʱ£¬¿ÉÒÔ¿ªÊ¼½øÐÐÎÒÃǵÄÊÔÑéÁË¡£ÎªÁË׼ȷ¹Û²ìÿһ´ÎSQLÓï¾ä±ä»¯Çé¿ö£¬ÔÚÖ´ÐеÚÒ»ÌõSQLÓï¾äÒÔÇ°£¬ÎÒÃÇÊ×ÏÈÇå¿ÕSQL ServerËùÕ¼ÓõÄÊý¾ÝÄڴ棺
ÒÔÏÂÊÇÒýÓÃƬ¶Î£ºCHECKPOINT ¡¡¡¡GO ¡¡¡¡DBCC DROPCLEANBUFFERS
¡¡¡¡Õ⽫Çå¿ÕSQL ServerËùÕ¼ÓõÄÊý¾Ý»º³åÇø(´ËÓï¾äÔÚÉú²ú·þÎñÆ÷ÉÏÉ÷Óã¬ÒòΪ½«µ¼ÖÂÒ»¶Îʱ¼äÄÚºóÐøµÄSQLÓï¾äÖ´ÐбäÂý)¡£
¡¡¡¡1.1 Ö´ÐÐÈ«±íÑ¡È¡»òÕßµÍÑ¡ÔñÐÔÑ¡È¡
¡¡¡¡Select * From P_User
¡¡¡¡´ÓSQLÖ´Ðмƻ®¿ÉÒÔ¿´µ½£¬ÓÉÓÚ´Ëʱ±íÖÐûÓÐÈκÎË÷Òý£¬Òò´Ë½«²úÉúTable Scan¡£¶øIOͳ¼Æ½á¹ûÈçÏ£º
¡¡¡¡(1000 row(s) affected)
¡¡¡¡±í'P_User'¡£É¨Ãè¼ÆÊý1£¬Âß¼¶ÁÈ¡4 ´Î£¬ÎïÀí¶ÁÈ¡4 ´Î£¬Ô¤¶Á0 ´Î£¬lob Âß¼¶ÁÈ¡0 ´Î£¬lob ÎïÀí¶ÁÈ¡0 ´Î£¬lob Ô¤¶Á0 ´Î¡£
¡¡¡¡ÎÒÃÇ¿´Ò»ÏÂÊý¾Ý¿âÄÚ´æÖеÄÇé¿ö¡£
¡¡¡¡Ê×ÏȲéѯµ½ÎÒÃÇËù²Ù×÷databaseµÄdatabase_id£º
ÒÔÏÂÊÇÒýÓÃƬ¶Î£ºSelect database_id From sys.databases Where name='TestGDB'
¡¡¡¡È»ºóʹÓøÃdatabase_id´Ó±íÖв鿴ÄÚ´æÇé¿ö£º
ÒÔÏÂÊÇÒýÓÃƬ¶Î£ºSELECT * FROM sys.dm_os_buffer_descriptors bd ¡¡¡¡WHERE database_id=5 ¡¡¡¡order by allocation_unit_id,page_id
¡¡¡¡µÃµ½½á¹ûÈçÏ£º
¡¡¡¡
¡¡¡¡µÃµ½µÄ½á¹ûÖпÉÒÔ¿´µ½£¬³ýÁ˱ØÒªµÄ¹ÜÀíÒ³(Ò»¸öPFS_PageºÍÒ»¸öIAM_Page)Í⣬ÄÚ´æÖÐ×ܹ²³öÏÖÁË4¸öData_PageÒ³¡£ÕâºÍ¸Õ²ÅIOͳ¼ÆÖп´µ½µÄ½á¹û£ºÂß¼¶ÁΪ4£¬ÎïÀí¶ÁΪ4Ïàͬ¡£ÓÉÓÚÊÇÈ«±í¶ÁÈ¡£¬±íÃ÷P_User±íÈ«²¿Êý¾ÝËùÕ¼ÓõÄÊý¾ÝÒ³ÊýÒ²ÕýÊÇ4£¬½«Õâ4¸öÊý¾ÝÒ³µÄrow_countÊý¼ÓÆðÀ´Ò²¿ÉÒÔÑéÖ¤Æä×ÜÊý¾ÝÐÐ=1000¡£
¡¡¡¡ÔÚÉÏÀýÖУ¬Èç¹û²»Çå¿ÕÊý¾Ý»º³åÇø£¬ÔÙÖ´ÐÐÒ»±éSQL£¬¿ÉÒÔ¿´µ½ÄÚ´æºÁÎޱ仯£¬¶øÂß¼¶ÁÒ²²»±ä£¬Ö»ÊÇÎïÀí¶Á±äΪ0£¬ÒòΪÒѾ²»ÐèÒªÔÙ´Ó´ÅÅ̶ÁÈëÊý¾Ý¡£
¡¡¡¡1.2 Ö´ÐиßÑ¡ÔñÐÔÑ¡È¡
¡¡¡¡ÁíÍ⣬ÔÚûÓÐË÷ÒýµÄÇé¿öÏ£¬Èç¹û½«ÉÏÀýÐÞ¸ÄΪ£º
ÒÔÏÂÊÇÒýÓÃƬ¶Î£ºSelect Top 1 * From P_Order »òÕßSelect * From P_Order Where MobileNo=28502
¡¡¡¡¿ÉÒÔ¿´µ½£¬ÏµÍ³Í¬ÑùÒª¶ÁÈ¡È«²¿µÄÊý¾ÝÒ³µ½ÄÚ´æ¡£
¡¡¡¡Èç¹ûʹÓÃSelect Top 1 * From P_Order Where MobileNo=28502ÕâÑùµÄÑ¡È¡·½Ê½£¬ÓпÉÄÜ»á³öÏÖÖ»¶ÁÈ¡²¿·ÖÊý¾ÝÒ³µ½ÄÚ´æµÄÇé¿ö¡£µ«ÓÉÓÚÔÚûÓÐË÷ÒýÇé¿öÏ£¬Êý¾Ýʵ¼ÊÉÏÊÇÎÞÐò´æ·ÅÔÚ¶ÑÉÏ£¬ËùÒÔ½á¹ûºÜ²»Îȶ¨£¬Ò²ÓпÉÄÜ·¢Éú¶ÁÈ¡ËùÓеÄÊý¾ÝÒ³µ½ÄÚ´æ¡£
¡¡¡¡²âÊÔ2£º½¨Á¢¾Û¼¯Ë÷ÒýÇé¿öÏ£¬Ö´ÐÐSQLÓï¾ä
¡¡¡¡Ð޸ıí½á¹¹£¬ÔÚMobileNo×Ö¶ÎÉϽ¨Á¢¾Û¼¯Ë÷Òý¡£È»ºóÔÙ´ÎÖ´ÐиղŵÄSQLÓï¾ä¡£µÃµ½µÄÖ´Ðмƻ®±äΪ¾Û¼¯Ë÷ÒýɨÃè¡£IOͳ¼ÆÏûϢΪ£º
¡¡¡¡(1000 row(s) affected)
¡¡¡¡±í'P_User'¡£É¨Ãè¼ÆÊý1£¬Âß¼¶ÁÈ¡6 ´Î£¬ÎïÀí¶ÁÈ¡1 ´Î£¬Ô¤¶Á4 ´Î£¬lob Âß¼¶ÁÈ¡0 ´Î£¬lob ÎïÀí¶ÁÈ¡0 ´Î£¬lob Ô¤¶Á0 ´Î¡£
¡¡¡¡ÕâÀïµÄÂß¼¶ÁÈ¡±äΪ6´Î¡£
¡¡¡¡ÄÚ´æÇé¿öÈçÏ£º
¡¡¡¡
¡¡¡¡ÄÚ´æÖеı仯ÊÇÔö¼ÓÁËÒ»¸ö·ÇÒ¶¼¶µÄ¾Û¼¯Ë÷ÒýÒ³£¬¶øÒ¶¼¶µÄ¾Û¼¯Ë÷ÒýÔò»áºÍÊý¾Ý·ÅÔÚÒ»Æð¡£
¡¡¡¡ÁíÍ⣬¿ÉÒԲ鿴¸Ã±íË÷ÒýµÄ¼¶±ð£º
ÒÔÏÂÊÇÒýÓÃƬ¶Î£º¡¡SELECT database_id,object_id,index_id,index_level,page_count,record_count ¡¡¡¡FROM sys.dm_db_index_physical_stats ¡¡¡¡(DB_ID(N'TestGDB'), OBJECT_ID(N'dbo.P_User'), NULL, NULL , 'DETAILED');
¡¡¡¡´Ó½á¹û¿ÉÒÔ¿´µ½¸Ã±íµÄ¾Û¼¯Ë÷Òý×ܹ²·Ö2¼¶¡£
¡¡¡¡
¡¡¡¡Òò¶øÂß¼¶ÁÔö¼ÓÁË2¡ª¡ª(ÓÉÓÚ·¢ÉúClustered Index Scan£¬³ýÁ˸ù¼¶±ðµÄ¾Û¼¯Ë÷ÒýÒ³Õ¼ÓÃ1´ÎÍ⣬´Ó¸ù¼¶±ð¾Û¼¯Ë÷Òý¶¨Î»µ½Ò¶¼¶±ðµÄ¾Û¼¯Ë÷ÒýÒ²½«¶îÍâÕ¼ÓÃ1´ÎÂß¼¶Á)¡£
¡¡¡¡ÁíÍâÒ»¸ö±ä»¯ÊÇÖ»·¢ÉúÁËÒ»´ÎÎïÀí¶Á£¬¼´¶ÁÈ¡¸ù¼¶±ðµÄ¾Û¼¯Ë÷ÒýÒ³£¬ÁíÍâ4¸öÊý¾ÝÒ³Ôòͨ¹ýÔ¤¶Á·½Ê½¶ø²»ÊÇÎïÀí¶Á´Ó´ÅÅÌ×°ÈëÄÚ´æBuffer¡£ÕâʹµÃÓоۼ¯Ë÷ÒýµÄÇé¿öÏ£¬Ö´ÐÐSQLËùÖ±½Ó»¨·ÑµÄ´ú¼Ûʵ¼ÊÉϸüС¡£
¡¡¡¡2.2 Ö´ÐиßÑ¡ÔñÐÔÑ¡È¡
¡¡¡¡ÔÚ½¨Á¢¾Û¼¯Ë÷ÒýÇé¿öÏ£¬¶ÔÐÔÄÜÓÐÒæµÄ±ä»¯ÊÇ£º
¡¡¡¡¶ÔÓÚSelect Top 1 * From P_Order »òÕßSelect * From P_Order Where MobileNo=28702ÕâÑùµÄÓï¾ä£¬ÔÚÓоۼ¯Ë÷ÒýÇé¿öÏ£¬Ö»»á½«×îÖռǼËùÔÚµÄÒ³¶ÁÈëÄÚ´æ¡£
¡¡¡¡3.1 Ö´ÐÐÈ«±íÑ¡È¡»òÕßµÍÑ¡ÔñÐÔÑ¡È¡
¡¡¡¡Èç¹û½«±íÖÐͬһ×ֶεľۼ¯Ë÷Òý»»³É·Ç¾Û¼¯Ë÷Òý£¬Ôò¿ÉÒÔ¿´µ½ÈçÏÂÌص㣺
¡¡¡¡Ö´ÐÐÈ«±íɨÃ轫ºÍûÓÐÈκÎË÷ÒýµÄÇé¿öÏàËÆ£¬½«¶ÁÈ¡ËùÓеÄÊý¾ÝÒ³µ½ÄÚ´æ¡£´Ëʱ,SQL ServerµÄ²éѯÒýÇæʵ¼ÊÉÏÎÞ·¨Ê¹Ó÷Ǿۼ¯Ë÷Òý¡£
¡¡¡¡3.2 Ö´ÐиßÑ¡ÔñÐÔÑ¡È¡
¡¡¡¡½«Ö»¶ÁÈ¡×îÖÕÊý¾ÝËùÔÚµÄÒ³µ½Äڴ档ͨ¹ý²éѯ¼Æ»®¿ÉÒÔ¿´µ½£¬SQL ServerÔڷǾۼ¯Ë÷ÒýÉÏʹÓÃINDEX SEEK£¬È»ºóͨ¹ýlookup µÃµ½Êý¾Ýʵ¼ÊËùÔÚÐÐ(Ë÷Òý¸²¸ÇÇé¿öÏÂÀýÍ⣬ÒòΪ²»ÐèÒª¶¨Î»µ½Êµ¼ÊÊý¾ÝÐÐ)¡£
¡¡¡¡²âÊÔ4£ºÖ´ÐÐNested Loop Join
¡¡¡¡ÔÚ½øÐвâÊÔÇ°,ÎÒÃÇÏÈ×¼±¸ÁíÍâÒ»ÕűíºÍÊý¾Ý¡£
ÒÔÏÂÊÇÒýÓÃƬ¶Î£º¡¡Create Table P_Order ¡¡¡¡( UserStatus int NOT NULL, ¡¡¡¡MobileNo int NOT NULL, ¡¡¡¡Sid int Not NULL, ¡¡¡¡LastSubTime DateTime ¡¡¡¡)
¡¡¡¡²åÈëÊý¾Ý£º
ÒÔÏÂÊÇÒýÓÃƬ¶Î£ºDeclare @i int ¡¡¡¡Set @i=20000 ¡¡¡¡WHILE @i<30000 ¡¡¡¡BEGIN ¡¡¡¡Insert Into P_Order ¡¡¡¡Select @i % 2,@i,@i-19999,GetUTCDate() ¡¡¡¡set @i=@i 1 ¡¡¡¡END
¡¡¡¡¿ÉÒÔ¿´µ½£¬ÔÚÖ´ÐÐÈ«±íɨÃèÇé¿öÏ£¬¸Ã±í10000ÌõÊý¾Ý×ܹ²Õ¼ÓÃ38¸öÄÚ´æÊý¾ÝÒ³¡£
¡¡¡¡4.1 Ö´ÐÐÈ«±íÑ¡È¡»òÕßµÍÑ¡ÔñÐÔÑ¡È¡
ÒÔÏÂÊÇÒýÓÃƬ¶Î£ºSelect * From P_Order A ¡¡¡¡Inner Loop JOIN P_User B ON A.MobileNo=B.MobileNo
¡¡¡¡¶ÔÓÚ´ËÖÖ¸ßÑ¡ÔñÐÔÑ¡Ôñ£¬Ä¬ÈÏÇé¿öÏÂSQL Server²»»áÖ´ÐÐLoop Join¡£Òò´Ë£¬Ê¹ÓÃÁËÇ¿ÖÆÐÔµÄÁª½ÓÌáʾ¡£
¡¡¡¡ÔÚÁ½¸ö±í¶¼Ã»ÓÐÈκÎË÷ÒýµÄÇé¿öÏ£¬¿ÉÒÔ¿´µ½£º
¡¡¡¡Á½¸ö±íËùÓеÄÊý¾ÝÒ³¶¼½«±»¼ÓÔص½ÄÚ´æ¡£Âß¼¶ÁÈ¡´ú¼Û¸ß´ï6Íò¶à´Î¡ª¡ª¶ÔÓÚP_Order±íÖеÄÿһÌõ¼Ç¼£¬¶¼½«ÔÚP_User±íÖнøÐбéÀú¡£
¡¡¡¡ÔÚÆäÖÐÒ»¸ö±íÓоۼ¯Ë÷ÒýÇé¿öÏ£¬¾¡¹ÜÂß¼¶ÁÈ¡Ïà±È¸Õ²ÅµÄ6Íò¶à´ÎÒѾ´ó´óϽµ£¬µ«ÈÔÈ»´ïµ½2Íò´Î¡£¶øÇÒÁª½ÓµÄ´ÎÐò¶Ô²éѯÐÔÄÜÓ°ÏìºÜ´ó¡£ÒòΪÆäʵ¼ÊÖ´ÐеÄÊǽ«SQLÓï¾äÖÐÇ°ÃæµÄ±í×÷ΪÁª½ÓµÄÍⲿÊäÈ룬¶øºóÃæµÄ±í×÷ΪÁª½ÓµÄÄÚ²¿ÊäÈë¡£
¡¡¡¡ÔÚÁ½¸ö±í¶¼Óоۼ¯Ë÷ÒýÇé¿öÏ£¬Ïà±È½Ï¶øÑÔ£¬Âß¼¶ÁÈÔÈ»´ïµ½Êýǧ´Î(È¡¾öÓÚ×îÖÕÊä³öµÄÊý¾Ý´óС)£¬µ«Ïà±È½ÏÒѾ´ó´ó¸ÄÉÆ¡£¶øÇÒ±íÖеÄÊý¾ÝÖ»ÓÐ×îÖÕÐèÒªÊä³öµÄ²¿·Ö²Å»á±»¶ÁÈëÄÚ´æBufferÖС£
¡¡¡¡Ö´ÐÐÈçϵÄSQLÓï¾ä£º
ÒÔÏÂÊÇÒýÓÃƬ¶Î£º¡¡Select * From P_Order A ¡¡¡¡Inner merge JOIN P_User B ON A.MobileNo=B.MobileNo ¡¡¡¡Where A.MobileNo=28913
¡¡¡¡ÔÚÁ½¸ö±í¶¼Ã»ÓÐÈκÎË÷ÒýÇé¿öÏ£¬Á½ÕÅ±í¶¼½«Ö´ÐÐÈ«±íɨÃè¡£Òª¶ÁÈëËùÓеÄÊý¾ÝÒ³µ½ÄÚ´æ¡£×ÜÌåÂß¼¶ÁÈ¡¾öÓÚÁ½±íµÄÊý¾ÝÒ³Êý¡£
¡¡¡¡ÔÚÒ»¸ö±íÓоۼ¯Ë÷Òý»òÕ߷Ǿۼ¯Ë÷ÒýÇé¿öÏ£¬¸Ã±í½«Ö´ÐÐIndex Seek£¬ÁíÒ»¸ö±í½«³öÏÖÈ«±íɨÃè¡£ÄÚ´æÊý¾Ý»º³åÇøÖУ¬½«ÓÐÒ»ÕűíÖ»¶ÁÈë×îÖÕÊý¾ÝËùÔÚµÄÊý¾ÝÒ³¡¢Ò»Õűí¶ÁÈëÈ«²¿Êý¾ÝÒ³¡£Âß¼¶ÁÊýÈ¡¾öÓÚ±íÔÚÁª½ÓÖеÄÖÈÐò¡¢ÒÔ¼°ÎÞË÷Òý±íµÄÊý¾ÝÒ³Êý¡£
¡¡¡¡ÔÚÁ½¸ö±í¶¼Óоۼ¯Ë÷ÒýÇé¿öÏ£¬Âß¼¶Á×îС£¬Ã¿¸ö±íÖ»ÓÐ2µ½3´Î¡£¶øÇÒÖ»ÓÐʵ¼ÊÐèÒªÊä³öµÄÊý¾Ý²Å»á±»¶ÁÈëÄÚ´æÒ³¡£Á½¸ö±í¶¼ÓзǾۼ¯Ë÷ÒýÇé¿öÏ£¬ÏûºÄµÄÂß¼¶ÁºÍÄÚ´æ×ÊÔ´½üËÆ¡£
¡¡¡¡²âÊÔ5£ºÖ´ÐÐMerge Join
¡¡¡¡5.1 Ö´ÐÐÈ«±íÑ¡È¡»òÕßµÍÑ¡ÔñÐÔÑ¡È¡
¡¡¡¡Ö´ÐÐSQL:
ÒÔÏÂÊÇÒýÓÃƬ¶Î£º¡¡Select * From P_Order A ¡¡¡¡Inner merge JOIN P_User B ON A.MobileNo=B.MobileNo
¡¡¡¡Èç¹ûÁ½ÕÅ±í¶¼Ã»ÓÐÈκÎË÷Òý£¬ÔòÁ½ÕÅ±í¶¼Òª½øÐÐÈ«±íɨÃè¡£ËùÓеÄÊý¾Ý¶¼Òª¶ÁÈëÄÚ´æÒ³¡£
¡¡¡¡Âß¼¶ÁÊý½üËƵÈÓÚÁ½ÕűíµÄÊý¾ÝÒ³×ܺ͡£SQL Server´¦Àí¹ý³ÌÖн«Ê¹Óõ½ÁÙʱ±í¡£
¡¡¡¡Ö»ÓÐÒ»ÕűíÓоۼ¯Ë÷ÒýµÄÇéÐÎÀàËÆ£¬SQL Server´¦Àí¹ý³ÌÖн«Ê¹Óõ½ÁÙʱ±í¡£²¢ÇÒ¶ÁÈëËùÓеÄÊý¾ÝÒ³µ½ÄÚ´æ¡£
¡¡¡¡Èç¹ûÁ½ÕÅ±í¶¼Óоۼ¯Ë÷Òý£¬¾¡¹ÜÁ½±íµÄÊý¾Ý¶¼»á±»¶ÁÈëÄÚ´æÒ³£¬µ«Âß¼¶ÁÊýÒѾ´ó´ó¼õÉÙ£¬µÈÓÚÆäÖÐÒ»Õűí×ÜÊý¾ÝÄÚ´æÒ³Êý¼ÓÉÏ×îÖÕÊä³öµÄÊý¾ÝÒ³Êý¡£¶øÇÒSQL Server´¦Àí¹ý³ÌÖн«²»ÐèÒªÔÙʹÓÃÁÙʱ±í¡£
¡¡¡¡5.2 Ö´ÐиßÑ¡ÔñÐÔÑ¡È¡
¡¡¡¡¶ÔÓÚÕâÑùµÄ¸ßÑ¡ÔñÐÔSQLÓï¾ä£¬SQL Server ½«ÌáʾÎÞ·¨Éú³ÉÖ´Ðмƻ®¡£
ÒÔÏÂÊÇÒýÓÃƬ¶Î£ºSelect * From P_Order A ¡¡¡¡Inner merge JOIN P_User B ON A.MobileNo=B.MobileNo ¡¡¡¡Where A.MobileNo=28913
¡¡¡¡µ«¿ÉÒÔÖ´ÐУº
ÒÔÏÂÊÇÒýÓÃƬ¶Î£º¡¡Select * From P_Order A ¡¡¡¡Inner merge JOIN P_User B ON A.MobileNo=B.MobileNo ¡¡¡¡Where A.MobileNo<=28001 (×¢£º×îÖÕ½á¹ûÖ»ÓÐ2Ìõ)
¡¡¡¡ÕâÑùµÄÊôÓÚµÍÑ¡ÔñÐÔÓï¾ä£¬µ«×îÖÕ½á¹ûÒ²ºÜÉÙµÄÓï¾ä¡£ÈçÇ°ÃæËùÊö£¬ÕâÖÖÇé¿öÏ£¬²ÉÓÃnetsted loopÁª½ÓЧÂÊ¿ÉÄܸü¸ß¡£
¡¡¡¡6.1 Ö´ÐÐÈ«±íÑ¡È¡»òÕßµÍÑ¡ÔñÐÔÑ¡È¡
¡¡¡¡¶ÔÓÚÁ½±íÁª½Ó£¬Èç¹ûÁ½ÕÅ±í¶¼Ã»ÓÐË÷Òý£¬²»Ð´Ã÷Áª½ÓÌáʾµÄÇé¿öÏ£¬SQL ServerĬÈÏʹÓÃhash join¡£¶ø¶ÔÓÚÁ½±íÁª½Ó£¬Èç¹ûÁ½ÕÅ±í¶¼Óоۼ¯Ë÷Òý£¬ÔòSQL ServerĬÈÏʹÓÃMerge Join¡£
¡¡¡¡Ö´ÐÐSQL:
ÒÔÏÂÊÇÒýÓÃƬ¶Î£ºSelect * From P_Order A ¡¡¡¡Inner hash JOIN P_User B ON A.MobileNo=B.MobileNo
¡¡¡¡ÔÚʹÓÃhash joinÇé¿öÏ£¬ÎÞÂÛÁ½ÕűíÓÐÎÞË÷Òý£¬¶¼½«¶ÁÈ¡ËùÓеÄÊý¾ÝÒ³µ½Äڴ棬SQL Server½«Ê¹ÓÃÁÙʱ±í½øÐд¦Àí¡£Âß¼¶ÁÊý½üËƵÈÓÚÁ½ÕűíµÄÊý¾ÝÒ³×ܺ͡£
¡¡¡¡6.2 Ö´ÐиßÑ¡ÔñÐÔÑ¡È¡
¡¡¡¡ºÍmerge joinÖ´ÐиßÑ¡ÔñÐÔÑ¡È¡Çé¿öÀàËÆ£¬Ò²ÎÞ·¨Ö±½ÓÖ´ÐУº
ÒÔÏÂÊÇÒýÓÃƬ¶Î£ºSelect * From P_Order A ¡¡¡¡Inner merge JOIN P_User B ON A.MobileNo=B.MobileNo ¡¡¡¡Where A.MobileNo=28913
¡¡¡¡µ«¿ÉÒÔÖ´ÐÐÕâÑùµÄ½á¹ûºÜÉٵĵÍÑ¡ÔñÐԽű¾£º
ÒÔÏÂÊÇÒýÓÃƬ¶Î£ºSelect * From P_Order A ¡¡¡¡Inner merge JOIN P_User B ON A.MobileNo=B.MobileNo ¡¡¡¡Where A.MobileNo<=28001 (×¢£º×îÖÕ½á¹ûÖ»ÓÐ2Ìõ)
¡¡¡¡µ«´ËÇé¿öÏ£¬²ÉÓÃnetsted loopÁª½ÓЧÂʸü¸ß¡£
¡¡¡¡²âÊÔ×ܽá
¡¡¡¡±¾´Î²âÊÔµÄÖ÷ÒªÒâÒåÔÚÓÚ£¬Í¨¹ý·ÖÎö¾ßÌåµÄÄÚ´æ±ä»¯½áºÏÖ´Ðмƻ®¡¢IO¶ÁÈ¡µÈÐÅÏ¢£¬¿ÉÒÔ¸üÇå³þµØÁ˽âSQL ServerÖ´ÐÐSQL Óï¾ä¹ý³Ì¡£
¡¡¡¡ÁíÍ⣬ҲÑéÖ¤ÁËһЩͨ¹ý·ÖÎöSQL Óï¾äµÄIO¶ÁÈ¡¡¢Ö´Ðмƻ®Ôø¾µÃµ½µÄ¾Ñ飺
¡¡¡¡(1) ÔÚÖ´Ðе¥±í²éѯʱ£¬Èç¹ûÊǸßÑ¡Ôñ²éѯ£¬Òª½¨Á¢·Ç¾Û¼¯Ë÷Òý»òÕß¾Û¼¯Ë÷Òý(ÍƼö·Ç¾Û¼¯Ë÷Òý£¬ÊǶÀÁ¢ÓÚÊý¾Ý´æ·ÅµÄ)¡£Èç¹ûÊǵÍÑ¡ÔñÐÔ²éѯ£¬ÔòÐèÒª½¨Á¢¾Û¼¯Ë÷Òý¡£
¡¡¡¡(2) ÔÚÖ´ÐÐÁª½Ó²éѯʱ£¬Èç¹û×îÖÕÊä³ö½á¹ûºÜÉÙ£¬ÔòÊÊÒËʹÓÃnested loop join;Èç¹ûÊä³ö½á¹û½Ï¶à£¬Ôòͨ¹ý½¨Á¢¾Û¼¯Ë÷Òý£¬¶øÒÔmerge join·½Ê½²éѯÄܵõ½ºÃµÄÐÔÄÜ¡£¶ÔÓÚÐÔÄܽϵ͵Ähash join£¬×îºÃͨ¹ýת»»³Émerge join»òÕßnested loop join·½Ê½Ìá¸ß²éѯÐÔÄÜ¡£