在有大量事务的数据库中,表和索引随着时间的推移而碎片化。所以,为了增进性能,应该按期检查表和索引的碎片,并对具备大量碎片的进行整理。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点分析每一个数据库而且进行碎片整理。