SQL ServerÖ´ÐÐSQLÓï¾äʱÄÚ´æÕ¼ÓÃÌصã

SQL ServerÖ´ÐÐSQLÓï¾äʱÄÚ´æÕ¼ÓÃÌصã - Ó¦ÓÃÈí¼þ - µçÄԽ̳ÌÍø

SQL ServerÖ´ÐÐSQLÓï¾äʱÄÚ´æÕ¼ÓÃÌصã

ÈÕÆÚ£º2006-04-05   ¼ö£º

¡¡¡¡ÖÚËùÖÜÖª£¬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Óï¾äÖ´ÐбäÂý)¡£


·SQL¸ßÊÖƪ:¾«ÃîSQLÓï¾ä½éÉÜ·Ò»¸ösqlÓï¾ä£¬°üº¬Óм¸ºõËùÓбê×¼²éѯ·¾­Ñé·ÖÏí½»Á÷£º³£ÓÃSQLÓï¾ä¼¼·¨·SQLÓï¾äºÍ´æ´¢¹ý³Ì ²éѯÓï¾äµÄÁ÷³Ì¿ØÖƷʵսSQLÓï¾äÊÕ¼¯(²»¶Ï¸üÐÂÖÐ--)·SQLÓï¾äÐÔÄÜÓÅ»¯--LECCO SQL Expert·²éѯͬһ±íÄÚ¶à×Ö¶ÎͬʱÖظ´¼Ç¼µÄSQL·Êý¾Ý¿âÈËÔ±ÊÖ±ßϵÁУºSQLÓï¾äµ¼Èëµ¼³ö·µÃ³öSQLÓï¾äµÄÖ´ÐÐʱ¼äµÄ·½·¨·Transact_SQLСÊÖ²á(¸÷ÖÖsqlÓï¾ä´ó¼¯ºÏ ²âÊÔ1£ºÔÚûÓÐË÷ÒýµÄ±íÉÏÖ´ÐÐ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Óï¾ä


·SQL¸ßÊÖƪ:¾«ÃîSQLÓï¾ä½éÉÜ·Ò»¸ösqlÓï¾ä£¬°üº¬Óм¸ºõËùÓбê×¼²éѯ·¾­Ñé·ÖÏí½»Á÷£º³£ÓÃSQLÓï¾ä¼¼·¨·SQLÓï¾äºÍ´æ´¢¹ý³Ì ²éѯÓï¾äµÄÁ÷³Ì¿ØÖƷʵսSQLÓï¾äÊÕ¼¯(²»¶Ï¸üÐÂÖÐ--)·SQLÓï¾äÐÔÄÜÓÅ»¯--LECCO SQL Expert·²éѯͬһ±íÄÚ¶à×Ö¶ÎͬʱÖظ´¼Ç¼µÄSQL·Êý¾Ý¿âÈËÔ±ÊÖ±ßϵÁУºSQLÓï¾äµ¼Èëµ¼³ö·µÃ³öSQLÓï¾äµÄÖ´ÐÐʱ¼äµÄ·½·¨·Transact_SQLСÊÖ²á(¸÷ÖÖsqlÓï¾ä´ó¼¯ºÏ 2.1 Ö´ÐÐÈ«±íÑ¡È¡»òÕßµÍÑ¡ÔñÐÔÑ¡È¡

¡¡¡¡Ð޸ıí½á¹¹£¬ÔÚ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ÕâÑùµÄÓï¾ä£¬ÔÚÓоۼ¯Ë÷ÒýÇé¿öÏ£¬Ö»»á½«×îÖռǼËùÔÚµÄÒ³¶ÁÈëÄÚ´æ¡£


·SQL¸ßÊÖƪ:¾«ÃîSQLÓï¾ä½éÉÜ·Ò»¸ösqlÓï¾ä£¬°üº¬Óм¸ºõËùÓбê×¼²éѯ·¾­Ñé·ÖÏí½»Á÷£º³£ÓÃSQLÓï¾ä¼¼·¨·SQLÓï¾äºÍ´æ´¢¹ý³Ì ²éѯÓï¾äµÄÁ÷³Ì¿ØÖƷʵսSQLÓï¾äÊÕ¼¯(²»¶Ï¸üÐÂÖÐ--)·SQLÓï¾äÐÔÄÜÓÅ»¯--LECCO SQL Expert·²éѯͬһ±íÄÚ¶à×Ö¶ÎͬʱÖظ´¼Ç¼µÄSQL·Êý¾Ý¿âÈËÔ±ÊÖ±ßϵÁУºSQLÓï¾äµ¼Èëµ¼³ö·µÃ³öSQLÓï¾äµÄÖ´ÐÐʱ¼äµÄ·½·¨·Transact_SQLСÊÖ²á(¸÷ÖÖsqlÓï¾ä´ó¼¯ºÏ ²âÊÔ3£º½¨Á¢·Ç¾Û¼¯Ë÷ÒýÇé¿öÏ£¬Ö´ÐÐSQLÓï¾ä

¡¡¡¡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¸ßÊÖƪ:¾«ÃîSQLÓï¾ä½éÉÜ·Ò»¸ösqlÓï¾ä£¬°üº¬Óм¸ºõËùÓбê×¼²éѯ·¾­Ñé·ÖÏí½»Á÷£º³£ÓÃSQLÓï¾ä¼¼·¨·SQLÓï¾äºÍ´æ´¢¹ý³Ì ²éѯÓï¾äµÄÁ÷³Ì¿ØÖƷʵսSQLÓï¾äÊÕ¼¯(²»¶Ï¸üÐÂÖÐ--)·SQLÓï¾äÐÔÄÜÓÅ»¯--LECCO SQL Expert·²éѯͬһ±íÄÚ¶à×Ö¶ÎͬʱÖظ´¼Ç¼µÄSQL·Êý¾Ý¿âÈËÔ±ÊÖ±ßϵÁУºSQLÓï¾äµ¼Èëµ¼³ö·µÃ³öSQLÓï¾äµÄÖ´ÐÐʱ¼äµÄ·½·¨·Transact_SQLСÊÖ²á(¸÷ÖÖsqlÓï¾ä´ó¼¯ºÏ 4.2 Ö´ÐиßÑ¡ÔñÐÔÑ¡È¡

¡¡¡¡Ö´ÐÐÈçϵÄ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Áª½ÓЧÂÊ¿ÉÄܸü¸ß¡£


·SQL¸ßÊÖƪ:¾«ÃîSQLÓï¾ä½éÉÜ·Ò»¸ösqlÓï¾ä£¬°üº¬Óм¸ºõËùÓбê×¼²éѯ·¾­Ñé·ÖÏí½»Á÷£º³£ÓÃSQLÓï¾ä¼¼·¨·SQLÓï¾äºÍ´æ´¢¹ý³Ì ²éѯÓï¾äµÄÁ÷³Ì¿ØÖƷʵսSQLÓï¾äÊÕ¼¯(²»¶Ï¸üÐÂÖÐ--)·SQLÓï¾äÐÔÄÜÓÅ»¯--LECCO SQL Expert·²éѯͬһ±íÄÚ¶à×Ö¶ÎͬʱÖظ´¼Ç¼µÄSQL·Êý¾Ý¿âÈËÔ±ÊÖ±ßϵÁУºSQLÓï¾äµ¼Èëµ¼³ö·µÃ³öSQLÓï¾äµÄÖ´ÐÐʱ¼äµÄ·½·¨·Transact_SQLСÊÖ²á(¸÷ÖÖsqlÓï¾ä´ó¼¯ºÏ ²âÊÔ6£ºÖ´ÐÐHash Join

¡¡¡¡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·½Ê½Ìá¸ß²éѯÐÔÄÜ¡£

±êÇ©£º