ǰÑÔ
ÉÏһƪÎÒÃÇÑо¿ÁËÈçºÎÀûÓÃË÷ÒýÔÚÊý¾Ý¿âÀïÃæµ÷ÓÅ£¬¼òÒªµÄ½éÉÜÁËË÷ÒýµÄÔÀí£¬¸üÖØÒªµÄ·ÖÎöÁËÈçºÎÑ¡ÔñË÷ÒýÒÔ¼°Ë÷ÒýµÄÀû±×Ïî¡£
±¾ÆªÑÓÐøÉÏһƪµÄÄÚÈÝ£¬¼ÌÐø·ÖÎöË÷ÒýÕâ¿é£¬²àÖØË÷ÒýÏîµÄÈÕ³£Î¬»¤ÒÔ¼°Ò»Ð©×¢ÒâÊÂÏîµÈ¡£
ÏÐÑÔÉÙÐ𣬽øÈ뱾ƪµÄÖ÷Ìâ¡£
¼¼Êõ×¼±¸
Êý¾Ý¿â°æ±¾ÎªSQL Server2012£¬Ç°¼¸ÆªÎÄÕÂÓõÄÊÇSQL Server2008RT£¬ÄÚÈÝÇø±ð²»´ó£¬ÀûÓÃ΢ÈíµÄÒÔǰµÄ°¸Àý¿â£¨Northwind£©½øÐзÖÎö£¬²¿·ÖÄÚÈÝÒ²»áÓ¦ÓÃ΢ÈíµÄÁíÒ»¸ö°¸Àý¿âAdventureWorks¡£
ÏàÐÅÁ˽âSQL ServerµÄÅóÓÑ£¬¶ÔÕâÁ½¸ö¿â¶¼²»»á̫İÉú¡£
Ò»¡¢´´½¨Ë÷Òý
µ±ÎÒÃÇÒª¿ªÊ¼¶Ô±í½øÐÐË÷ÒýµÄ´´½¨µÄʱºò£¬Ê×ÏÈÃ÷È·µÄÊÇ£¬Ò»ÕűíÄÚÖ»ÄÜ´´½¨Ò»¸ö¾Û¼¯Ë÷Òý£¬×î¶à¿ÉÒÔ´´½¨×î¶à249¸ö·Ç¾Û¼¯Ë÷Òý(SQL Server2005)£¬ÔÚSQL Server2008ÒÔºó¾Û¼¯Ë÷ÒýÊýÌáÉýÖÁ999¸ö£¬ÉÏһƪÎÄÕÂÎÒÃÇÖªµÀ¶ÔÓÚ¾Û¼¯Ë÷ÒýÏîÒ»°ãÒª´´½¨ÉÏ£¬¶ø·Ç¾Û¼¯Ë÷ÒýÏîÒª¸ù¾ÝÈÕ³£µÄT-SQLÓï¾ä½øÐÐÑ¡Ôñ¡£
¹ØÓÚË÷ÒýµÄÑ¡ÔñÊÇÒ»¸öºÜ¿¼Ñéµ÷ÓÅÄÜÁ¦µÄÊÂÇ飬´ó²¿·ÖµÄÇé¿öÏÂÓÅÖʵÄË÷Òýн¨È«¿¿¾Ñé¶øÂÛ£¬ÓÐÐËȤµÄ¿ÉÒÔµã»÷²éÔÄÎÒÇ°ÃæµÄһϵÁйØÓÚ·ÖÎö²éѯ¼Æ»®µÄÎÄÕ£¬ÕÆÎÕסÀïÃæµÄ¾«Ëè²ÅÄÜÓеķÅʸ¡£
µ±È»£¬Ð¡°×¼¶±ðµÄÒ²¿ÉÒÔ²ÎÕÕÈçÏ·½·¨³¢ÊÔ½øÐд´½¨£º
ÓÉÓÚSQL ServerÓÐ×Å×Ô¼ºµÄÒ»Ì×µ÷Óż¼ÇÉ£¬ËùÒÔÔÚÎÒÃÇÿ´ÎÔËÐеÄT-SQLÓï¾äÓ¦¸ÃÔõÑùÓÅ»¯£¬SQL ServerÊÇÁËÈçÖ¸ÕÆµÄ£¬ËùÒÔËü»á½«È±Ê§µÄË÷ÒýÏî½øÐмǼ£¬ÓÃÓÚÌáʾʹÓÃÕߣ¬³¢ÊÔÈ¥½¨Á¢ÕâЩË÷Òý¡£
Ö÷Òª¼Ç¼ÔÚÒÔϼ¸¸öDMVÖÐ
sys.dm_db_missing_index_details
sys.dm_db_missing_index_groups
sys.dm_db_missing_index_group_stats
sys.dm_db_missing_index_columns(index_handle)
sys.dm_db_missing_index_details |
¹ØÓÚÕâЩ¸öDMVµÄʹÓã¬À´¾ÙÒ»¸öÀý×Ó£º
--н¨±í£¬½¨Á¢Ö÷¼ü£¬Ðγɾۼ¯Ë÷Òý
CREATE TABLE BigTable
(
[KEY] INT,
DATA INT,
PAD CHAR(200),
CONSTRAINT [PK1] PRIMARY KEY ([KEY])
)
GO
--ÅúÁ¿²åÈë²âÊÔÊý¾Ý250000ÐÐ
SET NOCOUNT ON
DECLARE @i INT
BEGIN TRAN
SET @i=0
WHILE @i<250000
BEGIN
INSERT BigTable VALUES(@i,@i,NULL)
SET @i=@i+1
IF @i%1000=0
BEGIN
COMMIT TRAN
BEGIN TRAN
END
END
COMMIT TRAN
GO |
ÀûÓÃÕâ¸ö²âÊԽű¾£¬ÎÒÃÇн¨ÁËÒ»ÕŲâÊÔ±í£¬²¢ÇÒ²åÈëÁËһЩ²âÊÔÊý¾Ý£¬ÔËÐÐÒ»¸ö²éѯ
SELECT [KEY],[DATA]
FROM BigTable
WHERE DATA<1000
GO |

ÔÚÕâ¸ö¼òµ¥µÄ²éѯ½Å±¾ÖУ¬SQL ServerÒѾÌáʾÁËÎÒÃÇÐèÒª´´½¨µÄË÷ÒýÏî¡£ÎÒÃÇ¿ÉÒÔÓÒ¼ü£¬Ö±½ÓÉú³É´´½¨½Å±¾


SQL ServerÒѾÌáʾÎÒÃÇÒª´´½¨µÄË÷ÒýÏîÄÚÈÝÁË£¬´©¼þÒ»¸ö·Ç¾Û¼¯Ë÷ÒýÔÚÁÐDATAÉÏ£¬²¢ÇÒINCLUDEÁÐKEY£¬²¢ÇÒ¾´´½¨ÍêÕâ¸öË÷ÒýºóµÄÌáÉýÖµ¶¼¸ø¼ÆËã³öÀ´ÁË¡£
ÒÔÉÏÕâÖÖ·½Ê½£¬ÔÚÎÒÃǵ÷ÓŵÄʱºòÊǾ³£Ê¹Óõģ¬ÔÚÎÒÃÇÄõ½ÐèÒªÓÅ»¯µÄÓï¾äºó£¬Ö±½ÓÖ´ÐоͿÉÒÔ¿´µ½Ò»²¿·ÖÐèÒªµ÷ÕûµÄÐÅÏ¢ÁË¡£
µ«ÊÇ£¬´ó²¿·ÖµÄT-SQLÓï¾ä²»ÔÊÐíÎÒÃǽøÐÐÕâÑùµÄÓÅ»¯Á÷³Ì£¬ÉõÖÁÓÐʱºòÊÇÒѾ´æÔÚµÄϵͳ¡£ËùÒÔ£¬ÎÒÃÇÏÂÊֵķ½Ê½Ö»ÄÜÈÆµÀÁË£¬ÐÒºÃSQL ServerΪÎÒÃǼǼÏÂÁËÕâЩȱʧË÷ÒýÏîµÄÐÅÏ¢£¬¾Í´æÔÚÎÒÉÏÃæÌáµ½µÄ¼¸¸öDMVÖС£ÎÒÃÇÀ´²é¿´Ï£º
SELECT migs.group_handle, mid.*
FROM sys.dm_db_missing_index_group_stats AS migs
INNER JOIN sys.dm_db_missing_index_groups AS mig
ON (migs.group_handle = mig.index_group_handle)
INNER JOIN sys.dm_db_missing_index_details AS mid
ON (mig.index_handle = mid.index_handle)
WHERE migs.group_handle = 2
|

ËùÒÔ£¬´ó²¿·ÖÇé¿öÏ£¬Í¨¹ý²é¿´ÒÔÉÏÓï¾ä»ù±¾ÄÜÈ·Èϵ½ÐèÒª´´½¨µÄË÷ÒýÏîÓÐÄÄЩ¡£
Ìáʾ£ºµ«ÊÇ£¬ÕâÀïµÄDMVÐÅÏ¢Ö»ÊǼǼ×ÔÉÏ´ÎSQL ServerÆô¶¯ÒÔºóµÄÐÅÏ¢ÏҲ¾ÍÊÇ˵ÿ´ÎÖØÆôÖ®ºóÕⲿ·ÖÐÅÏ¢¾Í¶ªÊ§ÁË£¬ËùÒÔ¶ÔÓÚÉú²úϵͳ£¬½¨ÒéÈ·±£ÔËÐÐÁËÒ»¶ÎÖÜÆÚÖ®ºóÔÙ½øÐв鿴¡£
ÖªµÀÁËÓ¦¸Ã´´½¨Ê²Ã´ÑùµÄË÷Òý£¬ÏÂÒ»²½¾ÍÊÇ´´½¨Ë÷ÒýÁË£¬À´¿´´´½¨Ë÷ÒýµÄ½Å±¾
CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name
ON ( column [ ASC | DESC ] [ ,...n ] )
[ INCLUDE ( column_name [ ,...n ] ) ]
[ WHERE ]
[ WITH ( [ ,...n ] ) ]
[ ON { partition_scheme_name ( column_name )
| filegroup_name
| default
}
]
[ FILESTREAM_ON { filestream_filegroup_name | partition_scheme_name | "NULL" } ]
|
´´½¨½Å±¾ºÜ¼òµ¥£¬Ö¸¶¨Ë÷ÒýÀàÐÍ¡¢Ë÷ÒýÃû³Æ¡¢ËùÊô±í¡¢°üº¬ÁС¢É¸Ñ¡Ïî¡¢ËùÊôÎļþ×éÒÔ¼°²Ù×÷Ïî¾Í¿ÉÒÔ´´½¨ÁË¡£
ÎÒÏàÐÅ»ù±¾¸ã¹ýSQL ServerÊý¾ÝµÄÕâ¿é½Å±¾Ò»°ã²»»áİÉú¡£
µ±È»£¬Èç¹û²»ÊìϤ½Å±¾µÄ·½Ê½£¬SQL ServerҲĬÈϸøÌṩÁËͼÐλ¯²Ù×÷½çÃæ£¬Éµ¹Ïʽ²Ù×÷

ÕâÀïÎÒÃÇÖØµã·ÖÎö¼¸µã×¢ÒâÊÂÏî¡£
UNIQUE£º
¸Ã¹Ø¼ü×ÖÖ¸¶¨Ë÷ÒýÏîΪΨһֵ£¬Ò²¾ÍÊÇ·ÇÖØ¸´Öµ£¬ÔÚʵ¼ÊÓ¦ÓÃÖзdz£µÄÓÐÓã¬Ó¦ÎªÎ¨Ò»¾ÍÒâζ×ÅÕâ¸öË÷ÒýµÄ¸ßÑ¡ÔñÐÔ£¬Ò²¾ÍÒâζ×ŵ±Ç°Ë÷ÒýµÄ¿ÉÓÃÐԸߵ͡£
Ç°ÃæÎÄÕÂÒѾ·ÖÎöÁËSQL Server»áĬÈϵÄÔÚÖ÷¼üÁÐÉÏ´´½¨¾Û¼¯Ë÷Òý£¬Ò²ÊÇÀûÓÃÁËÖ÷¼üµÄ·Ç¿ÕºÍΨһÐÔÌØµã¡£
µ±È»£¬ÕâÀïÒ²ÌáʾϾۼ¯Ë÷ÒýÒªÇóµÄ¾ÍÊÇΨһÐÔ£¬Èç¹ûµ±Ç°ÁÐȷʵ´æÔÚÖØ¸´Öµ£¬ÄÇÔÚ´´½¨¾Û¼¯Ë÷ÒýµÄʱºòSQL Server»áĬÈϵÄÔÚµ±Ç°ÁÐÉϼÓÉÏÒ»¸öΨһ±êʶ·û£¨uniqueifiter£©ÔÚÄÚ²¿À´±£Ö¤Ë÷ÒýµÄΨһÐÔ¡£µ«Õâ¸öʱºò¾Í²»ÐèÒªÏÔʽµÄÖ¸¶¨UNIQUEÁË£¬·ñÔò»á±¨ÈçÏ´íÎó£º

CLUSTERED|NONCLUSTERED£º
Õâ¸ö¾ÍÊÇÖ¸¶¨´´½¨µÄË÷ÒýΪ¾Û¼¯»¹ÊǷǾۼ¯Ë÷Òý¡£
¹ØÓÚËü£¬ÕâÀïÓм¸µãÐèҪעÒ⣬ÒòΪ·Ç¾Û¼¯Ë÷ÒýµÄÒ¶×Ó½Úµã´æ´¢µÄ¾ÍÊǾۼ¯Ë÷Òý¼üÖµ£¬ËùÒÔÔÚ´´½¨Ë³ÐòÉÏÒª±£Ö¤ÓÅÏÈ´´½¨¾Û¼¯Ë÷Òý£¬¶øºóÔÙ´´½¨·Ç¾Û¼¯Ë÷Òý£¬±£Ö¤ÓÐ×ã¹»µÄ´æ´¢¿Õ¼äÀ´´æ·Å·Ç¾Û¼¯Ë÷Òý¡£
ÔÚÎÒÃÇÖØÐ´´½¨¾Û¼¯Ë÷ÒýµÄʱºò£¬SQL Server»áĬÈϵÄÖØÐÂÉú³ÉÈ«²¿·Ç¾Û¼¯Ë÷Òý£¬Èç¹û±íÊý¾ÝÁ¿Ìرð´ó£¬Õâ¸ö¹ý³Ì»áºÜÂþ³¤£¬Èç¹û²»Ö¸¶¨ONLINEµÄ»°£¬Õâ¸ö¹ý³Ì»áÊÇËø¶¨Ë÷ÒýB-TeeeµÄ£¬Õâ¾ÍÒâζ×ÅÊÇ×èÈûµÄ£¬ÒµÎñ¾ÍҪͣÏÂÀ´µÈ´ýÍê³É²Ù×÷£¬ÇмDz»Òª½«´ËÊ·¢ÉúÔÚÉú²ú»úÉÏ¡£
µ±È»£¬ÒÔÉÏÎÊÌâÊÇ¿ÉÒÔ±ÜÃâµÄ¡£
index_name£ºË÷ÒýµÄÃû×Ö¡£
column £º
´´½¨Ë÷ÒýËùÑ¡µÄÁÐÁË£¬ÌáʾÏ£º²»Äܽ«´óÐͶÔÏó (LOB) Êý¾ÝÀàÐÍ ntext¡¢text¡¢varchar(max)¡¢ nvarchar(max)¡¢varbinary(max)¡¢xml »ò image µÄÁÐÖ¸¶¨ÎªË÷ÒýµÄ¼üÁС£ ÁíÍ⣬¼´Ê¹ CREATE INDEX Óï¾äÖв¢Î´ÒýÓà ntext¡¢text »ò image ÁС£Èç¹ûÏëÓÃÕâЩÀàÐ͵ÄÁпÉÒÔ´æ·ÅÓÚINCLUDEÀïÃæ¡£
INCLUDE£º
Ë÷Òý°üº¬ÁУ¬Õâ¸ö¹Ø¼ü×ַdz£ÓÐÓã¬ÓÈÆäÔÚÓ¦¶ÔT-SQLµÄËæ»úIOÎÊÌâÉÏ£¬¾ßÌåÄÚÈݿɲÎÕÕÎÒÇ°ÃæµÄһϵÁеÄÎÄÕ½éÉÜ¡£
»¹ÓÐÇ°ÃæÌáµ½µÄÄÇЩ´óÐͶÔÏó£¨LOB£©Êý¾ÝÀàÐÍ£¬Ò²¿ÉÒÔ°üº¬½øÈ¥£¬²»¹ýÕâÀïÓÐÒ»µãÐèÒªÌáʾÏ£¬Èç¹û°üº¬ÁË´óÐͶÔÏó£¬Ôò´´½¨Ë÷Òý²»Ö§³ÖÔÚÏߣ¨ONLINE£©²Ù×÷£¬Õâ¾ÍÒâζ×űØÐëÑ¡Ôñ·ÇÒµÎñÆ÷½øÐвÙ×÷¡£
PAD_INDEX = { ON | OFF }|FILLFACTOR =fillfactor
Õâ¸öÁ½¸öÑ¡ÏîÊÇΪÁËÉèÖÃÌî³äÒò×ÓʹÓõģ¬Ò²ÊÇÎÒÃÇÔÚ´´½¨Ë÷ÒýµÄʱºò×î³£Óõġ£
¹ØÓÚÌî³äÒò×ÓµÄ×÷Óüòµ¥µã½²¾ÍÊÇΪÁ˼õÉÙ·ÖÒ³¶øÔÚË÷Òý¿Õ¼äÖÐÌáǰÏÈÔ¤Áô¿Õ¼ä¡£ÎÒÃÇÖªµÀ¶ÔÓÚ¾Û¼¯Ë÷ÒýÔÚÒ¶¼¶±ð¾Í°üº¬ÁËÊý¾Ý£¬ËùÒÔÓû§ÔÚÕâÀï¿ÉÒÔÖ¸¶¨Ã¿¸öÒ¶×Ó±£ÁôµÄ¿Õ¼äµÄ´óС£¬Í¨¹ýÔ¤Áô¿Õ¼ä£¬¾Í¿ÉÒÔ±ÜÃâÓû§ÐµÄÊý¾ÝÌî³ä¶ø²úÉú·ÖÒ³ÏÖÏ󣬲úÉúË÷ÒýË鯬ӰÏìÐÔÄÜ¡£
µ±È»£¬¹ØÓÚÌî³äÒò×ÓµÄÄÚÈÝÖ§³Å£¬ÊÇÐèÒªÒ»²¿·Ö»ù´¡ÖªÊ¶µÄ¡£
Ë÷ÒýĬÈϵĵÄÑ¡ÏîÊÇOFF£¬Ò²¾ÍÊÇ˵»ù±¾²»»áÔ¤ÁôÌ«¶à¿Õ¼ä¡£
¹ØÓÚÕâÀïÌî³äÒò×ÓÉèÖõÄÊýÖµ´óСÎÊÌ⣬ÆäʵûÓÐÒ»¸ö¹Ì¶¨µÄÖµ£¬´¿´âÊÇÒ»¸ö¾ÑéÖµ£¬À´×ÔÓÚϵͳµÄ³¡¾°ºÍ³¤ÆÚÔËÐеÄ×ܽᡣµ±È»£¬Èç¹û·ÇÒª¸ø³öµÄ»°£¬¿ÉÒÔ²ÎÕÕÈçϽøÐÐÉèÖãº
1.µ±¶Áд±ÈÀý´óÓÚ100£º1ʱ£¬²»ÒªÉèÖÃÌî³äÒò×Ó£¬100%Ìî³ä
2.µ±Ð´µÄ´ÎÊý´óÓÚ¶ÁµÄ´ÎÊýʱ£¬ÉèÖÃ50%-70%Ìî³ä
3.µ±¶Áд±ÈÀýλÓÚÁ½ÕßÖ®¼äʱ80%-90%Ìî³ä
µ«ÊÇ£¬Õâ¸öÖµ²¢²»ÊDZ»SQL ServerËùά»¤µÄ£¬Ò²¾ÍÊÇ˵ÔÚÕⲿ·ÖÔ¤Áô¿Õ¼äÌîÂúÖ®ºó£¬ºóÕ߸ÄÊý¾Ýҳɾ³ý²¿·ÖÊý¾ÝÖ®ºó£¬»¹ÊÇ»á²úÉúË÷ÒýË鯬£¬ËùÒÔÔÚϵͳÔËÐйýÒ»¶ÎÖÜÆÚÖ®ºó£¬ÎÒÃÇÐèÒªÊÖ¶¯µÄÈ¥ÖØÐÂÕûÀíË÷Òý£¬À´Î¬»¤ºÃË÷ÒýµÄÖÈÐò£¬Î¬»¤·½Ê½Ò²¾ÍÊÇ£ºÖØÐ´´½¨£¬ÖØÐÂ×éÖ¯µÈ¡£ÎÄÕºóÃæµÄ»á½éÉÜ¡£
SORT_IN_TEMPDB = { ON | OFF }
Õâ¸ö¾ÍÊÇÖ¸¶¨µ±Ç°Ë÷ÒýÅÅÐòÊÇ·ñÒª½èÖúTempDB¿â£¬Ä¬ÈÏֵΪOFF¡£Èç¹ûÏë¿ìËÙµÄÉú³ÉË÷ÒýÇ뽫´ËÑ¡ÏîÖ¸¶¨ÎªON£¬µ±È»±×¶Ë¾ÍÊÇ»áÀ©´óTempDBµÄ´óС£¬Èç¹ûÔ±íÊý¾ÝÁ¿Ìرð¶àµÄ»°£¬Õâ¿ÉÄÜ»áÊÇÒ»¸öºÜ´óµÄ¿Õ¼äÖµ¡£
STATISTICS_NORECOMPUTE = { ON | OFF}
Õâ¸öÖ¸¶¨ÊÇ·ñͬʱ¸üÐÂͳ¼ÆÐÅÏ¢¡£Ä¬ÈÏÊÇ¿ªÆôµÄ¡£ÎÒÖªµÀͳ¼ÆÐÅÏ¢µÄÖØÒªÐÔ£¬ËùÒÔÔÚ´´½¨µÄʱºò²»Òª¸ü¸Ä´ËÖµ¡£
DROP_EXISTING = { ON | OFF }
ɾ³ý»òÖØ½¨µÄʱºòÊÇ·ñÖØÐÂÉú³ÉÒѾÃüÃûÏÈǰ´æÔڵľۼ¯»ò·Ç¾Û¼¯Ë÷Òý¡£Ä¬ÈÏÊÇOFF¡£
Õâ¸öÑ¡Ïî·Ç³£µÄÓÐÓá£É¾³ý»òÕßÖØ½¨Ë÷ÒýµÄʱºòÕû¸öÁ÷³ÌÊÇ×÷Ϊһ¸öÊÂÎñÀ´´¦ÀíµÄ¡£ËùÒÔ£¬Í¨³£Çé¿öÏ£¬Èç¹û´òËãÖØ½¨Ò»¸ö¾Û¼¯Ë÷ÒýµÄʱºò£¬ÐèÒªÏÈɾ³ý¾Û¼¯Ë÷Òý£¬¶øºóÔÙн¨Á¢Ò»¸ö£¬µ«ÊÇÕâ¸öÁ÷³ÌÖУ¬ÔÚɾ³ýµÄʱºòSQL Server±ØÐëÖØ½¨Ã¿Ò»¸ö·Ç¾Û¼¯Ë÷Òý½«Ã¿Ò»¸ö·Ç¾Û¼¯Ë÷ÒýµÄÒ¶×Ó½ÚµãÓоۼ¯Ë÷Òý¼ü¸Ä³ÉRID,È»ºóн¨¹ý³Ì£¬ÔÚÖØ¸´µÄ½«ËùÓеÄÿһ¸ö·Ç¾Û¼¯Ë÷ÒýµÄÒ¶×Ó½ÚµãÓÉRID¼ü¸ü¸Ä³Éеľۼ¯Ë÷Òý¼üÖµ¡£
Õâ¾ÍÊÇÐèÒªÖØ½¨·Ç¾Û¼¯Ë÷ÒýÁ½´Î£¬Èç¹û±íÊý¾ÝÁ¿Ìرð´óµÄ»°£¬Õâ¸öʱ¼äÏûºÄ¾Í»áºÜ³¤ºÜ³¤…¶øÇÒÊÇ×èÈûµÄ….
µ«ÊÇÈç¹ûÖ¸¶¨DROP_EXISTINGÑ¡ÏîΪONµÄ»°£¬¾Í¿ÉÒÔÔÚ´´½¨»òÕßɾ³ýµÄʱºòÖ»ÐèÒªÒ»´Î¸ü¸ÄËùÓзǾۼ¯Ë÷Òý¾Í¿ÉÒÔ¡£µ±È»´Ë·½Ê½Ò²¿ÉÒÔͨ¹ýALTER INDEX×öµ½£¬ºóÃæ·ÖÎö¡£
ONLINE = { ON | OFF }
ÊÇ·ñÔÚÏßÌṩË÷Òý´´½¨£¬´Ë·½Ê½Ò²ÊÇÊý¾Ý¿âµÄÔÚ05°æ±¾ÒÔºóÐÂÌí¼ÓµÄÒ»´óÁÁµã£¬ÌṩÁËÔÚÏß״̬ÏÂË÷ÒýµÄ´´½¨£¬µ«ÊǽöÏÞÓÚEnterprise°æ±¾¡£
Èç¹ûÔÚÉú²úϵͳÖУ¬ÒµÎñ²¢·¢Ê±ÆÚ¿ÉÒÔ²ÉÓÃÕâ¸öÑ¡Ïî½øÐÐË÷ÒýµÄ´´½¨¼°Î¬»¤£¬µ«Ïà¶ÔÀëÏß´´½¨µÄʱ¼äÖÜÆÚÒªÃ÷ÏÔ³¤ºÜ¶à£¬µ«ÊDz»»áÔì³ÉÒµÎñÍ£»ú¡£
Èç¹ûÉîÈëÑо¿´Ë·½Ê½µÄµ×²ãÔÀí£¬Æäʵ¾ÍÊÇÊý¾ÝµÄ¿ìÕÕ¸ôÀë»úÖÆ£¬¼òµ¥µã½«¾ÍÊÇÔÚ´´½¨Ë÷ÒýµÄʱºò£¬½«ÏàÓ¦µÄÊý¾ÝÐÐÌṩÁ˰汾¿ØÖÆ£¬±ÜÃâÁ˺ÍÕý³£ÒµÎñϵͳµÄËøÕùÓôӶø±ÜÃâÁË×èÈû£¬ÊôÓÚÀÖ¹ÛËø»úÖÆÔÀí¡£
MAXDOP = max_degree_of_parallelism
ÉèÖò¢Ðмƻ®µÄÊýÁ¿Öµ¡£Õâ¸öÑ¡ÏîÒ²ºÜÓÐÓã¬Èç¹ûÊÇ·ÇÒµÎñ¸ß·¢ÆÚ£¬¿ÉÒÔÊʵ±µ÷¸ß´ËÖµÀ´²¢ÐнøÐÐË÷ÒýµÄ´´½¨£¬¼Ó¿ìË÷ÒýµÄ´´½¨ËÙ¶È¡£
µ±È»£¬Ò²ÊÜÏÞÓÚÎïÀíµÄCPUºËÊý¡£»¹ÓоÍÊǴ˹¦ÄÜÒ²Ö»ÓÐEnterprise°æÌṩ¡£
ALLOW_ROW_LOCKS = { ON | OFF }|ALLOW_PAGE_LOCKS = { ON | OFF }
´Ë·½Ê½Ö¸¶¨ÊÇ·ñÐÐËø»òÕßÒ³Ëø£¬µ±È»£¬Ö»ËùÒÔË÷ÒýµÄ´´½¨ºÍÐ޸Ĵ󲿷ÖÇé¿öÏÂÐèÒªÀëÏß²Ù×÷£¬¾ÍÊÇÒòΪÔÚË÷Òý´´½¨µÄʱºò¼ÓËøÁË¡£ÎªÁ˼ӿìË÷ÒýµÄÉú³É¾Í±ØÐëÌí¼ÓÏàÓ¦µÄËø¡£
Èç¹û ALLOW_ROW_LOCKS = ON ÇÒ ALLOW_PAGE_LOCK = ON£¬Ôò·ÃÎÊË÷ÒýʱÔÊÐíÐм¶¡¢Ò³¼¶ºÍ±í¼¶Ëø¡£Êý¾Ý¿âÒýÇæ½«Ñ¡ÔñÏàÓ¦µÄËø£¬²¢ÇÒ¿ÉÒÔ½«Ëø´ÓÐÐËø»òÒ³ËøÉý¼¶µ½±íËø¡£
Èç¹û ALLOW_ROW_LOCKS = OFF ÇÒ ALLOW_PAGE_LOCK = OFF£¬Ôò·ÃÎÊË÷Òýʱ½öÔÊÐíʹÓÃ±í¼¶Ëø¡£
Ò»¸öÓÐÓõÄË÷ÒýµÄ´´½¨ÐèÒªÄÍÐĵĴ´½¨³öÀ´£¬ÇÐÎð²ÝÂʵÄ³ç½øÐУ¬Èç¹û²Ù×÷²»µ±ÓпÉÄÜ»¹»á²úÉú¸ü¶àÒâÍâµÄÇé¿ö¡£ËùÒÔÒª³ä·Ö°ÑÎÕºÃÊý¾ÝµÄÌØÐÔ£¬ºÏÀíµÄ´´½¨ºÃÿһ¸öÓÐÓõÄË÷Òý¡£
¶þ¡¢Ë÷Òý¹ÜÀí
¾¹ýÉÏÃæÒ»²½µÄË÷ÒýµÄ´´½¨£¬ÆäʵÔÚÈÕ³£µÄ´ó²¿·Öʱ¼ä¾ÍÐèҪά»¤ºÃË÷Òý¡£¹ØÓÚË÷ÒýµÄά»¤»ù±¾¾Í¼¯ÖÐÔÚÒÔϼ¸¸ö·½Ãæ
a¡¢Ë÷ÒýµÄÖØ½¨
µ±ÎÒÃÇ·¢ÏÖË÷ÒýË÷Òý¸²¸Ç·¶Î§²»¹»»òÕß´æÔÚ´óÁ¿Ë÷ÒýËøÆ¬£¬Ó°ÏìÐÔÄܵÄʱºò£¬ÎÒÃǾÍÐèÒª¶ÔË÷Òý½øÐÐÖØ½¨¡£
Ë÷Òý·¶Î§µÄÎÊÌâÆäʵ´ó²¿·ÖÀ´Ô´ÓÚ¶ÔÓÚT-SQLÓï¾äÐÔÄܵİÑÎÕ£¬Ò²¾ÍÊÇÎÒÃÇÇ°Ãæ¼¸ÆªÎÄÕÂÖзÖÎöµÄÐèÒªµ÷ÓŵÄÄÚÈÝÏî¡£
¶ø¹ØÓÚË÷ÒýË鯬µÄÐγɣ¬Ò²ÊÇÔ´ÓÚÊý¾Ý¿â³¤Ê±¼äµÄÔËÐУ¬´óÁ¿µÄÔöɾ¸Ã²éÔì³ÉÁËB-Tree½á¹¹µÄ²»×¼È·£¬È·ÇеÄ˵ÊDz»ÄÜÕýÈ·µÄÌṩƽºâ²éѯµÄÐÔÄÜ£¬»òÕß´óÁ¿µÄÊý¾Ý·ÖÒ³Ôì³ÉË÷ÒýË鯬£¬½ø¶øÔö´óÁËIO£¬Ó°ÏìÁËÐÔÄÜ¡£
¹ØÓÚË÷ÒýË鯬µÄ²é¿´£¬¿ÉÒÔͨ¹ýÒÔÏÂDMVÓï¾ä½øÐÐ
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SELECT
DB_NAME() AS DatbaseName
, SCHEMA_NAME(o.Schema_ID) AS SchemaName
, OBJECT_NAME(s.[object_id]) AS TableName
, i.name AS IndexName
, ROUND(s.avg_fragmentation_in_percent,2) AS [Fragmentation %]
INTO #TempFragmentation
FROM sys.dm_db_index_physical_stats(db_id(),null, null, null, null) s
INNER JOIN sys.indexes i ON s.[object_id] = i.[object_id]
AND s.index_id = i.index_id
INNER JOIN sys.objects o ON i.object_id = O.object_id
WHERE 1=2
EXEC sp_MSForEachDB 'USE [?];
INSERT INTO #TempFragmentation
SELECT TOP 20
DB_NAME() AS DatbaseName
, SCHEMA_NAME(o.Schema_ID) AS SchemaName
, OBJECT_NAME(s.[object_id]) AS TableName
, i.name AS IndexName
, ROUND(s.avg_fragmentation_in_percent,2) AS [Fragmentation %]
FROM sys.dm_db_index_physical_stats(db_id(),null, null, null, null) s
INNER JOIN sys.indexes i ON s.[object_id] = i.[object_id]
AND s.index_id = i.index_id
INNER JOIN sys.objects o ON i.object_id = O.object_id
WHERE s.database_id = DB_ID()
AND i.name IS NOT NULL
AND OBJECTPROPERTY(s.[object_id], ''IsMsShipped'') = 0
ORDER BY [Fragmentation %] DESC'
SELECT top 20 * FROM #TempFragmentation ORDER BY [Fragmentation %] DESC
DROP TABLE #TempFragmentation
|

¿´µ½ÁË£¬Õⲿ·ÖË÷ÒýµÄË鯬µ½´óÁË99%…Õâ¾ÍÐèÒªÎÒÃÇÖØ½¨½øÐÐά»¤ÁË£¬·ñÔò½«ÑÏÖØÍÏ¿åÊý¾ÝµÄÐÔÄÜ¡£
ά»¤µÄ·½Ê½Ò²¾ÍÖ÷Òª¼¯ÖÐÔÚÒÔϼ¸ÖÖ£º
1¡¢Öؽ¨Ë÷Òý
ÕâÖÖ·½Ê½¼òµ¥¸ßЧҲ¾ÍÊÇÎÒÃÇÉÏÃæ·ÖÎöµÄCREATE INDEX ÃüÁîºóÃæ¼ÓÉÏDROP_EXISTING·½Ê½¡£µ±È»¿ÉÒÔÁª»ú²Ù×÷£¬²Ù×÷·½Ê½²Î¿¼ÎÄÕÂÇ°Ãæ
2¡¢ÐÞ¸ÄË÷Òý
ÕâÖÖ·½Ê½ÊÇ05°æ±¾ÒÔºó²ÅÌṩµÄ£¬¼òµ¥µã½«¾ÍÊÇALTER INDEXÃüÁî½øÐС£Æäʵµ×²ãµÄÔËÐз½Ê½Í¬Ë÷ÒýÖØ½¨£¬Ö»²»¹ýÕâÖÖ·½Ê½¸ü¸ÄµÄÑ¡Ïî¶àһЩ¡£
3¡¢Ë÷ÒýÖØ×é
ÕâÖÖ·½Ê½¾ÍÊÇÖØÐÂÌî³äË÷ÒýÀïÃæµÄÊý¾Ý£¬¶ÔÓÚ½â¾öË÷ÒýË鯬µÄ·½Ê½²»ÈçÇ°ÃæÁ½ÖÖÀ´µÄÖ±½Ó¡£²»¹ýÒ²ÊÇÒ»ÖÖÍÆ¼öµÄ·½Ê½£¬ÒòΪ´Ë·½Ê½ÔÚÔËÐеÄʱºò£¬Ò²ÊÇËæÊ±Í£Ö¹¡£
²»ÏñÇ°ÃæÁ½ÖÖ·½Ê½ÎªÔ×ÓÐÔ²Ù×÷£¬²¢ÇÒÒµÎñ×èÈû¡£
b¡¢Ë÷ÒýµÄ½ûÓÃ
¹ØÓÚË÷ÒýµÄ½ûÓã¬Õâ¸ö¹¦ÄÜÒ²ÊÇSQL Server2005°æ±¾ÒÔºó²Å³öÏÖµÄй¦ÄÜ£¬Õâ¸ö¹¦ÄÜÒ»°ãÓ¦ÓõIJ»¶à¡£
ÒòΪ´ó²¿·ÖÇé¿öϽ«Ë÷Òý½ûÓÃÁË£¬»¹µ¹²»ÈçÖ±½Ó½«Ë÷Òýɾ³ýµôÀ´µÄÖ±½Ó¡£

µ«ÊÇ£¬¼ÇסÁ˼ÈÈ»SQL ServerÉè¼ÆÁËËü¾ÍÊÇÓÐËüµÄÓÃÎäÖ®µØµÄ¡£
ºÜ¶àÇé¿öÏ£¬Êý¾Ý¿âÔÚÔËÐкܳ¤Ò»¶Îʱ¼äÖ®ºó£¬»á·¢Éú»µÒ³µÄÇé¿ö¡£¶øÈç¹ûͨ¹ýÃüÁî²éÕÒ£¬·¢ÏÖËð»µÒ²´¦ÓÚË÷ÒýÏîÉÏ£¬ÄÇôÄãËù×öµÄ²Ù×÷¾ÍÊǽûÓÃÕâ¸öË÷Òý£¨¼ÇסֻÄÜÊǽûÓã©
È»ºóÖØÐ½¨Á¢Ò»¸öÐÂË÷Òý¾Í¿ÉÒÔÁË¡£
ÔÚÕâÖÖÇé¿öÏÂÎÒÃÇ¿ÉÑ¡µÄ×î¿ì´¦Àí·½Ê½¾ÍÊǽûÓøÃË÷Òý£¬ÒòΪһµ©·¢Éú»µÒ³µÄÇé¿ö£¬¸ÃË÷ÒýÏîÊDz»ÔÊÐíɾ³ýµÄ¡£
ºÜ¶àÅóÓÑ¾ÍºÃÆæÁË£¬Ë÷ÒýÀ´Á˸ö½ûÓã¬ÄÇÎÒʲôʱºòÆôÓÃÄØ£¿…….
.ºÙºÙ…Ò»µ©ÎʳöÁË´ËÎÊÌ⣬¾Í˵Ã÷ÁËÄã¶ÔÊý¾Ý¿âµÄÀí½â»¹ºÜdz…»ù±¾ÉÏ»¹ËãûÓÐÈëÃÅÁË……Ò»µ©Ë÷Òý½ûÓþÍÒâζ×ÅÕâ¸öËùÒÔ²»ÔÙά»¤¸üÐÂÁË….²»ÔÙά»¤¸üÐÂÁËÄÇËüÀïÃæµÄÊý¾Ý¾ÍÊǹýʱµÄ»òÕß˵²»×¼È·µÄ…ÄÇ»¹ÆôÓÃËü¸ÉÂï…ÓëÆäÆôÓû¹²»ÈçÖØÐÂά»¤Ò»¸öÄØ…
c¡¢Ë÷ÒýµÄɾ³ý
¹ØÓÚË÷ÒýµÄɾ³ý£¬¾Í²»ÐèҪ̫¶àµÄ½éÉÜÁË£¬ÔÒòºÜ¼òµ¥£¬Ë÷ÒýµÄ´æÔÚ»áÓ°ÏìÊý¾Ý²åÈëÊý¾ÝµÄËÙ¶È£¬²¢ÇÒÔÚ²éѯµÄʱºòÐèҪά»¤µÈ¶àµÄËø£¬½ø¶øÓ°Ïì²¢·¢¡£
ËùÒÔ£¬Ò»µ©Ë÷Òý´æÔÚ×ÅÒ»µãÓÅ»¯µÄ×÷ÓÃûÓУ¬ÎÒÃǾÍÒª¼°Ê±µÄɾ³ýµô£¬ÒòΪ°Ùº¦¶øÎÞÒ»ÀûÂï¡£
²é¿´Î´Ê¹ÓõÄË÷ÒýDMV½Å±¾ÈçÏ£º
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SELECT
DB_NAME() AS DatbaseName
, SCHEMA_NAME(O.Schema_ID) AS SchemaName
, OBJECT_NAME(I.object_id) AS TableName
, I.name AS IndexName
INTO #TempNeverUsedIndexes
FROM sys.indexes I INNER JOIN sys.objects O ON I.object_id = O.object_id
WHERE 1=2
EXEC sp_MSForEachDB 'USE [?];
INSERT INTO #TempNeverUsedIndexes
SELECT
DB_NAME() AS DatbaseName
, SCHEMA_NAME(O.Schema_ID) AS SchemaName
, OBJECT_NAME(I.object_id) AS TableName
, I.NAME AS IndexName
FROM sys.indexes I INNER JOIN sys.objects O ON I.object_id = O.object_id
LEFT OUTER JOIN sys.dm_db_index_usage_stats S ON S.object_id = I.object_id
AND I.index_id = S.index_id
AND DATABASE_ID = DB_ID()
WHERE OBJECTPROPERTY(O.object_id,''IsMsShipped'') = 0
AND I.name IS NOT NULL
AND S.object_id IS NULL'
SELECT * FROM #TempNeverUsedIndexes
ORDER BY DatbaseName, SchemaName, TableName, IndexName
DROP TABLE #TempNeverUsedIndexes
|

µ±È»£¬ÕâЩ¼Ç¼¶¼ÊÇ×Ô¶¯SQL ServerÆô¶¯ÒÔÀ´Î´ÔøÊ¹ÓõÄË÷Òý£¬ËùÒÔÔÚÉú²úϵͳÖУ¬Ò»¶¨ÒªÈ·±£ÒѾÔËÐÐÁËÒ»¶ÎÖÜÆÚÁË¡£
Ë÷Òý½Å±¾µÄɾ³ý£¬ºÜ¼òµ¥ºÍ±íɾ³ýÀàËÆ£¬Ö±½Ódropµô¾Í¿ÉÒÔÁË¡£
µ±È»£¬×îºóÔÙÔùËÍÒ»¸öDMV£¬²é¿´ÄÇЩ¾³£±»´óÁ¿¸üУ¬µ«ÊÇÈ´»ù±¾²»ÊÊÓõÄË÷ÒýÏî
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SELECT
DB_NAME() AS DatabaseName
, SCHEMA_NAME(o.Schema_ID) AS SchemaName
, OBJECT_NAME(s.[object_id]) AS TableName
, i.name AS IndexName
, s.user_updates
, s.system_seeks + s.system_scans + s.system_lookups
AS [System usage]
INTO #TempUnusedIndexes
FROM sys.dm_db_index_usage_stats s
INNER JOIN sys.indexes i ON s.[object_id] = i.[object_id]
AND s.index_id = i.index_id
INNER JOIN sys.objects o ON i.object_id = O.object_id
WHERE 1=2
EXEC sp_MSForEachDB 'USE [?];
INSERT INTO #TempUnusedIndexes
SELECT TOP 20
DB_NAME() AS DatabaseName
, SCHEMA_NAME(o.Schema_ID) AS SchemaName
, OBJECT_NAME(s.[object_id]) AS TableName
, i.name AS IndexName
, s.user_updates
, s.system_seeks + s.system_scans + s.system_lookups
AS [System usage]
FROM sys.dm_db_index_usage_stats s
INNER JOIN sys.indexes i ON s.[object_id] = i.[object_id]
AND s.index_id = i.index_id
INNER JOIN sys.objects o ON i.object_id = O.object_id
WHERE s.database_id = DB_ID()
AND OBJECTPROPERTY(s.[object_id], ''IsMsShipped'') = 0
AND s.user_seeks = 0
AND s.user_scans = 0
AND s.user_lookups = 0
AND i.name IS NOT NULL
ORDER BY s.user_updates DESC'
SELECT TOP 20 * FROM #TempUnusedIndexes ORDER BY [user_updates] DESC
DROP TABLE #TempUnusedIndexes
|
¹ØÓÚÕâЩ½Å±¾£¬¾ÍÒª×Ô¼º×ÃÇ鿼ÂÇÊÇ·ñɾ³ýÁË£¬²»ÄÜÒ»¸Å¶øÂÛ¡£
|