BI SQL # 145 : SQL Server DBA Scripts : Defrag all indexes within a database
Hi Folks,
In this article we are going to cover How to Defrag all indexes within a database.
In this post we are going to discuss following points:
- Problem Statement of SQL Script:
- Description of SQL Script:
- SQL Script Code
- SQL Script Output Screenshot
- User Level to execute
Problem Statement of SQL Script:
Defrag all indexes within a database.
Description of SQL Script:
This Transact-SQL statements select’s all defragmented indexes in descending order of the fragmentation grade and where the grad is higher then a defined minimum percentage value.
SQL Script Code
DECLARE @TableName SYSNAME ,@IndexID SMALLINT ,@IndexName SYSNAME; DECLARE @MinFragPer FLOAT ,@FragScale AS VARCHAR(5); -- Filter for fragmentation grade in percent. SET @MinFragPer = 10.0; -- Declaration of a cursor with all concered indexes -- exceed the defined min fragmentation grade. DECLARE Fragment CURSOR LOCAL FOR SELECT SCH.NAME + '.' + OBJ.NAME AS TableName ,IDX.index_id AS IndexID ,IDX.NAME AS IndexName ,CONVERT(VARCHAR(5), ROUND(FRG. avg_fragmentation_in_percent, 2)) AS FragScale FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, NULL) AS FRG INNER JOIN sys.objects AS OBJ ON FRG.object_id = OBJ.object_id INNER JOIN sys.schemas AS SCH ON OBJ.schema_id = SCH.schema_id INNER JOIN sys.indexes AS IDX ON FRG.index_id = IDX.index_id AND FRG.object_id = IDX.object_id WHERE IDX.index_id > 0 -- no Heaps AND FRG.avg_fragment_size_in_pages > 1 -- at least one page AND FRG.avg_fragmentation_in_percent > @MinFragPer ORDER BY FRG.fragment_count DESC ,FRG.page_count DESC ,FRG.avg_fragment_size_in_pages DESC; -- Open cursor with indexes & table names. OPEN Fragment; FETCH NEXT FROM Fragment INTO @TableName ,@IndexID ,@IndexName ,@FragScale; WHILE @@FETCH_STATUS = 0 BEGIN -- Info print out. PRINT @Tablename + ' - ' + @IndexName + '(' + CONVERT(VARCHAR(10) , @IndexID) + ') = ' + @FragScale + ' %'; DBCC INDEXDEFRAG ( 0 ,@TableName ,@IndexID ) WITH NO_INFOMSGS; FETCH NEXT FROM Fragment INTO @TableName ,@IndexID ,@IndexName ,@FragScale; END; -- Close and dealloc cursor. CLOSE Fragment; DEALLOCATE Fragment;
SQL Script Output Screenshot
User Level to execute
- 400
Hope you will like How to Defrag all indexes within a database.
If you really like reading my blog and understood at least few thing then please don’t forget to subscribe my blog.
If you want daily link and analysis or interesting link go to following website which will give @ your inbox please subscribe our following link resource blog :
For More information related to BI World visit my Mentalist Blog
SQL Server Mentalist >> SQL Learning Blog
Business Intelligence Mentalist >> BI World
Infographic Mentalist >> Image worth explaining thousand Words
Microsoft Mentalist >> MVC,ASP.NET, WCF & LinQ
DBA Mentalist >>Advance SQL Server Blog
Microsoft BI Mentalist >> MS BI Development Update
Connect With me on