【问题标题】:Azure SQL Database - Rebuild Index With Resumable Not WorkingAzure SQL 数据库 - 可恢复的重建索引不起作用
【发布时间】: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 中选择什么都没有返回。我错过了什么吗?

【问题讨论】:

    标签: tsql azure-sql-database


    【解决方案1】:

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

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

    此外,他提到“目前有一个软限制大约 300 K 的行,低于该限制的索引碎片在使用可恢复索引重建索引期间可能会变得最严重。在这种情况下,目前我们建议不要使用 RESUMABLE 选项。”他想让你知道他们正在解决这个问题,并会尽快解决。

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

    希望这会有所帮助。

    【讨论】:

    • 谢谢阿尔贝托。你确定这是真的吗?我在任何地方都没有看到记录。但无论如何,我的所有数据库都在“弹性高级”定价层(即弹性池中的高级层)。
    • 在线索引碎片整理和列存储一直仅限于SQL企业版。 Columstore 被记录为高级层限制功能,但尚未记录在线索引。我将与 Microsoft 工程师分享您的线程并让您知道。感谢您的耐心等待。
    • 嗨,布赖恩!我根据从 Microsoft PM 获得的所有反馈更新了我的答案。感谢您提出这个问题,并允许我纠正我在 Azure SQL 数据库中在线操作的错误。
    • 嗨,Brian,同一位 Microsoft 经理正在问几个问题。希望大家帮忙解答一下:客户表有多大(多少行)? •包含所有索引和主键的表模式是什么? •执行语句之前和之后的碎片百分比是多少(使用 RESUMABLE) •执行语句之前和之后的碎片百分比是多少(仅使用 ONLINE)
    • 再次感谢阿尔贝托。关于您的一些问题 - 我在 2 个弹性池中拥有大约 100 个数据库,所有这些数据库都在 Elastic Premium 定价层上。表的大小范围与索引碎片一样。但举个例子,表大约有 20K 行,碎片率超过 90%。我试图在该表上重建的索引是非聚集索引。表的主键没有被索引,而是一个包含的列那么这就​​是“在主键约束上重建操作”的意思吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-28
    • 2016-01-15
    • 1970-01-01
    • 2016-02-20
    • 2022-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多