ms sql server 重建或重组数据库索引


Create procedure Upc_IndexDefrag
as
Begin
	Declare @DBName NVARCHAR(255)
			,@Tablename NVARCHAR(255)
			,@Schemaname NVARCHAR(255)
			,@iNDEXnAME NVARCHAR(255)
			,@PctFrag DECIMAL
	Declare @DeFrag NVARCHAR(MAX)
	IF(EXISTS(SELECT 1 FROM sys.objects where object_id = OBJECT_ID(N'#Frag')))		
	BEGIN
		DROP TABLE #Frag
	END
	CREATE TABLE #Frag
	(
		DBName	NVARCHAR(255)
		,TableName	NVARCHAR(255)
		,SchemaName NVARCHAR(255)
		,IndexName NVARCHAR(255)
		,AvgFragment DECIMAL
	)
	EXEC sp_MSforeachdb N'INSERT INTO #Frag(
		DBName,
		TableName,
		Schemaname,
		IndexName,
		AvgFragment
		)SELECT ''?'' AS DBName
			,t.Name as TableName
			,sc.Name AS Schemaname
			,I.NAME AS IndexName
			,s.avg_fragmentation_in_percent
	FROM ?.sys.dm_db_index_physical_stats(DB_ID(''?''),NULL,NULL,NULL,''Sampled'') AS s
		JOIN ?.sys.indexes i
		ON s.Object_id = i.Object_id
			AND s.Index_id = i.Index_id
		JOIN ?.sys.tables t
		ON i.Object_id = t.Object_id
		Join ?.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
	ORDER BY TableName,IndexName'
	DECLARE cList CURSOR
	FOR SELECT * FROM #Frag
	OPEN cList
	FETCH NEXT FROM cList
	INTO @DBName,@TableName,@SchemaName,@IndexName,@PctFrag
	WHILE @@FETCH_STATUS = 0
	BEGIN
		IF(@PctFrag between 20.0 AND 40.0)
		BEGIN
			SET @DeFrag = N'ALTER INDEX '+@iNDEXnAME + N' ON '+ @DBName+N'.'+@Schemaname+N'.' + @Tablename + N' REORGANIZE'
			EXEC sp_executesql @DeFrag
			--print @DeFrag
			Print N'REORGANIZE index:'+@DBName+N'.'+ @Schemaname+N'.'+@Tablename+N'.'+@iNDEXnAME
		END
		ELSE IF @PctFrag > 40.0
		BEGIN
			SET @DeFrag = N'ALTER INDEX ' + @iNDEXnAME +N' ON '+@DBName+N'.'+ @Schemaname+N'.'+@Tablename+N' REBUILD'
			EXEC sp_executesql @DeFrag
			Print N'Rebuild index:'+@DBName+N'.'+ @Schemaname+N'.'+@Tablename+N'.'+@iNDEXnAME
		END
		FETCH NEXT FROM cList
		INTO @DBName,@TableName,@SchemaName,@IndexName,@PctFrag
	END
	CLOSE cList
	DEALLOCATE cList
	DROP TABLE #Frag
End

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值