
# 创建实例定期维护job
#### 操作场景
实例运行一段时间后，由于索引碎片增加，统计信息未及时更新等会导致系统性能有所下降。建议创建定期执行的SQL agent job，定期执行索引重建、统计信息更新、数据库收缩操作。
#### 重建索引job
1. 启动SQL Server Management Studio客户端，使用rdsuser用户登录。
   
   ![](https://support.huaweicloud.com/bestpractice-rds-mssql/zh-cn_image_0000002264547545.png "点击放大")
   
   
2. 选择"SQL Server Agent"，右键单击"New \> Job"，新建SQL agent job。 
   ![](https://support.huaweicloud.com/bestpractice-rds-mssql/zh-cn_image_0000002264627605.jpg)
   
   
3. 输入名字以及描述信息，单击"OK"。 
   ![](https://support.huaweicloud.com/bestpractice-rds-mssql/zh-cn_image_0000002264627597.png "点击放大")
   
   
4. 选择"Steps"，单击"New"，添加执行步骤。
   
   图1添加执行步骤   
   ![](https://support.huaweicloud.com/bestpractice-rds-mssql/zh-cn_image_0000002229708070.png "点击放大")
   
   
5. 输入步骤名称，类型及Command，完成后单击"OK"。Command中填写需要定时执行的SQL，当索引碎片达到一定程度，例如30%，可以进行重建。 
   图2步骤信息   
   ![](https://support.huaweicloud.com/bestpractice-rds-mssql/zh-cn_image_0000002229708066.png "点击放大")
   执行以下SQL，对指定的dbname中的所有表检查索引碎片超过30%后进行重建。
   ```
   use [dbname]
   SET NOCOUNT ON
   DECLARE @Objectid INT, @Indexid INT,@schemaname VARCHAR(100),@tablename VARCHAR(300),@ixname VARCHAR(500),@avg_fip float,@command VARCHAR(4000)
   DECLARE IX_Cursor CURSOR FOR
   SELECT A.object_id,A.index_id,QUOTENAME(SS.name) AS schemaname,QUOTENAME(OBJECT_NAME(B.object_id,B.database_id))as tablename ,QUOTENAME(A.name) AS ixname,B.avg_fragmentation_in_percent AS avg_fip FROM sys.indexes A inner join sys.dm_db_index_physical_stats(DB_ID(),NULL,NULL,NULL,'LIMITED') AS B 
   ON A.object_id=B.object_id and A.index_id=B.index_id 
   INNER JOIN sys.objects OS ON A.object_id=OS.object_id
   INNER JOIN sys.schemas SS ON OS.schema_id=SS.schema_id
   WHERE B.avg_fragmentation_in_percent>10 and B.page_count>20 AND A.index_id>0 AND A.is_disabled<>1
   --AND OS.name='book'
   ORDER BY tablename,ixname
   OPEN IX_Cursor
   FETCH NEXT FROM IX_Cursor INTO @Objectid,@Indexid,@schemaname,@tablename,@ixname,@avg_fip
   WHILE @@FETCH_STATUS=0
   BEGIN
   IF @avg_fip>=30.0
   BEGIN
   SET @command=N'ALTER INDEX '+@ixname+N' ON '+@schemaname+N'.'+ @tablename+N' REBUILD ';
   END
   --PRINT @command
   EXEC(@command)
   FETCH NEXT FROM IX_Cursor INTO @Objectid,@Indexid,@schemaname,@tablename,@ixname,@avg_fip
   END
   CLOSE IX_Cursor
   DEALLOCATE IX_Cursor
   ```
   ![](https://support.huaweicloud.com/bestpractice-rds-mssql/public_sys-resources/note_3.0-zh-cn.png)
   上述重建的SQL只需要修改第一行（Use \[dbname\]），修改为指定的数据库即可。
   如果需要对所有库执行，请修改SQL，添加多所有库的循环执行，此处不做详细示例。
   
   
6. 选择"Schedules"，单击"New"，添加定时执行计划。 
   图3添加定时执行计划   
   ![](https://support.huaweicloud.com/bestpractice-rds-mssql/zh-cn_image_0000002229548222.png "点击放大")
   
   
7. 添加每个月执行一次的定时计划，触发时间、定时周期可以修改，完成后单击"OK"。 
   图4定时执行计划   
   ![](https://support.huaweicloud.com/bestpractice-rds-mssql/zh-cn_image_0000002264547533.png "点击放大")
   
   
8. 上述步骤执行完成后，job建立完毕。 
   图5job   
   ![](https://support.huaweicloud.com/bestpractice-rds-mssql/zh-cn_image_0000002264547537.png)
   
   
9. 选择job，右键单击"Start Job at Step"，手动运行job，检查job是否能正常运行。 
   图6运行job   
   ![](https://support.huaweicloud.com/bestpractice-rds-mssql/zh-cn_image_0000002264627617.png "点击放大")
   
   
10. 运行正常，定时重建db1数据库的索引的维护job创建完毕。 
    ![](https://support.huaweicloud.com/bestpractice-rds-mssql/zh-cn_image_0000002264627609.png "点击放大")
    
    
 
#### 更新统计信息
1. 重复执行重建索引job中的[1]\~[4]。
2. 输入步骤名称，类型及Command，完成后单击"OK"。Command中填写更新统计信息的存储过程，存储过程的详细内容请参考[更新数据库的统计信息](https://support.huaweicloud.com/usermanual-rds-mssql/rds_09_0009.html)。
   
   图7更新统计信息   
   ![](https://support.huaweicloud.com/bestpractice-rds-mssql/zh-cn_image_0000002264627601.png "点击放大")
   
   
3. 选择"Schedules"，单击"New"，添加定时执行计划。 
   图8添加定时执行计划   
   ![](https://support.huaweicloud.com/bestpractice-rds-mssql/zh-cn_image_0000002229548222.png "点击放大")
   
   
4. 添加每个月执行一次的定时计划，触发时间、定时周期可以修改，完成后单击"OK"。 
   图9定时执行计划   
   ![](https://support.huaweicloud.com/bestpractice-rds-mssql/zh-cn_image_0000002264547533.png "点击放大")
   
   
5. 上述步骤执行完成后，job建立完毕。 
   图10更新统计信息job   
   ![](https://support.huaweicloud.com/bestpractice-rds-mssql/zh-cn_image_0000002264547549.png)
   
   
6. 选择job，右键单击"Start Job at Step"，手动运行job，检查job是否能正常运行。
 
#### 定时收缩数据库
1. 重复执行重建索引job中的[1]\~[4]。
2. 输入步骤名称，类型及Command，完成后单击"OK"。Command中填写收缩数据库的SQL命令。 
   ```
   EXEC [master].[dbo].[rds_shrink_database_log] @dbname='myDbName';
   ```
   其中@dbname参数填写数据库名。
   
   
3. 选择"Schedules"，单击"New"，添加定时执行计划。 
   图11添加定时执行计划   
   ![](https://support.huaweicloud.com/bestpractice-rds-mssql/zh-cn_image_0000002229548222.png "点击放大")
   
   
4. 添加每个月执行一次的定时计划，触发时间、定时周期可以修改，完成后单击"OK"。 
   图12定时执行计划   
   ![](https://support.huaweicloud.com/bestpractice-rds-mssql/zh-cn_image_0000002264547533.png "点击放大")
   
   
5. 添加完成后，右键单击"Start Job at Step"，手动运行job，检查job是否能正常运行。
 
