关于索引的概念可以看看宋大牛的博客

T-SQL查询高级—SQL Server索引中的碎片和填充因子

整个数据库的索引很多,索引碎片多了,不可能一个个的去重建,都是重复性的工作,所以索性写了个存储过程,按范围需要重建索引。

  1. -- =============================================
  2. -- Author: <Limy>
  3. -- Create date: <2015-12-31>
  4. -- Description: <批量重建索引>
  5. -- EXEC pr_BatchRebuildIndex 'dbo','DatabaseLog','PK_DatabaseLog_DatabaseLogID',0
  6. -- =============================================
  7. alter proc pr_BatchRebuildIndex
  8. --@DataBase nvarchar(50)=null,--数据库名称,必输项
  9. @Scheme nvarchar(50)=null,--架构名称
  10. @TableName nvarchar(50)=null, --要重建索引的表名称,为空表示所有表
  11. @IndexName nvarchar(200)=null ,--要重建的索引名称
  12. @FragmentPercent decimal(10,5)=0 --碎片率为多少以上的药重建
  13. AS
  14. BEGIN
  15.  
  16. DECLARE @Sql nvarchar(2000);
  17. DECLARE @RebuildSql nvarchar(2000);
  18. DECLARE @ERROR nvarchar(500);
  19. DECLARE @Tables table(TableName nvarchar(100), Indexid int,IndexName nvarchar(200), FragmentPercent decimal(10,5));
  20.  
  21. ----判断数据库是否存在
  22. --IF DB_ID(@DataBase) is null
  23. --BEGIN
  24. -- RAISERROR('数据库不存在,请输入正确的数据库名称!',16,1);
  25. -- RETURN -1;
  26. --END
  27.  
  28. --判断架构是否存在
  29. IF isnull(@Scheme,'')<>'' and SCHEMA_ID(@Scheme) is null
  30. BEGIN
  31. RAISERROR('架构不存在,请输入正确的架构名称!',16,1);
  32. RETURN -1;
  33. END
  34.  
  35. --表存不存在
  36. IF isnull(@TableName,'')<>''
  37. BEGIN
  38. --有架构
  39. IF isnull(@Scheme,'')<>'' and SCHEMA_ID(@Scheme) is null
  40. BEGIN
  41. IF OBJECT_ID(@Scheme+'.'+@TableName) is null
  42. BEGIN
  43. SET @ERROR='表不存在,请输入正确的表名称!'
  44. RAISERROR(@ERROR,16,2);
  45. RETURN -1;
  46. END
  47. END
  48. --没有架构
  49. IF not exists(select 1 from sys.tables as A where A.name=@TableName )
  50. BEGIN
  51. SET @ERROR='表不存在,请输入正确的表名称!'
  52. RAISERROR(@ERROR,16,5);
  53. RETURN -1;
  54. END
  55. END
  56.  
  57. --索引存不存在
  58. IF isnull(@IndexName,'')<>''
  59. BEGIN
  60. IF not exists(select 1 from sys.SysObjects where name=@IndexName and (xtype=N'UQ' OR xtype=N'PK') )
  61. BEGIN
  62. RAISERROR('索引不存在,请输入正确的索引名称!',16,3);
  63. RETURN -1;
  64. END
  65. END
  66.  
  67. --如果表名为空表示所有表,如果索引为空表示所有索引
  68. --默认查询所有表,所有索引,所有百分比
  69.  
  70. SET @Sql='SELECT D.name+''.''+object_name(a.object_id) [TableName] ,a.index_id ,B.name [IndexName] ,avg_fragmentation_in_percent
  71. FROM sys.dm_db_index_physical_stats ( DB_ID() , NULL , NULL, NULL, NULL ) AS A
  72. JOIN sys.indexes AS B ON a.object_id = b.object_id AND a.index_id = b.index_id
  73. inner JOIN sys.tables AS C ON a.object_id=C.object_id
  74. inner JOIN sys.schemas AS D ON C.schema_id=D.schema_id
  75. WHERE a.index_id > 0 '
  76.  
  77. IF isnull(@Scheme,'') <>''
  78. BEGIN
  79. SET @Sql +=' and D.name= '''+@Scheme+''' ';
  80. END
  81. IF isnull(@TableName,'')<>''
  82. BEGIN
  83. SET @Sql +=' and object_name(a.object_id)= '''+@TableName+''' ';
  84. END
  85. IF isnull(@IndexName,'')<>''
  86. BEGIN
  87. SET @Sql +=' and B.name= '''+@IndexName+''' ';
  88. END
  89.  
  90. IF isnull(@FragmentPercent,0)>0
  91. BEGIN
  92. SET @Sql +=' and avg_fragmentation_in_percent>= '+convert(nvarchar(10),@FragmentPercent)+' ';
  93. END
  94.  
  95. INSERT INTO @Tables
  96. EXEC (@Sql)
  97. select '重建前',* from @Tables
  98.  
  99. DECLARE cur cursor for
  100. select TableName, IndexName from @Tables
  101. OPEN cur
  102. DECLARE @tbName NVARCHAR(100),@IXName NVARCHAR(200)
  103. FETCH NEXT FROM cur INTO @tbName,@IXName
  104. WHILE(@@fetch_status=0)
  105. BEGIN
  106. SET @RebuildSql='alter index ['+@IXName+'] on '+@tbName+' rebuild' --要加上[],否则索引里有空格会报错
  107. EXEC (@RebuildSql)
  108. FETCH NEXT FROM cur INTO @tbName,@IXName
  109. END
  110. CLOSE cur
  111. DEALLOCATE cur
  112.  
  113. --重建后查询
  114. delete @Tables
  115. INSERT INTO @Tables
  116. EXEC (@Sql)
  117. select '重建后',* from @Tables
  118.  
  119. Print N'执行完毕!';
  120. return 0;
  121. END

本人才疏学浅,如有不合理之处,欢迎拍砖。

SQL Server 2012 批量重建索引的更多相关文章

  1. SQL Server 2012 列存储索引分析(翻译)

    一.概述 列存储索引是SQL Server 2012中为提高数据查询的性能而引入的一个新特性,顾名思义,数据以列的方式存储在页中,不同于聚集索引.非聚集索引及堆表等以行为单位的方式存储.因为它并不要求 ...

  2. SQL Server 2012 列存储索引分析(转载)

    一.概述 列存储索引是SQL Server 2012中为提高数据查询的性能而引入的一个新特性,顾名思义,数据以列的方式存储在页中,不同于聚集索引.非聚集索引及堆表等以行为单位的方式存储.因为它并不要求 ...

  3. [S]SQL SERVER数据库维护与重建索引

    第一步:查看是否需要维护,查看扫描密度/Scan Density是否为100% declare @table_id int set @table_id=object_id('表名') dbcc sho ...

  4. SQL SERVER数据库维护与重建索引

    第一步:查看是否需要维护,查看扫描密度/Scan Density是否为100% declare @table_id int set @table_id=object_id('表名') dbcc sho ...

  5. SQL Server 2012中快速插入批量数据的示例及疑惑

    SQL Server 2008中SQL应用系列--目录索引 今天在做一个案例演示时,在SQL Server 2012中使用Insert语句插入1万条数据,结果遇到了一个奇怪的现象,现将过程分享出来,以 ...

  6. SQL Server 2012 案例教程(贾祥素)——学习笔记

    第2章 SQL Server 2012概述 1.SQL(Structed Query Language),结构化查询语言. 2.SSMS(SQL Server Mangement Studio),SQ ...

  7. SQL Server 2012新增和改动DMV

    SQL Server 2012新增和改动DMV  系统视图 说明 sys.dm_exec_query_stats (Transact-SQL) 添加了四列,以帮助排除长时间运行的查询所存在的问题. 可 ...

  8. SQL SERVER 2012 执行计划走嵌套循环导致性能问题的案例

    开发人员遇到一个及其诡异的的SQL性能问题,这段完整SQL语句如下所示: declare @UserId             INT declare @PSANo              VAR ...

  9. SQL Server 2012提供的OFFSET/FETCH NEXT与Row_Number()对比测试 [T]

    SQL Server 2008中SQL应用系列--目录索引 前些天看到一篇文章<SQL Server 2012 - Server side paging demo using OFFSET/FE ...

随机推荐

  1. 第一课 T语言关键字(版本TC5.0)

    关键字 TC综合开发工具的语法里包含了大量的关键字,而且对TC综合开发工具支持的关键字都做了亮色处理,以便大家在写脚本的时候容易区分. 关键字在使用的时候,都有特定的作用,不能作为变量名.函数名等等使 ...

  2. 用自己的机器人和ubuntu PC实现通信和控制--26

    原创博客:转载请表明出处:http://www.cnblogs.com/zxouxuewei/ 前提: 1.拥有一台能够采用手动或者自动移动的机器人移动平台. 2.在电机端需要安装高分辨率的霍尔编码器 ...

  3. Hardly Hard

    You have been given the task of cutting out a quadrilateral slice of cake out of a larger, rectangul ...

  4. jquery轻松操作CSS样式

    $(this).click(function(){  if($(this).hasClass(“zxx_fri_on”)){    $(this).removeClass(“zxx_fri_on”); ...

  5. Tutorial: Triplet Loss Layer Design for CNN

    Tutorial:  Triplet Loss Layer Design for CNN Xiao Wang  2016.05.02 Triplet Loss Layer could be a tri ...

  6. Performance Analysis Methodology

    http://www.brendangregg.com/methodology.html The USE Method: for finding resource bottlenecks The TS ...

  7. java .net compartion

    1, http://www-01.ibm.com/software/smb/na/J2EE_vs_NET_History_and_Comparison.pdf http://stackoverflow ...

  8. Oracle升级前备份和失败回退

    一.升级前备份 1.软件备份[root@localhost backup]# su - oracle [oracle@localhost ~]$ cd $ORACLE_HOME[oracle@loca ...

  9. python数据库连接池

    python数据库连接池 import psycopg2 import psycopg2.pool dbpool=psycopg2.pool.PersistentConnectionPool(1,1, ...

  10. 怎么给OCR文字识别软件设置正确的扫描分辨率

    ABBYY FineReader 12是一款专业的OCR文字识别软件,可快速方便地将扫描纸质文档.PDF文件和数码相机的图像转换成可编辑.可搜索的文本,不仅支持对页扫描,还支持多页扫描,扫描分辨率的选 ...