Azure SQL数据库 - 重建索引,可重新恢复不起作用



我正在针对许多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索引语句。如果操作是"重建",这是我正在运行的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选择什么都没有返回。我想念什么吗?

在获得Microsoft高级PM的反馈之后,负责在Azure SQL数据库和SQL Server上维护索引的可重新选项,请允许我更新答案。他提到,您面临的特定问题是由于当前微软不支持"主密钥"约束的可重建操作的事实引起的。他提到他的团队在计划上具有此功能,但无法给我们时间表。

他承诺的Microsoft将更新当前文档以反映上述限制。

此外,他提到:"目前有300 k的行的软限制,在此下面的索引碎片在索引中可能会在索引重建时使用RESABLAIBLE INDEX。。"他希望您知道他们正在处理这个问题,并会尽快解决。

关于在线索引操作,他说在Azure SQL数据库的所有层次上都支持,但是在SQL Server本地上仅支持企业版。

希望这会有所帮助。

最新更新