You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL Azure中创建ONLINE=ON的非聚集索引未生效问题排查及解决方案咨询

问题分析与解决方案

为什么你的索引最终以ONLINE = OFF创建?

最常见的原因是SQL Azure数据库的服务层级不支持在线索引操作,或是操作触发了系统自动降级逻辑:

  • SQL Azure的基础层(Basic)、标准层S0/S1/S2完全不支持在线索引创建。当你在这些层级指定ONLINE = ON时,数据库引擎会静默忽略这个参数,自动以离线模式创建索引,且不会抛出错误。
  • 少数极端场景下,如果表的行数极少(比如只有几行),SQL引擎会判定在线模式的开销大于收益,也会自动切换到离线模式创建索引。

能否在SQL Azure创建ONLINE = ON的非聚集索引?

可以,但必须满足前提条件:你的数据库必须运行在支持在线索引操作的服务层级上:

  • 标准层:S3及以上级别
  • 高级层:任意级别
  • 弹性池:对应兼容的层级(比如eS3及以上的弹性池)

操作步骤与验证方法

  1. 检查当前服务层级
    运行以下查询确认你的数据库版本和服务目标:

    SELECT 
        DATABASEPROPERTYEX(DB_NAME(), 'Edition') AS Edition,
        DATABASEPROPERTYEX(DB_NAME(), 'ServiceObjective') AS ServiceObjective;
    

    如果结果显示是Basic、S0/S1/S2,那么你需要升级到支持在线索引的层级(注意升级会带来成本变化,建议结合业务需求评估后操作)。

  2. 重新创建在线索引
    确认服务层级符合要求后,重新执行你的创建语句即可:

    CREATE NONCLUSTERED INDEX [nci_wi_tbl_transactions] 
    ON [dbo].[tbl_transactions] ([bank_account_id]) 
    INCLUDE ([bankcode]) 
    WITH (ONLINE = ON);
    

    若担心并行度导致隐性降级,可额外添加MAXDOP = 1限制并行操作:

    CREATE NONCLUSTERED INDEX [nci_wi_tbl_transactions] 
    ON [dbo].[tbl_transactions] ([bank_account_id]) 
    INCLUDE ([bankcode]) 
    WITH (ONLINE = ON, MAXDOP = 1);
    
  3. 验证索引的在线属性
    创建完成后,用以下查询确认索引的在线状态:

    SELECT 
        name AS IndexName,
        CASE is_online_index 
            WHEN 1 THEN '在线模式创建' 
            ELSE '离线模式创建' 
        END AS IndexCreationMode
    FROM sys.indexes
    WHERE 
        object_id = OBJECT_ID('dbo.tbl_transactions') 
        AND name = 'nci_wi_tbl_transactions';
    

    也可以直接查看索引的完整定义:

    EXEC sp_helpindex 'dbo.tbl_transactions';
    

额外注意事项

  • 在线索引创建会占用更多CPU、内存资源,建议在业务低峰期执行,避免影响正常业务。
  • 如果表包含LOB类型列(如TEXT、NTEXT、IMAGE),即使服务层级支持,在线索引创建也可能不被允许(你的场景中bankcode不属于这类,可忽略)。

内容的提问来源于stack exchange,提问作者Aditya Singh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 09:42:37