Azure SQL数据库 - 重建索引,可恢复无效

时间:2018-02-11 17:16:27

标签: tsql azure-sql-database

我正在针对许多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中选择什么都不会返回。我错过了什么吗?

1 个答案:

答案 0 :(得分:0)

在负责维护Azure SQL数据库和SQL Server上的索引的RESUMABLE选项的Microsoft高级PM的反馈之后,请允许我更新我的答案。他提到您遇到的具体问题是由于目前Microsoft不支持“主键”约束的可恢复重建操作。他提到他的团队在计划上有这个功能,但无法给我们一个时间表。

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

此外,他还提到“当前存在大约300 K的行的软限制,低于该限制,在使用可恢复索引进行索引重建期间,索引碎片可能会变得更糟。在这种情况下,目前我们建议不要使用RESUMABLE选项“。他希望你知道他们正在解决这个问题并很快解决它。

关于在线索引操作,他说所有Azure SQL数据库都支持这种操作,但只在Enterprise Edition上支持SQL Server内部部署。

希望这有帮助。