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

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

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

 -- =============================================
-- Author: <Limy>
-- Create date: <2015-12-31>
-- Description: <批量重建索引>
-- EXEC pr_BatchRebuildIndex 'dbo','DatabaseLog','PK_DatabaseLog_DatabaseLogID',0
-- =============================================
alter proc pr_BatchRebuildIndex
--@DataBase nvarchar(50)=null,--数据库名称,必输项
@Scheme nvarchar(50)=null,--架构名称
@TableName nvarchar(50)=null, --要重建索引的表名称,为空表示所有表
@IndexName nvarchar(200)=null ,--要重建的索引名称
@FragmentPercent decimal(10,5)=0 --碎片率为多少以上的药重建
AS
BEGIN DECLARE @Sql nvarchar(2000);
DECLARE @RebuildSql nvarchar(2000);
DECLARE @ERROR nvarchar(500);
DECLARE @Tables table(TableName nvarchar(100), Indexid int,IndexName nvarchar(200), FragmentPercent decimal(10,5)); ----判断数据库是否存在
--IF DB_ID(@DataBase) is null
--BEGIN
-- RAISERROR('数据库不存在,请输入正确的数据库名称!',16,1);
-- RETURN -1;
--END --判断架构是否存在
IF isnull(@Scheme,'')<>'' and SCHEMA_ID(@Scheme) is null
BEGIN
RAISERROR('架构不存在,请输入正确的架构名称!',16,1);
RETURN -1;
END --表存不存在
IF isnull(@TableName,'')<>''
BEGIN
--有架构
IF isnull(@Scheme,'')<>'' and SCHEMA_ID(@Scheme) is null
BEGIN
IF OBJECT_ID(@Scheme+'.'+@TableName) is null
BEGIN
SET @ERROR='表不存在,请输入正确的表名称!'
RAISERROR(@ERROR,16,2);
RETURN -1;
END
END
--没有架构
IF not exists(select 1 from sys.tables as A where A.name=@TableName )
BEGIN
SET @ERROR='表不存在,请输入正确的表名称!'
RAISERROR(@ERROR,16,5);
RETURN -1;
END
END --索引存不存在
IF isnull(@IndexName,'')<>''
BEGIN
IF not exists(select 1 from sys.SysObjects where name=@IndexName and (xtype=N'UQ' OR xtype=N'PK') )
BEGIN
RAISERROR('索引不存在,请输入正确的索引名称!',16,3);
RETURN -1;
END
END --如果表名为空表示所有表,如果索引为空表示所有索引
--默认查询所有表,所有索引,所有百分比 SET @Sql='SELECT D.name+''.''+object_name(a.object_id) [TableName] ,a.index_id ,B.name [IndexName] ,avg_fragmentation_in_percent
FROM sys.dm_db_index_physical_stats ( DB_ID() , NULL , NULL, NULL, NULL ) AS A
JOIN sys.indexes AS B ON a.object_id = b.object_id AND a.index_id = b.index_id
inner JOIN sys.tables AS C ON a.object_id=C.object_id
inner JOIN sys.schemas AS D ON C.schema_id=D.schema_id
WHERE a.index_id > 0 ' IF isnull(@Scheme,'') <>''
BEGIN
SET @Sql +=' and D.name= '''+@Scheme+''' ';
END
IF isnull(@TableName,'')<>''
BEGIN
SET @Sql +=' and object_name(a.object_id)= '''+@TableName+''' ';
END
IF isnull(@IndexName,'')<>''
BEGIN
SET @Sql +=' and B.name= '''+@IndexName+''' ';
END IF isnull(@FragmentPercent,0)>0
BEGIN
SET @Sql +=' and avg_fragmentation_in_percent>= '+convert(nvarchar(10),@FragmentPercent)+' ';
END INSERT INTO @Tables
EXEC (@Sql)
select '重建前',* from @Tables DECLARE cur cursor for
select TableName, IndexName from @Tables
OPEN cur
DECLARE @tbName NVARCHAR(100),@IXName NVARCHAR(200)
FETCH NEXT FROM cur INTO @tbName,@IXName
WHILE(@@fetch_status=0)
BEGIN
SET @RebuildSql='alter index ['+@IXName+'] on '+@tbName+' rebuild' --要加上[],否则索引里有空格会报错
EXEC (@RebuildSql)
FETCH NEXT FROM cur INTO @tbName,@IXName
END
CLOSE cur
DEALLOCATE cur --重建后查询
delete @Tables
INSERT INTO @Tables
EXEC (@Sql)
select '重建后',* from @Tables Print N'执行完毕!';
return 0;
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. yii点击上传图片后立即显示

    结合yii上传做的图片上传后立即显示,自己琢磨的,有点low <script type="text/javascript">//下面用于图片上传预览功能function ...

  2. Matlab 的reshape函数(转)

    看Matlab的help文档讲得不是清楚. 先给上一段代码: >> a=[1 2 3;4 5 6;7 8 9;10 11 12]; >> b=reshape(a,2,6); 这 ...

  3. 权限分配界面 纯手工 仅用到bootstrap的架构 以及 c标签

    <div class="form-group">        <div class="row">         <label ...

  4. List,set,Map 的用法和区别

    Collection├List│├LinkedList│├ArrayList│└Vector│ └Stack└SetMap├Hashtable├HashMap└WeakHashMap Collecti ...

  5. PHP 将json的stdClass Object转成数组array

    PHP和JS通讯通常都用json,但是PHP要用json的数据,通过json_decode转出来的数组并不是标准的array,所以需要用这个函数进行转换. function object_array( ...

  6. URAL 1934 Black Spot(最短路)

    Black Spot Time limit: 1.0 secondMemory limit: 64 MB Bootstrap: Jones's terrible leviathan will find ...

  7. POJ-2152 Fire (树形DP)

    题目大意:在一棵树中选出一些点,选每个点的代价为w(i),并且对于点 i ,在距离它lim(i)之内必须选一个点,使它作为 i 的依赖点.求最小代价. 题目分析:定义状态dp(u,k)表示使u为根节点 ...

  8. web前端学习策略

  9. 最长不下降子序列的O(n^2)算法和O(nlogn)算法

    一.简单的O(n^2)的算法 很容易想到用动态规划做.设lis[]用于保存第1~i元素元素中最长不下降序列的长度,则lis[i]=max(lis[j])+1,且num[i]>num[j],i&g ...

  10. js中arguments,caller,callee,apply的用法小结

    <!DOCTYPE HTML> <html> <head> <meta charset="UTF-8"> <style typ ...