使用索引扫描而不是查找查找



我有一个具有以下结构的表:

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';

结果为:"索引查找(非聚集(">

因此,非聚集索引正在工作。为什么当我按列进行搜索而是进行扫描时,它不进行查找?

  • 表中的总行数为 200
  • 此查询检索的总行数为 86

看起来查询优化器决定扫描表,而不是使用基于数据选择性的索引。

直接引用表实际上可能比通过索引查找然后执行 KeyLookup 更快。如果表具有更多行 (> 10k(,则情况可能并非如此。在这里,86 个中的 200 个超过 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

扫描与搜索

因此,如果我们有一个高度选择性的搜索谓词,

则搜索通常是一种更有效的策略;也就是说,如果我们有一个搜索谓词,它消除了表的大部分。

相关内容

  • 没有找到相关文章

最新更新