Aşağıdaki sorgu sayesinde fragmentation oranı %5 üzerinde olan tüm indexleri otomatik olarak reorganize edebilir, isterseniz bunu bir sql job sayesinde her gece çalışacak şekilde ayarlayarak index bakım işlemini SQL Server Agent'a bırakabilirsiniz.

Normal şartlarda fragmentation oranı %30 un üzerinde olan indexleri rebuild etmeniz daha sağlıklı olacaktır ancak rebuild işlemi sırasında yeni disk alanına ihtiyaç duyacağınız için rebuild yapmadan önce disk alanını kontrol etmenizde fayda var. Ben rebuild işlemini otomatik olarak yapacağım derseniz ise; aşağıda yer alan sorguda REORGANIZE yerine REBUILD yazmanız yeterli olacaktır...

DECLARE       @DbId INT = DB_ID()

 

SELECT      ROW_NUMBER() OVER(ORDER BY ps.avg_fragmentation_in_percent DESC) AS SiraNo,

            OBJECT_NAME(ps.object_id) as ObjectName,

            i.name as IndexName,

            ps.avg_fragmentation_in_percent, page_count,

            'ALTER INDEX '+i.name+' ON '+OBJECT_NAME(ps.object_id)+' REORGANIZE;' AS Query

INTO        #tmpIndex

FROM        sys.dm_db_index_physical_stats (@DbId,NULL,NULL,NULL,'LIMITED') ps

JOIN        sys.indexes i

            ON    i.object_id =     ps.object_id

            AND   i.index_id  =     ps.index_id

WHERE       ps.avg_fragmentation_in_percent    >     5

            AND ps.index_id                    >     0                

ORDER BY    ps.avg_fragmentation_in_percent DESC

 

 

DECLARE     @Query      NVARCHAR(MAX)

DECLARE     @SiraNo     INT

SET         @SiraNo     =     (SELECT MIN(SiraNo) FROM #tmpIndex)

 

WHILE       (@SiraNo IS NOT NULL)

BEGIN 

      SET   @Query      =     (SELECT Query FROM #tmpIndex WHERE SiraNo = @SiraNo)

      SET   @SiraNo     =     (SELECT MIN(SiraNo) FROM #tmpIndex WHERE SiraNo > @SiraNo) 

      EXEC  (@Query) 

END

 

DROP TABLE  #tmpIndex

 

T-sql sayesinde, veritabanınızda bulunan tablo ve tablo içerisinde yer alan kolonlarınızı listeleyebilirsiniz. Aynı zamanda sysobjects.xtpye parametresini değiştirerek Stored Procedure gibi diğer objeleri de listelemeniz mümkün olacaktır.

Tablonuzdaki kolonlara veya veritabanızdaki objelere göre uygulama veya Sql tarafında dinamik sorgu ve methodlar yazmak için bilinmesi gereken bu sorguyla ilgili örnek aşağıdaki gibidir...

SELECT     ( CASE sysobjects.xtype
             WHEN 'U' THEN 'Table'
             WHEN 'P' THEN 'Stored Procedure'
             END )            AS ObjectType,
            sysobjects.name   AS ObjectName,
            syscolumns.name   AS ObjectDetailName,
            systypes.name     AS DataType,
            syscolumns.length AS DataLength          
FROM        sysobjects
JOIN        syscolumns
            ON sysobjects.id     = syscolumns.id
            AND sysobjects.xtype = 'U'  --(U:Tables, P:StoredProcedures)
JOIN        systypes
            ON syscolumns.xtype  = systypes.xtype
            AND systypes.status  = 0
ORDER BY    sysobjects.id, syscolumns.colid