joh*_*hna 6 sql-server sql-server-2016 ola-hallengren
我正在将 Ola Hallengren IndexOptimize 脚本用于大小为 7 TB、表超过 300,000 的 SQL 2016 数据库。我每晚只有 6 小时的时间来管理索引。我正在使用 timelimit 参数在 6 小时后停止作业。
问题是,每天晚上索引作业都按字母顺序从索引的开头开始,并且只能通过大约相同的 4,000 个表。
我该怎么做才能让索引作业覆盖数据库中的所有索引?也许通过创建多个作业,一周中的每个晚上做一个索引子集?或者有没有办法让工作在之前停止的第二天重新开始?
所有的表都在同一个数据库模式中。这是供应商提供的数据库,我无法更改数据库架构。
在此先感谢您的任何指导。
我目前的工作步骤如下:
EXECUTE [dbo].[IndexOptimize]
@Databases = 'USER_DATABASES',
@FragmentationLow = NULL,
@FragmentationMedium = 'INDEX_REORGANIZE,INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE',
@FragmentationHigh = 'INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE',
@FragmentationLevel1 = 10,
@FragmentationLevel2 = 40,
@UpdateStatistics = 'ALL',
@OnlyModifiedStatistics = 'Y',
@PartitionLevel = 'N',
@MaxDOP = 0,
@SortInTempdb = 'Y',
@TimeLimit = 21600,
@LogToTable = 'Y'
Run Code Online (Sandbox Code Playgroud)
不要每晚整理索引。您不再需要使用现代硬件(尤其是具有零寻道时间的固态存储)。对于日常维护,您只需要更新修改后的统计信息,即便如此,您也只需要在您发现性能下降时才这样做(即检查您的监控系统告诉您的内容)。
根据 Ola 的网站,您可以执行以下操作:
EXECUTE dbo.IndexOptimize
@Databases = 'USER_DATABASES',
@FragmentationLow = NULL,
@FragmentationMedium = NULL,
@FragmentationHigh = NULL,
@UpdateStatistics = 'ALL',
@OnlyModifiedStatistics = 'Y'
Run Code Online (Sandbox Code Playgroud)
当您确实需要对索引进行碎片整理时(例如,如果您删除了大量数据),您可以做的另一件事是使用 SQL Server 的Service Broker为批处理中的多个表设置维护计划。
该文章深入且难以在此回复中进行总结,但归结为创建异步队列,并行触发代理作业。