索引扫描对表扫描的好处用简单的话说?

时间:2013-12-06 14:29:09

标签: sql sql-server-2008-r2

我用简单的单词搜索索引扫描对表扫描的真正好处,但仍然很困惑。假设我有,

create table a(id int, id1 int, varchar(50) name)

如果我选择,

select * from a where id1=1;

它表示表扫描

如果我向id列添加索引并再次运行此查询,

select * from a where id1=1;

它表示索引扫描

更新:我不明白我会得到什么好处**其中id1 = **,因为索引是id。见这些图片,

enter image description here

enter image description here

更新:这个人认为这是一个重复的问题。请先阅读其他问题。我正在使用id1 =但另一个问题是使用select *,没有任何where语句。

1 个答案:

答案 0 :(得分:5)

索引扫描可以更快,因为可能是索引不覆盖表中的整个列集,而表(或聚簇索引)扫描必须读取所有数据。如果索引确实包含表中的所有列,那么它应该大致相当于表扫描,并且索引扫描和表(或CIX)扫描之间的选择将是抛硬币。不同之处在于,当索引中的列数较少时,您可以在8kb页面上容纳更多索引行,从而导致您为了扫描索引中的所有数据而必须读取的整个页面更少。

为了说明我的意思,想象一下,如果您有两份电话簿,一份是姓氏,名字,街道地址和电话号码,另一份是姓氏,名字和电话号码。现在想象一下,因为街道地址不需要打印,所以您可以在电话簿的任何页面上添加两列额外的姓名和电话号码。最终的结果是电话簿更薄,因为您可以在更少的页面上容纳相同数量的电话号码。接下来,假设您负责计算书中的电话号码数量。您会选择哪一个,列出街道地址的页面(具有更多页面,类似于表扫描)或没有街道地址的页面(页面数量较少,类似于大多数索引扫描)?我会选择页数较少的那个。

另一个问题是可以过滤一些索引,这意味着它们不仅在大多数情况下具有更少的列(因此可以在单个页面上容纳更多行),但它们也可以具有消除的WHERE子句很多行。在这种情况下,索引扫描也会比表扫描更好(但这只适用于具有匹配的WHERE子句和相同语义的查询)。

在更新的问题中,您似乎在询问表扫描和集群索引扫描之间的区别。这与比较表扫描和非群集索引扫描有很大不同。在大多数情况下,表扫描和聚簇索引扫描大致相同 - 在这两种情况下,您都在读取表中的所有数据,只是在前一种情况下,表是堆。根据表中发生的流失程度,表扫描会随着时间的推移而变得更糟 - 由于转发记录之类的事情。这个问题还有更多细节:

What's the difference between a Table Scan and a Clustered Index Scan?

(尽管那里的答案似乎没有提及任何关于转发记录的内容,但是我不提倡在任何客户环境中使用堆栈的主要原因之一。我总是希望每个表上都有聚簇索引,除了对于非常专业的场景。)