Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 使用索引扫描而不是查找_Sql Server_Non Clustered Index - Fatal编程技术网

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使用称为统计信息的特殊对象来估计表中的数据分布。当仅选择位置时,查询所需的所有数据都在非聚集索引中,但当您尝试获取内容时,它必须转到聚集索引。尝试将内容包含到非聚集索引中以获得覆盖索引,这将是最有效的