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

Azure SQL Server空表查询异常:非聚集索引失效、聚集索引生效问题

问题背景与现象

场景

Azure SQL Server数据库(20 DTU),空间使用率约20%,无其他查询进程,计算利用率维持0%。存在一张含约80列的空表,未创建任何索引。执行如下查询:

SELECT column1,
       column2,
       ...
       columnN
FROM table
WHERE column1 = 'some' 
  AND column2 = 'something' 
  AND column3 = 'something' 
  AND column4 = 'something'

WHERE子句涉及4列(含1个时间戳列)。执行该查询时,数据库CPU占100%,耗时数分钟仍未结束(表为空)。

操作与问题

创建非聚集索引:

CREATE NONCLUSTERED INDEX [index_name] 
ON [dbo].[table] ([column1] ASC, [column2] ASC, 
                  [column3] ASC, [column4] ASC)
         WITH (STATISTICS_NORECOMPUTE = OFF, DROP_EXISTING = OFF, 
               ONLINE = OFF, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
GO

创建后执行相同查询,仍耗时数分钟、CPU达100%,执行计划显示表扫描(table scan)。疑问:为何使用包含WHERE子句4列的非聚集索引,却仍执行表扫描而非索引扫描(index scan)?

但将该索引改为聚集索引(CLUSTERED)后,查询瞬间完成,执行计划显示聚集索引查找(index clustered seek)。

核心疑问

为何空表查询需聚集索引才能快速判断表为空,而非聚集索引无法满足?

补充说明

仅保留非聚集索引时生成的执行计划显示索引查找(index seek),但这是先创建后删除聚集索引后得到的结果,推测原问题的根源在于堆表(heap)。创建聚集索引后的执行计划则正常显示聚集索引查找。

内容的提问来源于stack exchange,提问作者Jaime Caffarel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 00:47:29