我正在针对许多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语句。如果操作是&#34; Rebuild&#34;,这就是我正在运行的SQL:
ALTER INDEX PK_My_Table ON dbo.My_Table
REBUILD WITH (ONLINE = ON , MAXDOP = 1, RESUMABLE = ON)
哪个成功执行但似乎没有做任何事情。如果我再次运行顶部查询,索引仍然在那里列出具有相同级别的碎片。如果我删除&#34; RESUMABLE = ON&#34;从ALTER INDEX语句中,索引实际上似乎要重建,并且顶级查询不会返回它。
我想也许它只是在后台运行,但是从sys.index_resumable_operations中选择什么都不会返回。我错过了什么吗?
答案 0 :(得分:0)
在负责维护Azure SQL数据库和SQL Server上的索引的RESUMABLE选项的Microsoft高级PM的反馈之后,请允许我更新我的答案。他提到您遇到的具体问题是由于目前Microsoft不支持“主键”约束的可恢复重建操作。他提到他的团队在计划上有这个功能,但无法给我们一个时间表。
他承诺微软将更新当前的文档以反映上述限制。
此外,他还提到“当前存在大约300 K的行的软限制,低于该限制,在使用可恢复索引进行索引重建期间,索引碎片可能会变得更糟。在这种情况下,目前我们建议不要使用RESUMABLE选项“。他希望你知道他们正在解决这个问题并很快解决它。
关于在线索引操作,他说所有Azure SQL数据库都支持这种操作,但只在Enterprise Edition上支持SQL Server内部部署。
希望这有帮助。