请问如何重新组织数据库中所有索引?

saxpiano 2015-11-10 10:17:09
我用的是游标的方法,速度不理想。我想问大神们有什么好的方法?
DECLARE cursors CURSOR FAST_FORWARD READ_ONLY FOR ( SELECT indexes.name, tables.name FROM A.sys.indexes INNER JOIN A.sys.tables ON
A.sys.indexes.object_id=A.sys.tables.object_id WHERE sys.indexes.type_desc='nonclustered')
OPEN cursor
DECLARE @sql NVARCHAR(max),@syname NVARCHAR(50), @tbname NVARCHAR(50)
FETCH NEXT from cursors INTO @syname,@tbname
WHILE @@fetch_status=0
BEGIN
SET @sql='ALTER INDEX '+ @syname +' ON '+@tbname +' REORGANIZE '
EXEC(@sql)
FETCH NEXT FROM cursors INTO @syname,@tbname
end
CLOSE cursors
DEALLOCATE cursors
...全文
147 点赞 收藏 2
写回复
2 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
zbdzjx 2015-11-10
感觉是要看表的大小及操作情况。 试一下这个看看: exec sp_msforeachtable 'DBCC DBREINDEX(''?'')'
回复
Yole 2015-11-10
重建索引本来就是很慢的,尤其是表的数据量大,索引多。

declare R_T cursor
for select name from sys.tables
declare @T varchar(50)
open r_t
fetch next from r_t into @t
while @@fetch_status=0
begin
--R_index游标判断指定表索引碎片情况并优化
declare R_Index cursor
for 
select t.name,i.name,s.avg_fragmentation_in_percent from sys.tables t
  join sys.indexes i on i.object_id=t.object_id
  join sys.dm_db_index_physical_stats(db_id(),object_id(@T),null,null,'limited') s
   on s.object_id=i.object_id and s.index_id=i.index_id
declare @TName varchar(50),@IName varchar(50),@avg int,@str varchar(500)
open r_index
fetch next from r_index into @TName,@Iname,@avg
while @@fetch_status=0
begin
  if @avg>=30  --如果碎片大于,重建索引
  begin
   set @str='alter index '+rtrim(@Iname)+' on dbo.'+rtrim(@tname)+' rebuild'
  end
  if @avg<30 and @avg>10  --如果碎片小于,重新组织索引
  begin
   set @STR='alter index '+rtrim(@Iname)+' on dbo.'+rtrim(@tname)+' reorganize'
  end
  print @str
  exec (@str)  --执行
  fetch next from r_index into @TName,@Iname,@avg
end
--结束r_index游标
close r_index
deallocate r_index
fetch next from r_t into @t
end
--结束R_T游标
close r_t
deallocate r_t

我这也是一个游标重建索引的,不过并不是所有的索引都要重建,只有碎片大于30%需要重建,小于30%大于10%的重组就可以。
回复
相关推荐
发帖
疑难问题
创建于2007-09-28

2.1w+

社区成员

MS-SQL Server 疑难问题
申请成为版主
帖子事件
创建了帖子
2015-11-10 10:17
社区公告
暂无公告