为什么 SQL Server 更喜欢聚集索引查找而不是非聚集索引扫描

问题描述 投票:0回答:1

创建表:

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)
GO

如果我只选择

AGENT_CODE
AGENT_NAME
列,为什么 SQL Server 使用聚集索引查找,而不是非聚集扫描?

Clustered index seek

但是,如果我选择不带

Where
子句的数据,则会使用集群扫描选择数据。为什么 SQL Server 一开始不使用非聚集索引,即使我们查询请求的所有列都存在于非聚集索引数据结构中。

enter image description here

sql sql-server indexing clustered-index non-clustered-index
1个回答
0
投票

如果您使用 where 子句检查执行计划,并查看聚集索引查找的估计成本,然后再次运行查询并提示:

SELECT AGENT_CODE, AGENT_NAME 
  FROM AGENTS WITH (INDEX(NON_CLUS_IX_AGENTS_AGENTCODE_AGENTNAME)) 
  WHERE AGENT_CODE LIKE 'A006';

您将看到非聚集索引查找的估计成本是相同的。

Estimated costs

SQL Server 认为这是一个 50/50 的选择,并且根据我的经验,它将始终支持聚集索引。

© www.soinside.com 2019 - 2024. All rights reserved.