MSSQL自动重建出现碎片的索引的方法分享_第1页
MSSQL自动重建出现碎片的索引的方法分享_第2页
MSSQL自动重建出现碎片的索引的方法分享_第3页
MSSQL自动重建出现碎片的索引的方法分享_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、无论何时对基础数据执行插入、更新或删除操作,SQLServer数据库引擎都会自动维护索引。随着时间的推移,这些修改可能会导致索引中的信息分散在数据库中(含有碎片)。当索引包含的页中的逻辑排序 (基于键值)与数据文件中的物理排序不匹配时,就存在碎片。碎片非常多的索引可能会降低查询性能,导致应用程序响应缓慢。1索引碎片的产生?由于在表里大量的插入、修改、删除操作而使索引页分裂。如果索引有了高的碎片,有两种情况,一种情况是扫描索引需要花费很多的时间,另一种情况是在查询的时候索引根本不使用索引,都会导致性能降低。2碎片类型分为:2.1内部破碎由于索引页里的数据插入或修改操作而发生,以数据作为稀疏矩阵的

2、形式的分布而结 束,这将导致数据页的增加,从而增加查询时间。2.2外部破碎由于索引/数据页的数据插入或修改而发生,以页码分离和在文件系统里不连贯的新的 索引页的分配而结束,数据库服务器不能利用预读操作的优点,因为:下一个相关联的数据页不临近,而且这些相关连的下面的页码可能在数据文件的任何地方。自动重建发生碎片的索引在数据中新建碎片整理存储过程代码如下:-TEMPLATEGENERATEDFROMTEMPLATEEXPLORERUSING:-CREATEPROCEDURE(NEWMENU).SQL-USETHESPECIFYV ALUESFORTEMPLATEPARAMETERS-COMMAND

3、(CTRL-SHIFT-M)TOFILLINTHEPARAMETER -VALUESBELOW.-THISBLOCKOFCOMMENTSWILLNOTBEINCLUDEDIN -THEDEFINITIONOFTHEPROCEDURE.SETANSI_NULLSONGOSETQUOTED_IDENTIFIERONGO-AUTHOR:&n bsp;<AUTHOR,WUXIANGQIA N>-CREATEDA TE:<CREATEDA TE,2014-05-16> -DESCRIPTIO N:& lt;DESCRIPTION,重建出现碎片的索引 >ALTERPROCED

4、UREUSP_IMS_DEFRAGMENT_INDEXESAS-声明变量SETNOCOUNTONDECLARETABLENAMEV ARCHAR(128)-表名称(已发生索引碎片) DECLAREEXECSTRV ARCHAR(255)-执行重建索引的语句 DECLAREINDEXNAMECHAR(255)-索引名称DECLAREDBNAMESYSNAME-数据库名称DECLAREDBNAMECHARV ARCHAR(20)-数据库名称DECLARETABLEIDCHARV ARCHAR(255)-表名称(用于遍历索引碎片) -检查是否在用户数据库里运行SELECTDBNAME=DB_NAME

5、()IFDBNAMEIN(master,msdb,model,tempdb)BEGINPRINTTHISPROCEDURESHOULDNOTBERUNINSYSTEMDATABASES. RETURNENDELSEBEGINSETDBNAMECHAR=DBNAMEEND-第1阶段:检测碎片-声明游标DECLARETABLESCURSORFORSELECTCONVERT(V ARCHAR,SO.ID)FROMSYSOBJECTSSOJOINSYSINDEXESSIONSO.ID=SI.IDWHERESO.TYPE=UANDSI.INDID<2ANDSI.ROWS>O-创建一个临时表来

6、存储碎片信息CREATETABLE#FRAGLIST(TABLENAMECHAR(255),INDEXNAMECHAR(255)-打开游标OPENTABLES-对数据库的所有表循环执行DBCCSHOWCONTIG 命令FETCHNEXTFROMTABLESINTOTABLEIDCHARWHILEFETCH_STA TUS=0BEGIN-对表的所有索引进行统计INSERTINTO#FRAGLISTEXEC(SELECTOBJECT_NAME(DT.OBJECT_ID)ASTABLENAME,SI.NAMEASINDEXNAMEFROM+(SELECTOBJECT_ID,INDEX_ID,A VG

7、_FRAGMENTATION_IN_PERCENT,A VG_PAGE_SPA CE_USED_IN_PERCENT+FROMSYS.DM_DB_INDEX_PHYSICAL_STATS(DB_ID(”+DBNAMECHAR+”),object_id(”+TABLEIDCHAR+”)+,NULL,NULL,”DETAILED”)WHEREINDEX_ID&l t; >0)ASDTINNERJOINSYS.INDEXESSI+ONSI.OBJECT_ID=DT.OBJECT_IDANDSINDEX_ID=DTNDEX_IDAND+ DT.AVG_FRAGMENTATION_IN_PERCE

8、NT>10+ANDDT.A VG_PAGE_SPACE_USED_IN_PERCENT<75ORDERBYDT.A VG_FRAGMENTA TION_IN_PERCENTDESC)FETCHNEXTFROMTABLESINTOTABLEIDCHAREND-关闭释放游标CLOSETABLESDEALLOCATETABLES-为了检查,报告统计结果SELECT*FROM#FRAGLIST-第2阶段:(整理碎片)为每一个要整理碎片的索引声明游标DECLAREINDEXESCURSORFORSELECTTABLENAME,INDEXNAMEFROM#FRAGLIST-输出开始时间SELE

9、CTSTARTEDDEFRAGMENTINGINDEXESAT+CONVERT(V ARCHAR,GETDATE()-打开游标OPENINDEXES-循环所有的索引FETCHNEXTFROMINDEXESINTOTABLENAME,INDEXNAMEWHILEFETCH_STA TUS=0BEGINSETQUOTED_IDENTIFIERONSELECTEXECSTR=ALTERINDEX+INDEXNAME+ON+TABLENAME+REBUILDWITH(FILLFACTOR=9O,ONLINE=ON)SELECTNowexecuti ng:SELECT(EXECSTR)EXEC(EXEC

10、STR)SETQUOTED_IDENTIFIEROFFFETCHNEXTFROMINDEXESINTOTABLENAME,INDEXNAMEEND-关闭释放游标CLOSEINDEXESDEALLOCATEINDEXES-报告结束时间SELECTFINISHEDDEFRAGMENTINGINDEXESAT+CONVERT(V ARCHAR,GETDATE()-删除临时表DROPTABLE#FRAGLISTGOGO设置定时执行步骤(1) 启动【sqlserverManagementStudio】,在【对象资源管理器】窗口里选择【管理】 【维护计划】选项。(2) 右击【维护计划】,在弹出的快捷菜单里选择【维护计划向导】选项,弹出如图所 示的【维护计划向导】对话框,单击【下一步】按钮(3) 弹出如图所示【选择目标服务器】对话框,在【名称】文本框里可以输入维护计划的名称;在【说明】文本框里可以输入维护计划的说明文字

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论