在有大量事務的數據庫中,表和索引隨着時間的推移而碎片化。所以,爲了增進性能,應該按期檢查表和索引的碎片,並對具備大量碎片的進行整理。sql
一、肯定當前數據庫中全部須要分析碎片的表。數據庫
二、肯定全部表和索引的碎片。post
三、考慮一下因素以肯定須要進行碎片整理的表和索引。性能
四、整理具備大量碎片的表和索引;ui
這裏給出一個樣板SQL存儲過程,它執行如下操做;spa
CREATE PROCEDURE IndexDefrag AS DECLARE @DBName NVARCHAR(255) ,@TableName NVARCHAR(255) ,@SchemaName NVARCHAR(255) ,@IndexName NVARCHAR(255) ,@PctFrag DECIMAL DECLARE @Defrag NVARCHAR(MAX) IF EXISTS (SELECT * FROM sys.objects WHERE OBJECT_ID = OBJECT_ID(N'#Frag')) DROP TABLE #Frag CREATE TABLE #Frag (DBName NVARCHAR(255) ,TableName NVARCHAR(255) ,SchemaName NVARCHAR(255) ,IndexName NVARCHAR(255) ,AvgFragment DECIMAL) EXEC sp_msforeachdb 'INSERT INTO #Frag ( DBName, TableName, SchemaName, IndexName, AvgFragment ) SELECT ''?'' AS DBName ,t.Name AS TableName ,sc.Name AS SchemaName ,i.name AS IndexName ,s.avg_fragmentation_in_percent FROM ?.sys.dm_db_index_physical_stats(DB_ID(''?''), NULL, NULL, NULL, ''Sampled'') AS s JOIN ?.sys.indexes i ON s.Object_Id = i.Object_id AND s.Index_id = i.Index_id JOIN ?.sys.tables t ON i.Object_id = t.Object_Id JOIN ?.sys.schemas sc ON t.schema_id = sc.SCHEMA_ID WHERE s.avg_fragmentation_in_percent > 20 AND t.TYPE = ''U'' AND s.page_count > 8 ORDER BY TableName,IndexName' DECLARE cList CURSOR FOR SELECT * FROM #Frag OPEN cList FETCH NEXT FROM cList INTO @DBName, @TableName,@SchemaName,@IndexName,@PctFrag WHILE @@FETCH_STATUS = 0 BEGIN IF @PctFrag BETWEEN 20.0 AND 40.0 BEGIN SET @Defrag = N'ALTER INDEX ' + @IndexName + ' ON ' + @DBName + '.' + @SchemaName + '.' + @TableName + ' REORGANIZE' EXEC sp_executesql @Defrag PRINT 'Reorganize index: ' + @DBName + '.' + @SchemaName + '.' + @TableName +'.' + @IndexName END ELSE IF @PctFrag > 40.0 BEGIN SET @Defrag = N'ALTER INDEX ' + @IndexName + ' ON ' + @DBName + '.' + @SchemaName + '.' + @TableName + ' REBUILD' EXEC sp_executesql @Defrag PRINT 'Rebuild index: '+ @DBName + '.' + @SchemaName + '.' + @TableName +'.' + @IndexName END FETCH NEXT FROM cList INTO @DBName, @TableName,@SchemaName,@IndexName,@PctFrag END CLOSE cList DEALLOCATE cList DROP TABLE #Frag
爲了自動化碎片分析過程,能夠從SQL Server企業管理器中用如下簡單的步驟建立一個SQL Server任務。代理
一、開啓SQL Server代理;code
二、打開Management Studio,右鍵單擊,選擇新建=》任務;blog
三、在新建任務對話框的「常規」頁面中,輸入任務名稱和其餘細節:索引
四、在新建任務對話框的「步驟」頁面中,單擊「新建」並輸入用戶數據庫的SQL命令。
五、在新建任務步驟對話框「高級」頁面上,輸入報告碎片分析結果的輸出文件名稱:
六、單擊「肯定」按鈕,返回新建做業對話框;
七、在新建任務對話框「計劃」頁面,單擊「新建計劃」,並輸入運行SQL Server任務的合適計劃:
安排這個存儲過程在非高峯執行。爲了肯定數據庫的數據庫模式,記錄成天的SQL Server:SQL Statistics\Batch Requests/sec性能計數器,它將展現數據庫負載的波動。
八、單擊「肯定」按鈕,返回新建任務對話框。
九、輸入全部信息後,單擊新建任務對話框中的「肯定」按鈕建立SQL Server任務。建立計劃在一個固定時間間隔(每週)運行sp_indexDefrag存儲過程的SQL Server任務。
十、確保SQL Server代理運行,這樣SQL Server任務將自動根據設置的計劃運行。
這個SQL任務將在每一個星期天的凌晨1點分析每一個數據庫而且進行碎片整理。