我有一个具有以下结构的表:
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
扫描与搜索
因此,如果我们有一个高度选择性的搜索谓词,则搜索通常是一种更有效的策略;也就是说,如果我们有一个搜索谓词,它消除了表的大部分。