SQL Server Rebuild Index

USE [msdb]
GO

/****** Object:  StoredProcedure [dbo].[IndexMaintain]    Script Date: 6/14/2013 1:46:17 PM ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE  procedure  [dbo].[IndexMaintain] 
as  
SET NOCOUNT on
 
BEGIN TRY
 declare @EXCEPTION VARCHAR(MAX)
 declare @MailSubject NVARCHAR(255)
 declare @DBName NVARCHAR(255)
 declare @TableName NVARCHAR(255)
 declare @SchemaName NVARCHAR(255)
 declare @IndexName NVARCHAR(255)
 declare @avg_fragmentation_in_percent_old DECIMAL(18,3)
 declare @avg_page_space_used_in_percent_old DECIMAL(18,3)
 declare @avg_fragmentation_in_percent_new DECIMAL(18,3)
 declare @avg_page_space_used_in_percent_new DECIMAL(18,3)
        
 declare @Defrag NVARCHAR(max)
 declare @Sql NVARCHAR(max)
 declare @ParmDefinition nvarchar(500)
 set @EXCEPTION=‘‘
 
 --删除#Frag
 if exists(select *  from sys.objects where object_id=object_id(N‘#Frag‘))
 drop table #Frag
   
 --定义临时表#Frag保存index Fragment   
 create table #Frag(
     DBname  NVARCHAR(255),
     TableName NVARCHAR(255),
     SchemaName NVARCHAR(255),
     IndexName NVARCHAR(255),
     AvgFragment DECIMAL(18,3),
     avg_page_space_used DECIMAL(18,3)
     )

--去除DataBass为READ_ONLY
 declare dbstatus cursor for
  select name
  from sys.databases
  where DatabasePropertyEx(name,‘Updateability‘)<>‘READ_ONLY‘AND state_desc=‘ONLINE‘
 open dbstatus
 fetch next from dbstatus into @DBName
 while @@FETCH_STATUS=0
 begin
  set @sql=‘insert into #Frag(DBname, TableName,SchemaName,IndexName,AvgFragment,avg_page_space_used)
   select ‘‘[‘[email protected]+‘]‘‘ AS DBName,‘‘[‘‘+t.Name+‘‘]‘‘ AS TableName, sc.Name AS SchemaName, ‘‘[‘‘+i.name+‘‘]‘‘ AS IndexName, s.avg_fragmentation_in_percent, s.avg_page_space_used_in_percent 
   from ‘[email protected]+‘.sys.dm_db_index_physical_stats(DB_ID(‘‘‘[email protected]+‘‘‘),NULL,NULL,NULL,‘‘Sampled‘‘) AS s
   join ‘[email protected]+‘.sys.indexes i on s.Object_Id=i.Object_id and s.Index_id=i.Index_id
   join ‘[email protected]+‘.sys.tables t on i.Object_id=t.Object_ID
   join ‘[email protected]+‘.sys.schemas sc on t.schema_id=sc.SCHEMA_ID
   where s.avg_fragmentation_in_percent  >20 and t.type=‘‘U‘‘ and s.page_count>8 and i.allow_page_locks=1 and i.allow_row_locks=1
   order by  TableName,IndexName‘
  exec(@sql)
  fetch next from dbstatus into @DBName
 end
 close dbstatus
 deallocate dbstatus

--定义CURSOR遍历临时表#Frag,根据Fragment大小采取不同的方案维护index.
 declare cList CURSOR for
   select *  from  #Frag
 open cList
 fetch next from cList into @DBName,@TableName,@SchemaName,@IndexName,@avg_fragmentation_in_percent_old,@avg_page_space_used_in_percent_old
 while @@FETCH_STATUS=0
 begin
    --Fragment between 20.0 and 40.0 ,使用 Alter INDEX reorganize整理碎片
    if @avg_fragmentation_in_percent_old between 20.0 and 40.0 
    begin      
   --整理碎片
   set @Defrag=N‘Alter INDEX   ‘+‘‘[email protected]+‘ on ‘[email protected]+‘.‘[email protected]+‘.‘[email protected]+‘ reorganize‘
   exec sp_executesql @Defrag
        
   --获取index被整理后的碎片比例
   set @Sql=N‘USE ‘[email protected]+‘; select @avg_fragmentation_in_percent_new_temp=s.avg_fragmentation_in_percent,@avg_page_space_used_in_percent_new_temp= s.avg_page_space_used_in_percent
     from  ‘[email protected]+‘.sys.indexes i 
     inner join ‘[email protected]+‘.sys.dm_db_index_physical_stats(db_id(replace(replace(‘‘‘[email protected]+‘‘‘,‘‘[‘‘,‘‘‘‘),‘‘]‘‘,‘‘‘‘)), object_id(‘‘‘[email protected]+‘‘‘‘+‘),null,null,‘‘sampled‘‘) as s on   i.index_id=s.index_id 
     where i.object_id=object_id(‘‘‘[email protected]+‘‘‘‘+‘)and i.name=‘‘‘[email protected]+‘‘‘‘
   set @ParmDefinition=N‘@avg_fragmentation_in_percent_new_temp  DECIMAL(18,3) output,@avg_page_space_used_in_percent_new_temp DECIMAL(18,3) output‘
   exec sp_executesql @Sql,@ParmDefinition ,@[email protected]_fragmentation_in_percent_new output, @[email protected]_page_space_used_in_percent_new output
     
   --write log
   insert [dbo].IndexDefrag values(@DBName,@TableName,@SchemaName,@IndexName,getdate(),@avg_fragmentation_in_percent_old,@avg_page_space_used_in_percent_old,@avg_fragmentation_in_percent_new,@avg_page_space_used_in_percent_new,‘0‘)
    end
  --Fragment大于40.0 ,使用 Alter INDEX rebuild整理碎片
    else if @avg_fragmentation_in_percent_old >40.0
    begin      
   --整理碎片
   set @Defrag=N‘Alter INDEX    ‘+‘‘[email protected]+‘ on ‘[email protected]+‘.‘[email protected]+‘.‘[email protected]+‘ rebuild‘
   exec sp_executesql @Defrag
     
   --获取index被整理后的碎片比例
   set @Sql=N‘USE ‘[email protected]+‘;select @avg_fragmentation_in_percent_new_temp=s.avg_fragmentation_in_percent,@avg_page_space_used_in_percent_new_temp= s.avg_page_space_used_in_percent
     from  ‘[email protected]+‘.sys.indexes i 
     inner join ‘[email protected]+‘.sys.dm_db_index_physical_stats(db_id(replace(replace(‘‘‘[email protected]+‘‘‘,‘‘[‘‘,‘‘‘‘),‘‘]‘‘,‘‘‘‘)), object_id(‘‘‘[email protected]+‘‘‘‘+‘),null,null,‘‘sampled‘‘) as s on   i.index_id=s.index_id 
     where i.object_id=object_id(‘‘‘[email protected]+‘‘‘‘+‘)and i.name=‘‘‘[email protected]+‘‘‘‘
   set @ParmDefinition=N‘@avg_fragmentation_in_percent_new_temp  DECIMAL(18,3) output,@avg_page_space_used_in_percent_new_temp DECIMAL(18,3) output‘
   exec sp_executesql @Sql,@ParmDefinition ,@[email protected]_fragmentation_in_percent_new output, @[email protected]_page_space_used_in_percent_new output
     
   --write log
   insert [dbo].IndexDefrag values(@DBName,@TableName,@SchemaName,@IndexName,getdate(),@avg_fragmentation_in_percent_old,@avg_page_space_used_in_percent_old,@avg_fragmentation_in_percent_new,@avg_page_space_used_in_percent_new,‘1‘)
  end
   fetch next from cList into @DBName,@TableName,@SchemaName,@IndexName,@avg_fragmentation_in_percent_old,@avg_page_space_used_in_percent_old
 end
 close cList
 deallocate cList
END TRY
BEGIN CATCH
 SET @EXCEPTION = ERROR_MESSAGE()
END CATCH

IF @EXCEPTION<>‘‘
BEGIN
 SET @MailSubject=‘[Important] SDS DB Index Maintainence failed from ‘ + @@SERVERNAME 
 EXEC msdb.dbo.sp_send_dbmail
 @profile_name = ‘SDSCSQL‘,                    
 @recipients = ‘[email protected]‘,
 [email protected]_recipients =‘[email protected];[email protected]‘,
 [email protected]_copy_recipients =‘‘,
 @body = @EXCEPTION,
 @subject = @MailSubject
 
END
 
GO

时间: 2024-11-08 06:00:29

SQL Server Rebuild Index的相关文章

sql server中index的REBUILD和REORGANIZE

参考文献: http://technet.microsoft.com/en-us/library/ms188388.aspx 使用alter index来rebuild和reorganize索引来清除碎片,rebuild能够完全清除碎片,但是reorganize却不能. --1.准备实验数据 select * into Employee from AdventureWorks2008R2.HumanResources.Employee; --2.查看使用空间:Employee 290 72 KB

SQL Server -&gt;&gt; Online Index Rebuilding(联机索引重建)

SQL Server的Enterprise Edition是支持联机索引重建的.那么联机索引重建是怎么工作的以及对我们的查询有什么影响呢? 既然是联机,SQL Server保持了现有索引对于用户的可用,也就意味着它还不会去修改现有索引以及它相关联的统计数据.那么可以猜想下它的做法其实和SQL Server下Switch Partition就有相似的做法了 -- 最小化数据离线时间.它应该是先生成索引和统计数据,这个时候新的索引和统计数据肯定都分配好了object_id,内部肯定是已经可见了,只是

SQL SERVER -&gt;&gt; Columnstore Index

谈到Columnstore index就不得不提SQL SERVER的压缩技术了.Columnstore就是用到了SQL SERVER的压缩技术.Columnstore又分Columnstore和Columnstore_Archive两种不同的压缩类型.Columnstore_Archive运用了Microsoft XPRESS压缩算法来实现比Columnstore更大的压缩比. 对于本身就是Columnstore的表,要么我们选择Columnstore,要么选择Columnstore_Arch

SQL Server 索引(index) 和 视图(view) 的简单介绍和操作

--索引(index)和视图(view)-- --索引(index)----概述: 数据库中的索引类似于书籍的目录,他以指针形式包含了表中一列或几列组合的新顺序,实现表中数据库的逻辑排序.索引创建在数据表或者视图的字段上,生成索引页,存放于数据库中.--分类:在SQL Server中,根据索引的作用和存储方式的不同,将索引分为聚集索引和非聚集索引两类. 1)聚集索引 :指数据库的物理顺序与被创建索引的字段顺序完全相同.同一个数据表最多只能创建一个聚集索引.默认情况下主键自动被创建为聚集索引.聚集

SQL Server获取索引创建时间&amp;重建时间&amp;重组时间

原文:SQL Server获取索引创建时间&重建时间&重组时间 之前写过一篇博客"SQL Server中是否可以准确获取最后一次索引重建的时间?",里面主要讲述了三个问题:我们能否找到索引的创建时间?最后一次索引重建(Index Rebuild)的时间? 最后一次索引重组(INDEX REORGANIZE)的时间呢?,当时得出的结论,答案是我们无法准确的找到索引的创建时间.最后一次索引重组时间,最后一次索引重建的时间.但是最近看到一篇博客"SQL Server

Migrating Oracle on UNIX to SQL Server on Windows

Appendices Published: April 27, 2005 On This Page Appendix A: SQL Server for Oracle Professionals Appendix B: Getting the Best Out of SQL Server 2000 and Windows Appendix C: Baselining Appendix D: Installing Common Drivers and Applications Installing

SQL Server 性能优化3 该指数(Index)保养

前言 之前的一篇文章介绍了索引来提高数据库的查询性能,这其实仅仅是个开始.也许假设缺乏适当的保养,索引你以前建立的,甚至成为拖累,成为帮凶下降数据库的性能. 寻找碎片 消除碎片索引维护可能是最常规的任务,,议是当碎片等级为 5% - 30% 之间时採用 REORGANIZE 来"重整"索引.假设达到 30% 以上则使用 REBUILD 来"重建"索引.决定採用何种手段和操作时机可能需要考虑很多的因素,下面4条是你必需要考虑的: 备份的计划 server的负载 磁盘剩

SQL Server 创建索引(index)

索引的简介: 索引分为聚集索引和非聚集索引,数据库中的索引类似于一本书的目录,在一本书中通过目录可以快速找到你想要的信息,而不需要读完全书. 索引主要目的是提高了SQL Server系统的性能,加快数据的查询速度与减少系统的响应时间 . 但是索引对于提高查询性能也不是万能的,也不是建立越多的索引就越好.索引建少了,用 WHERE 子句找数据效率低,不利于查找数据.索引建多了,不利于新增.修改和删除等操作,因为做这些操作时,SQL SERVER 除了要更新数据表本身,还要连带立即更新所有的相关索引

SQL Server 性能调优3 之索引(Index)的维护

SQL Server 性能调优3 之索引(Index)的维护 热度1 评论 16 作者:溪溪水草 前言 前一篇的文章介绍了通过建立索引来提高数据库的查询性能,这其实只是个开始.后续如果缺少适当的维护,你先前建立的索引甚至会成为拖累,成为数据库性能的下降的帮凶. 查找碎片 消除碎片可能是索引维护最常规的任务,微软官方给出的建议是当碎片等级为 5% - 30% 之间时采用 REORGANIZE 来“重整”索引,如果达到 30% 以上则使用 REBUILD 来“重建”索引.决定采用何种手段和操作时机可