我计划使用IndexOptimize
Ola Hallengren 的脚本来替换 SharePoint 2013 On Premise Defragmentation Timer Job。
有人为此目的使用它吗?您使用什么参数以及如何使用?以下是我针对 OOOTB 计时器作业通常会处理的数据库而汇总的内容:
EXEC sp_msforeachdb
'if exists(select 1 from [?].sys.objects where name=''proc_DefragmentIndices'')
EXECUTE dbo.IndexOptimize
@Databases = ''?'',
@FragmentationLow = NULL,
@FragmentationMedium = ''INDEX_REORGANIZE,INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE'',
@FragmentationHigh = ''INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE'',
@FragmentationLevel1 = 5,
@FragmentationLevel2 = 30
'
我只会更新统计数据。
我认为 Jeff Moden 曾经说过“重建索引只是更新统计数据的一种极其昂贵的方式”。
此外,运行 UPDATE STATISTICS 可以同时更新索引和列统计信息。重建索引只对索引本身进行,因此列统计信息是陈旧的,除非它们达到“20% 数据更改 + 500 条记录”标准以触发自动更新。在大桌子上,这可能需要一段时间并且不够频繁。
SQL2014 及更低版本 - 默认样本大小不会并行,只有 FULLSCAN 会
SQL2016 - 默认样本大小也可以并行(并行统计更新)
我通常使用的语法(在这种情况下我们进行 FULLSCAN [StatisticsSample=100]):
这样,您就可以获得更新的统计信息(优化器会感谢您)的所有好处,而无需所有 I/O 抖动和物理索引结构维护的日志记录。
额外阅读 TF2371,它允许以较低百分比触发大型表上的统计信息更新。如果您使用的是 SQL 2016,则默认情况下启用此功能。
https://support.microsoft.com/en-us/help/2754171/controlling-autostat-auto-update-statistics-behavior-in-sql-server