【发布时间】:2018-02-11 17:16:27
【问题描述】:
我正在针对多个 Azure SQL 数据库运行索引维护例程。我正在使用以下查询来获取要在每个数据库中重组或重建的索引列表:
Declare @ReorgThreshold int = 5
Declare @RebuildThreshold int = 30
Declare @MinPageCount int = 100
SELECT x.TableName, x.IndexName, x.PercentFragmentation,
CASE WHEN x.PercentFragmentation < @RebuildThreshold THEN 'Reorganize' ELSE 'Rebuild' END as ActionType
FROM
(SELECT OBJECT_NAME(PS.object_id) AS TableName, I.name AS IndexName, IPS.avg_fragmentation_in_percent as PercentFragmentation
FROM sys.dm_db_partition_stats as PS INNER JOIN
sys.indexes as I ON PS.object_id = I.object_id AND PS.index_id = I.index_id AND I.type in (1/*Clustered index*/,2/*NonClustered index*/) CROSS APPLY
sys.dm_db_index_physical_stats(DB_ID(), ps.object_id, ps.index_id, null, 'LIMITED') as IPS
WHERE IPS.index_id < 1000 -- no xml, columstore, or spatial indexes
AND IPS.avg_fragmentation_in_percent > @ReorgThreshold
AND IPS.page_count >= @MinPageCount) as x
然后我对返回的每个索引执行 ALTER INDEX 语句。如果操作是“重建”,这是我正在运行的 SQL:
ALTER INDEX PK_My_Table ON dbo.My_Table
REBUILD WITH (ONLINE = ON , MAXDOP = 1, RESUMABLE = ON)
成功执行但似乎没有做任何事情。如果我再次运行顶部查询,索引仍然以相同级别的碎片列在那里。如果我从 ALTER INDEX 语句中删除“RESUMABLE = ON”,则索引实际上似乎已重建,并且顶部查询不会返回它。
我认为它可能只是在后台运行,但是从 sys.index_resumable_operations 中选择什么都没有返回。我错过了什么吗?
【问题讨论】: