我将Ola Hallengren IndexOptimize脚本用于SQL 2016数据库,该数据库的大小为7TB,有30多万个表。我每晚只有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'发布于 2020-05-13 19:17:32
不要每天晚上破坏你的索引。您不再需要在现代硬件上使用(特别是具有零搜索时间的固态存储)。对于日常维护,您只需要更新修改后的统计数据,即使这样,您也只需要在注意到性能下降时(即检查监视系统告诉您的内容)时才进行此操作。
根据Ola的网站,您可以这样做:
EXECUTE dbo.IndexOptimize
@Databases = 'USER_DATABASES',
@FragmentationLow = NULL,
@FragmentationMedium = NULL,
@FragmentationHigh = NULL,
@UpdateStatistics = 'ALL',
@OnlyModifiedStatistics = 'Y'您可以做的另一件事是,当您确实需要整理索引(例如,您删除了大量数据)时,您可以使用Server的服务经纪人为一个批处理中的多个表设置维护计划。
这篇文章很深入,很难在这个答复中进行总结,但归根结底是创建了一个异步队列,它并行地激发了代理作业。
发布于 2020-05-13 20:52:47
@Indexes参数允许您指定单个索引或表。我们在一些非常大的表上使用它,然后将其排除在数据库的主要索引作业之外。
在这里阅读更多信息:https://ola.hallengren.com/sql-server-index-and-statistics-maintenance.html,特别是索引部分。
您还可以创建一个元表来填充表列表,然后调度,然后尝试通过游标运行该表。
发布于 2020-05-21 03:29:52
您还可以在https://www.minionware.net/products-1/reindex/上查看Minion重新索引之类的替代方案。
其中有一些不同的特性,如DB或表排序https://minionware.freshdesk.com/support/solutions/articles/43000040362-minion-reindex-1-2-how-to-reindex-tables-in-a-specific-order
http://www.midnightsql.com/wp-content/uploads/2015/01/MinionReindexVsIndexOptimize.pdf
https://dba.stackexchange.com/questions/267095
复制相似问题