这篇文章主要介绍“SQL Server索引维护的sql语句”,在日常操作中,相信很多人在SQL Server索引维护的sql语句问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”SQL Server索引维护的sql语句”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

使用以下脚本查看数据库索引碎片的大小情况:

复制代码 代码如下:

DBCCSHOWCONTIGWITHFAST,TABLERESULTS,ALL_INDEXES,NO_INFOMSGS

以下使用脚本来处理维护作业:

复制代码 代码如下:

/*Performa'USE<databasename>'toselectthedatabaseinwhichtorunthescript.*/--DeclarevariablesSETNOCOUNTON;DECLARE@tablenamevarchar(255);DECLARE@execstrvarchar(400);DECLARE@objectidint;Declare@IndexNamevarchar(500);DECLARE@indexidint;DECLARE@fragdecimal;DECLARE@maxfragdecimal;DECLARE@TmpNamevarchar(500);--Declare@TmpName=''set@TmpName=''--Decideonthemaximumfragmentationtoallowfor.SELECT@maxfrag=30.0;--Declareacursor.DECLAREtablesCURSORFORSELECTTABLE_SCHEMA+'.'+TABLE_NAMEFROMINFORMATION_SCHEMA.TABLESWHERETABLE_TYPE='BASETABLE';--Createthetable.CREATETABLE#fraglist(ObjectNamechar(255),ObjectIdint,IndexNamechar(255),IndexIdint,Lvlint,CountPagesint,CountRowsint,MinRecSizeint,MaxRecSizeint,AvgRecSizeint,ForRecCountint,Extentsint,ExtentSwitchesint,AvgFreeBytesint,AvgPageDensityint,ScanDensitydecimal,BestCountint,ActualCountint,LogicalFragdecimal,ExtentFragdecimal);--Openthecursor.OPENtables;--Loopthroughallthetablesinthedatabase.FETCHNEXTFROMtablesINTO@tablename;WHILE@@FETCH_STATUS=0BEGIN;--DotheshowcontigofallindexesofthetableINSERTINTO#fraglistEXEC('DBCCSHOWCONTIG('''+@tablename+''')WITHFAST,TABLERESULTS,ALL_INDEXES,NO_INFOMSGS');FETCHNEXTFROMtablesINTO@tablename;END;--Closeanddeallocatethecursor.CLOSEtables;DEALLOCATEtables;--Declarethecursorforthelistofindexestobedefragged.DECLAREindexesCURSORFORSELECTObjectName,ObjectId,IndexName,IndexId,LogicalFragFROM#fraglistWHEREINDEXPROPERTY(ObjectId,IndexName,'IndexDepth')>0;--Openthecursor.OPENindexes;--Loopthroughtheindexes.FETCHNEXTFROMindexesINTO@tablename,@objectid,@IndexName,@indexid,@frag;WHILE@@FETCH_STATUS=0BEGIN;if@frag<@maxfragBeginSELECT@execstr='ALTERINDEX['+RTRIM(@IndexName)+']ON['+RTRIM(@tablename)+']REORGANIZEWITH(LOB_COMPACTION=ON)'print@maxfrag+''+@execstrEndelseBeginSELECT@execstr='ALTERINDEX['+RTRIM(@IndexName)+']ON['+RTRIM(@tablename)+']REBUILDWITH(PAD_INDEX=OFF,STATISTICS_NORECOMPUTE=OFF,ALLOW_ROW_LOCKS=ON,ALLOW_PAGE_LOCKS=ON,SORT_IN_TEMPDB=OFF,ONLINE=OFF)'print@maxfrag+''+@execstrEndEXEC(@execstr);--更新统计信息IF@TmpName<>@tablenameBEGINSET@tmpName=@tableNamePRINT'UPDATESTATISTICS'+@TableName+'WITHFULLSCAN'EXEC('UPDATESTATISTICS'+@TableName+'WITHFULLSCAN')ENDFETCHNEXTFROMindexesINTO@tablename,@objectid,@IndexName,@indexid,@frag;END;--Closeanddeallocatethecursor.CLOSEindexes;DEALLOCATEindexes;--Deletethetemporarytable.DROPTABLE#fraglist;

到此,关于“SQL Server索引维护的sql语句”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!