收藏 分销(赏)

MSSQL自动重建出现碎片的索引的方法分享.doc

上传人:精**** 文档编号:9781865 上传时间:2025-04-07 格式:DOC 页数:4 大小:25KB
下载 相关 举报
MSSQL自动重建出现碎片的索引的方法分享.doc_第1页
第1页 / 共4页
MSSQL自动重建出现碎片的索引的方法分享.doc_第2页
第2页 / 共4页
点击查看更多>>
资源描述
  无论何时对基础数据执行插入、更新或删除操作,SQLServer数据库引擎都会自动维护索引。随着时间的推移,这些修改可能会导致索引中的信息分散在数据库中(含有碎片)。当索引包含的页中的逻辑排序(基于键值)与数据文件中的物理排序不匹配时,就存在碎片。碎片非常多的索引可能会降低查询性能,导致应用程序响应缓慢。   1.索引碎片的产生?   由于在表里大量的插入、修改、删除操作而使索引页分裂。如果索引有了高的碎片,有两种情况,一种情况是扫描索引需要花费很多的时间,另一种情况是在查询的时候索引根本不使用索引,都会导致性能降低。   2.碎片类型分为:   2.1内部破碎   由于索引页里的数据插入或修改操作而发生,以数据作为稀疏矩阵的形式的分布而结束,这将导致数据页的增加,从而增加查询时间。   2.2外部破碎   由于索引/数据页的数据插入或修改而发生,以页码分离和在文件系统里不连贯的新的索引页的分配而结束,数据库服务器不能利用预读操作的优点,因为:下一个相关联的数据页不临近,而且这些相关连的下面的页码可能在数据文件的任何地方。   自动重建发生碎片的索引   在数据中新建碎片整理存储过程   代码如下:   --================================================   --TEMPLATEGENERATEDFROMTEMPLATEEXPLORERUSING:   --CREATEPROCEDURE(NEWMENU).SQL   --   --USETHESPECIFYVALUESFORTEMPLATEPARAMETERS   --COMMAND(CTRL-SHIFT-M)TOFILLINTHEPARAMETER   --VALUESBELOW.   --   --THISBLOCKOFCOMMENTSWILLNOTBEINCLUDEDIN   --THEDEFINITIONOFTHEPROCEDURE.   --================================================   SETANSI_NULLSON   GO   SETQUOTED_IDENTIFIERON   GO   --=============================================   --AUTHOR: <AUTHOR,,WUXIANGQIAN>   --CREATEDATE:<CREATEDATE,2014-05-16>   --DESCRIPTION:<DESCRIPTION,重建出现碎片的索引>   --=============================================   ALTERPROCEDUREUSP_IMS_DEFRAGMENT_INDEXES   AS   --声明变量   SETNOCOUNTON   DECLARE@TABLENAMEVARCHAR(128)--表名称(已发生索引碎片)   DECLARE@EXECSTRVARCHAR(255)--执行重建索引的语句   DECLARE@INDEXNAMECHAR(255)--索引名称   DECLARE@DBNAMESYSNAME--数据库名称   DECLARE@DBNAMECHARVARCHAR(20)--数据库名称   DECLARE@TABLEIDCHARVARCHAR(255)--表名称(用于遍历索引碎片)   --检查是否在用户数据库里运行   SELECT@DBNAME=DB_NAME()   IF@DBNAMEIN('master','msdb','model','tempdb')   BEGIN   PRINT'THISPROCEDURESHOULDNOTBERUNINSYSTEMDATABASES.'   RETURN   ENDELSE   BEGIN   SET@DBNAMECHAR='DBNAME'   END   --第1阶段:检测碎片   --声明游标   DECLARETABLESCURSORFOR   SELECTCONVERT(VARCHAR,SO.ID)   FROMSYSOBJECTSSO   JOINSYSINDEXESSI   ONSO.ID=SI.ID   WHERESO.TYPE='U'   ANDSI.INDID<2   ANDSI.ROWS>0   --创建一个临时表来存储碎片信息   CREATETABLE#FRAGLIST(   TABLENAMECHAR(255),   INDEXNAMECHAR(255))   --打开游标   OPENTABLES   --对数据库的所有表循环执行DBCCSHOWCONTIG命令   FETCHNEXT   FROMTABLES   INTO@TABLEIDCHAR   WHILE@@FETCH_STATUS=0   BEGIN   --对表的所有索引进行统计   INSERTINTO#FRAGLIST   EXEC('SELECTOBJECT_NAME(DT.OBJECT_ID)ASTABLENAME,SI.NAMEASINDEXNAMEFROM'+   '(SELECTOBJECT_ID,INDEX_ID,AVG_FRAGMENTATION_IN_PERCENT,AVG_PAGE_SPACE_USED_IN_PERCENT'+   'FROMSYS.DM_DB_INDEX_PHYSICAL_STATS(DB_ID('''+@DBNAMECHAR+'''),object_id('''+@TABLEIDCHAR+''')'+   ',NULL,NULL,''DETAILED'')WHEREINDEX_ID<>0)ASDTINNERJOINSYS.INDEXESSI'+   'ONSI.OBJECT_ID=DT.OBJECT_IDANDSI.INDEX_ID=DT.INDEX_IDAND'+   'DT.AVG_FRAGMENTATION_IN_PERCENT>10'+   'ANDDT.AVG_PAGE_SPACE_USED_IN_PERCENT<75ORDERBYDT.AVG_FRAGMENTATION_IN_PERCENTDESC')   FETCHNEXT   FROMTABLES   INTO@TABLEIDCHAR   END   --关闭释放游标   CLOSETABLES   DEALLOCATETABLES   --为了检查,报告统计结果   SELECT*FROM#FRAGLIST   --第2阶段:(整理碎片)为每一个要整理碎片的索引声明游标   DECLAREINDEXESCURSORFOR   SELECTTABLENAME,INDEXNAME   FROM#FRAGLIST   --输出开始时间   SELECT'STARTEDDEFRAGMENTINGINDEXESAT'+CONVERT(VARCHAR,GETDATE())   --打开游标   OPENINDEXES   --循环所有的索引   FETCHNEXT   FROMINDEXES   INTO@TABLENAME,@INDEXNAME   WHILE@@FETCH_STATUS=0   BEGIN   SETQUOTED_IDENTIFIERON   SELECT@EXECSTR='ALTERINDEX'+@INDEXNAME+'ON'+@TABLENAME+'REBUILDWITH(FILLFACTOR=90,ONLINE=ON)'   SELECT'Nowexecuting:'   SELECT(@EXECSTR)   EXEC(@EXECSTR)   SETQUOTED_IDENTIFIEROFF   FETCHNEXT   FROMINDEXES   INTO@TABLENAME,@INDEXNAME   END   --关闭释放游标   CLOSEINDEXES   DEALLOCATEINDEXES   --报告结束时间   SELECT'FINISHEDDEFRAGMENTINGINDEXESAT'+CONVERT(VARCHAR,GETDATE())   --删除临时表   DROPTABLE#FRAGLIST   GO   GO   设置定时执行步骤   (1)启动【sqlserverManagementStudio】,在【对象资源管理器】窗口里选择【管理】——【维护计划】选项。   (2)右击【维护计划】,在弹出的快捷菜单里选择【维护计划向导】选项,弹出如图所示的【维护计划向导】对话框,单击【下一步】按钮   (3)弹出如图所示【选择目标服务器】对话框,在【名称】文本框里可以输入维护计划的名称;在【说明】文本框里可以输入维护计划的说明文字;【在服务器】文本框里可以输入要使用的服务器名;最后选择正确的身份证信息,单击【下一步】按钮。   (4)弹出如图所示【选择维护任务】对话框,在该对话框中可以选择执行sql维护任务,插入执行存储过程语句   代码如下:   USE[DBNAME]   GO   EXEC[dbo].[USP_IMS_DEFRAGMENT_INDEXES]   更多信息请查看IT技术专栏   
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传
相似文档                                   自信AI助手自信AI助手

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服