创建表:
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 使用聚集索引查找,而不是非聚集扫描?
但是,如果我选择不带
Where
子句的数据,则会使用集群扫描选择数据。为什么 SQL Server 一开始不使用非聚集索引,即使我们查询请求的所有列都存在于非聚集索引数据结构中。
如果您使用 where 子句检查执行计划,并查看聚集索引查找的估计成本,然后再次运行查询并提示:
SELECT AGENT_CODE, AGENT_NAME
FROM AGENTS WITH (INDEX(NON_CLUS_IX_AGENTS_AGENTCODE_AGENTNAME))
WHERE AGENT_CODE LIKE 'A006';
您将看到非聚集索引查找的估计成本是相同的。
SQL Server 认为这是一个 50/50 的选择,并且根据我的经验,它将始终支持聚集索引。