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

SQL Server带WHERE子句查询时为何选聚集索引查找而非非聚集索引扫描?

问题背景与解答

创建表

CREATE TABLE  AGENTS 
( 
    AGENT_CODE CHAR(6) NOT NULL PRIMARY KEY, 
    AGENT_NAME CHAR(40), 
    WORKING_AREA CHAR(35), 
    COMMISSION INT, 
    PHONE_NO CHAR(15), 
    COUNTRY NVARCHAR(25) 
);

插入数据

INSERT INTO AGENTS VALUES ('A007', 'Ramasundar', 'Bangalore', '15', '077-25814763', '');
INSERT INTO AGENTS VALUES ('A003', 'Alex ', 'London', '13', '075-12458969', '');
INSERT INTO AGENTS VALUES ('A008', 'Alford', 'New York', '12', '044-25874365', '');
INSERT INTO AGENTS VALUES ('A011', 'Ravi Kumar', 'Bangalore', '15', '077-45625874', '');
INSERT INTO AGENTS VALUES ('A010', 'Santakumar', 'Chennai', '14', '007-22388644', '');
INSERT INTO AGENTS VALUES ('A012', 'Lucida', 'San Jose', '12', '044-52981425', '');
INSERT INTO AGENTS VALUES ('A005', 'Anderson', 'Brisban', '13', '045-21447739', '');
INSERT INTO AGENTS VALUES ('A001', 'Subbarao', 'Bangalore', '14', '077-12346674', '');
INSERT INTO AGENTS VALUES ('A002', 'Mukesh', 'Mumbai', '11', '029-12358964', '');
INSERT INTO AGENTS VALUES ('A006', 'McDen', 'London', '15', '078-22255588', '');
INSERT INTO AGENTS VALUES ('A004', 'Ivan', 'Torento', '15', '008-22544166', '');
INSERT INTO AGENTS VALUES ('A009', 'Benjamin', 'Hampshair', '11', '008-22536178', '');

创建非聚集索引

在AGENT_CODE列创建包含AGENT_NAME的非聚集索引:

CREATE NONCLUSTERED INDEX [NON_CLUS_IX_AGENTS_AGENTCODE_AGENTNAME]
ON [dbo].[AGENTS] ([AGENT_CODE])
INCLUDE (AGENT_NAME)

问题

当仅查询AGENT_CODE和AGENT_NAME列且带WHERE子句时,SQL Server使用聚集索引查找而非非聚集索引扫描;但无WHERE子句查询时则使用非聚集索引扫描。请问:即便非聚集索引包含查询所需全部列,为何带WHERE子句时SQL Server不使用该索引?

解答

首先要明确:SQL Server中主键默认会创建聚集索引,你的AGENT_CODE是主键,所以聚集索引本身就是按AGENT_CODE有序存储的。

带WHERE子句时的选择逻辑

当通过WHERE子句精确匹配AGENT_CODE时,比如WHERE AGENT_CODE = 'A007':

  • 聚集索引查找可以直接通过主键值快速定位到目标行,不需要额外的跳转或数据拼接。
  • 你的非聚集索引虽然包含了查询所需的全部列,但对于这种精确匹配场景,它的查找成本和聚集索引相比并没有优势——甚至因为额外维护了一套索引结构,查询优化器会认为走聚集索引更直接。再加上你的表数据量极小(仅12条),两种方式的开销差异可以忽略,优化器最终会选择更原生的聚集索引查找路径。

无WHERE子句时的选择逻辑

当需要返回所有行的AGENT_CODE和AGENT_NAME时:

  • 非聚集索引的体积远小于聚集索引(聚集索引包含表的所有列,非聚集索引只包含指定的两列),扫描非聚集索引的IO开销更低,所以优化器会选择扫描非聚集索引来获取数据,以减少资源消耗。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 12:44:53