Use this script to defragment every index on every table in the current database.
declare @workFlow table (
WorkID int identity (1, 1)
,TableName sysname
,IndexName sysname
,unique(TableName, IndexName)
)
declare @startID int
declare @endID int
declare @curID int
declare @curTableName sysname
declare @curIndexName sysname
set nocount on
insert @workFlow
(
TableName
,IndexName
)
select dbo.sysobjects.[name] as TableName
,dbo.sysindexes.[name] as IndexName
from dbo.sysobjects
inner join dbo.sysindexes
on dbo.sysindexes.[id] = dbo.sysobjects.[id]
where (dbo.sysobjects.xtype = 'U')
and (dbo.sysindexes.impid = 0)
order by dbo.sysobjects.[name]
select @startID
= min(WorkID)
,@endID
= max(WorkID)
from @workFlow workFlow
set @curID = @startID
while (@curID <= @endID)
begin
select @curTableName
= workFlow.TableName
,@curIndexName
= workFlow.IndexName
from @workFlow workFlow
where (workFlow.WorkID = @curID)
dbcc indexdefrag (0, @curTableName, @curIndexName)
with no_infomsgs
set @curID = @curID + 1
end
If you need to rebuild the indexes, replace the 'dbcc indexdefrag ...' statement with this one:
dbcc dbreindex (@curTableName, @curIndexName) with no_infomsgs
Also make sure you read this must-read white paper on index defragmentation by Mike Ruthruff: Microsoft SQL Server 2000 Index Defragmentation Best Practices.
ML
No comments:
Post a Comment