SET NOCOUNT ON
DECLARE @objectid int
DECLARE @indexid int
DECLARE @partitioncount bigint
DECLARE @schemaname nvarchar(130)
DECLARE @objectname nvarchar(130)
DECLARE @indexname nvarchar(130)
DECLARE @partitionnum bigint
DECLARE @partitions bigint
DECLARE @frag float
DECLARE @command nvarchar(4000)
-- 有条件地选择碎片率超10%的sys.dm_db_index_physical_stats函数表和索引,并将其转换对象和索引ID名。
SELECT
object_id AS objectid,
index_id AS indexid,
partition_number AS partitionnum,
avg_fragmentation_in_percent AS frag
INTO #work_to_do
FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL , NULL, 'LIMITED')
WHERE avg_fragmentation_in_percent > 10.0 AND index_id > 0
-- 声明游标要处理的分区的列表。
DECLARE partitions CURSOR FOR SELECT * FROM #work_to_do
-- 打开游标.
OPEN partitions
-- 遍历分区。
WHILE (1=1)
BEGIN
FETCH NEXT
FROM partitions
INTO @objectid, @indexid, @partitionnum, @frag
IF @@FETCH_STATUS < 0 BREAK
SELECT @objectname = QUOTENAME(o.name), @schemaname = QUOTENAME(s.name)
FROM sys.objects AS o
JOIN sys.schemas as s ON s.schema_id = o.schema_id
WHERE o.object_id = @objectid
SELECT @indexname = QUOTENAME(name)
FROM sys.indexes
WHERE object_id = @objectid AND index_id = @indexid
SELECT @partitioncount = count (*)
FROM sys.partitions
WHERE object_id = @objectid AND index_id = @indexid
SET @command = N'ALTER INDEX ' + @indexname + N' ON ' + @schemaname + N'.' + @objectname + N' REBUILD PARTITION = ALL'
--
EXEC (@command)
PRINT N'Executed: ' + @command
END
-- 关闭游标.
CLOSE partitions
DEALLOCATE partitions
-- 删除临时表.
DROP TABLE #work_to_do
GO
重建索引
原创
©著作权归作者所有:来自51CTO博客作者FGCFJ1987的原创作品,请联系作者获取转载授权,否则将追究法律责任
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
重建索引 sql 语句 如何重建索引
前言: 随着我们的系统数据量越来越大,使用时间越来越长,有时需要考虑重建索引以提高系统的性能。通过本文简单描述下如何快速重建索引,希望同以后大家做维护有所帮助。一、 重建索
重建索引 sql 语句 structure session delete 优化