云数据库 SQL Server 作为企业级关系型数据库,其稳定运行直接关系到业务的连续性和数据的安全性。定期维护是保障其性能、数据完整性及高可用性的核心手段。本文从定期更新统计信息和定期维护索引碎片两方面为您介绍云数据库 SQL Server 的日常维护方法。
定期更新统计信息
SQL Server 查询优化器使用统计信息来创建提高查询性能的查询计划,对于大部分查询场景而言,查询优化器能够针对较优查询计划生成对应的统计信息,但在某些场景下,需要创建新的统计信息,以便优化器获得最佳的查询计划。例如:某些数据量较大,并且数据变化较为频繁的大表,当表中数据变化的范围没有达到自动更新统计信息的阈值时,对于产生变化的范围内的数据,查询优化器可能无法创建出性能最佳的查询计划,从而导致 SQL 性能下降,使得业务受损。
针对该场景,可以通过配置 Agent 中的 Job 来定期更新表的统计信息,示例如下:




以上截图展示了为某个库中的某张表,创建了一个在每天05:00进行统计信息更新的 Job 的步骤。其中需要更新的表和定期执行的调度时间,可以根据业务自身需求来评估和修改。
定期维护索引碎片
对于数据变化比较频繁的表,表中的索引在经过长时间、反复的数据变化后,会产生索引碎片。当索引碎片较严重时,相关 SQL 查询效率也会相应降低,所以定期检查索引碎片和整理碎片是很重要的一项运维工作。
针对该场景,可以检查数据库中索引碎片超过50%的索引,并进行重建脚本。
注意:
重建索引可能会产生阻塞和较大的日志,建议在业务低峰期,并且确保在实例的存储空间足够的情况下运行。
use [dbname]SET NOCOUNT ONDECLARE @Objectid INT, @Indexid INT,@schemaname VARCHAR(100),@tablename VARCHAR(300),@ixname VARCHAR(500),@avg_fip float,@command VARCHAR(4000)DECLARE IX_Cursor CURSOR FORSELECT 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 BON A.object_id=B.object_id and A.index_id=B.index_idINNER JOIN sys.objects OS ON A.object_id=OS.object_idINNER JOIN sys.schemas SS ON OS.schema_id=SS.schema_idWHERE 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,ixnameOPEN IX_CursorFETCH NEXT FROM IX_Cursor INTO @Objectid,@Indexid,@schemaname,@tablename,@ixname,@avg_fipWHILE @@FETCH_STATUS=0BEGINIF @avg_fip>=50.0BEGINSET @command=N'ALTER INDEX '+@ixname+N' ON '+@schemaname+N'.'+ @tablename+N' REBUILD ';END--PRINT @commandEXEC(@command)FETCH NEXT FROM IX_Cursor INTO @Objectid,@Indexid,@schemaname,@tablename,@ixname,@avg_fipENDCLOSE IX_CursorDEALLOCATE IX_Cursor
将以上脚本配置为定期执行的 Job,可以达到定期维护索引碎片的效果。
说明: