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

use*_*567 1 sql sql-server-2008-r2

我用简单的单词搜索索引扫描对表扫描的真正好处,但仍然很困惑.比方说我有,

create table a(id int, id1 int, varchar(50) name)
Run Code Online (Sandbox Code Playgroud)

如果我选择,

select * from a where id1=1;
Run Code Online (Sandbox Code Playgroud)

它说表扫描,

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

select * from a where id1=1;
Run Code Online (Sandbox Code Playgroud)

它说索引扫描

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

在此输入图像描述

在此输入图像描述

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

Aar*_*and 5

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

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

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

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

表扫描和聚簇索引扫描之间有什么区别?

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

  • @ user960567这个问题并没有真正改变.*clustered*索引扫描和表扫描之间没有太大的区别 - 您仍在读取整个表以满足查询.差异在很大程度上是语义上的 - 表扫描是在没有聚簇索引时调用的内容.[您可以在这里了解有关差异的更多信息](http://stackoverflow.com/questions/18764/),但如果您的问题实际上是关于聚簇索引扫描与表扫描,而不是索引扫描与表扫描,应该看到欺骗或问一个不同的问题.一旦被接受,你不应该改变它. (2认同)