Francisco Tapia
fhtapia at gmail.com
Fri Sep 12 09:39:07 CDT 2008
Arthur... I have built my defrag indexes scripts for Sql 2005 following this
model... that I wrote up on my blog
http://sqlthis.blogspot.com/2005/04/defrag-those-indexes-maintenance.html
the initial simply finds the fragmented indexes... I have a much more
complete script that I can post later today, but here is the basic portion
on the defrag section... in where I simply defrag...
SET NOCOUNT ON
DECLARE @TableName AS VARCHAR(500),
@TableOwner AS VARCHAR(500),
@Rows AS BIGINT,
@aAvg AS DECIMAL(10,3),
@SQL AS VARCHAR (1000)
WHILE EXISTS(SELECT * FROM db_defrag)
BEGIN
SELECT TOP 1
@TableOwner = TableOwner,
@TableName = TableName --TableName,
AVG(avg_fragmentation_in_percent)aAvg, AVG(ROWS) aRows,
, at Rows = AVG(ROWS), @aAvg = AVG([avg_fragmentation_in_percent])
FROM db_defrag
GROUP BY TableOwner, TableName
ORDER BY AVG(ROWS) DESC
SET @SQL = 'BEGIN TRY ' +
'ALTER INDEX ALL ON ' + @TableOwner + '.[' + @TableName + '] REBUILD
WITH(MAXDOP=2, ONLINE=ON)'
+ ' END TRY ' +
+ ' BEGIN CATCH '
+ 'ALTER INDEX ALL ON ' + @TableOwner + '.[' + @TableName + '] REBUILD
WITH(MAXDOP=2, ONLINE=OFF)'
+ ' END CATCH '
IF GETDATE() < '5/4/08 23:59'--CONVERT(VARCHAR(12), GETDATE(), 110) +
' 22:00'
BEGIN
PRINT 'Defragging TABLE ' + @TableName
EXECUTE(@SQL)
PRINT 'Clearing from db_defrag table'
DELETE FROM db_defrag WHERE TableName = @TableName
INSERT INTO db_defrag_complete(TableOwner, TableName, ROWS)
VALUES(@TableOwner, @TableName, @Rows)
SET @SQL = 'UPDATE STATISTICS ' + @TableOwner + '.' + @TableName
EXEC(@SQL)
END
ELSE
BEGIN
PRINT 'Skipping TABLE ' + @TableName
DELETE FROM db_defrag WHERE TableName = @TableName
INSERT INTO db_defrag_skipped(TableOwner, TableName, ROWS,
[avg_fragmentation_in_percent]) VALUES(@TableOwner, @TableName, @Rows,
@aAvg)
END
END
-Francisco
http://sqlthis.blogspot.com | Tsql and More...
On Wed, Sep 10, 2008 at 9:14 PM, Arthur Fuller <fuller.artful at gmail.com>wrote:
> In the simple case of Northwind you are correct, but try it against
> Adventureworks and you will see the problem. Try running these statements:
>
>
> EXEC
> sp_MSForeachtable ('ALTER INDEX ALL ON ' + schema_name() + '.' ? + 'REBUILD
> WITH ( PAD_INDEX = OFF, SORT_IN_TEMPDB = ON, STATISTICS_NORECOMPUTE = ON
> )')
>
> EXEC
> sp_MSForeachtable ('ALTER INDEX ALL ON ? REBUILD WITH ( PAD_INDEX = OFF,
> SORT_IN_TEMPDB = ON, STATISTICS_NORECOMPUTE = ON )')
> _______________________________________________
> dba-SQLServer mailing list
> dba-SQLServer at databaseadvisors.com
> http://databaseadvisors.com/mailman/listinfo/dba-sqlserver
> http://www.databaseadvisors.com
>
>