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
相关产品推荐
相关产品推荐

