Sql server 使用索引扫描而不是查找
我有一个具有以下结构的表:Sql server 使用索引扫描而不是查找,sql-server,non-clustered-index,Sql Server,Non Clustered Index,我有一个具有以下结构的表: CREATE TABLE Article ( id UNIQUEIDENTIFIER PRIMARY KEY, title VARCHAR(60), content VARCHAR(2000), datePosted DATE, srcImg VARCHAR(255), location VARCHAR(255) ); 然后,我在位置上放置了一个非聚集索引: CREATE NONCLUSTERED INDEX Art
CREATE TABLE Article
(
id UNIQUEIDENTIFIER PRIMARY KEY,
title VARCHAR(60),
content VARCHAR(2000),
datePosted DATE,
srcImg VARCHAR(255),
location VARCHAR(255)
);
然后,我在位置上放置了一个非聚集索引:
CREATE NONCLUSTERED INDEX Articles_location
ON Articles (location);
运行如下查询:
select a.content
from Articles a
where a.location = 'Japan, Tokyo';
结果:索引扫描聚集
运行另一个查询,如下所示:
select a.location
from Articles a
where a.location = 'Japan, Tokyo';
结果:索引搜索非聚集
因此,非聚集索引正在工作。当我通过附加的by列进行搜索而进行扫描时,为什么它不使用查找进行搜索
表中的行总数为200
此查询检索到的行总数为86
看起来查询优化器决定扫描表,而不是根据数据的选择性使用索引 实际上,直接引用表可能比通过索引查找然后执行键查找更快。如果表的行数大于10k,则情况可能并非如此。在这里,200的86%超过了40%
select a.content from Articles a where a.location = 'Japan, Tokyo';
-- clustered index scan
select a.location from Articles a where a.location = 'Japan, Tokyo';
-- covering index
因此,如果我们有一个高度选择性的seek谓词,seek通常是一个更有效的策略;也就是说,如果我们有一个seek谓词,它消除了表中的大部分内容
包含内容的查询不在索引中,因此非聚集索引对数据引擎查找行没有帮助。因此,唯一的一个是现有的聚集索引。你知道它是如何预测的吗?比如,在执行查询之前,Sql server如何知道它将是86条记录?我认为字符串上的相等是高度选择性的。另外,当只选择了位置时,为什么选择使用索引查找?SQL server使用称为统计信息的特殊对象来估计表中的数据分布。当仅选择位置时,查询所需的所有数据都在非聚集索引中,但当您尝试获取内容时,它必须转到聚集索引。尝试将内容包含到非聚集索引中以获得覆盖索引,这将是最有效的