【问题标题】:Table Scan Which Columns Are Checked?表扫描检查哪些列?
【发布时间】:2017-12-25 01:07:46
【问题描述】:

表扫描究竟是如何工作的?

这是我所知道的:

  • 表扫描搜索整个表。
  • 聚集索引扫描只搜索在该索引上定义的任何列。

假设我们有这种情况:

table_a

列:ID、城市、国家

我在City 上有一个聚集索引。

我运行的查询是这样的:

select city
from table_a
where city = 'austin'

实际问题:

  1. 在这种情况下,表扫描将只查看 city 列还是检查 ID、城市和国家/地区列。

  2. 如果表扫描只搜索一列,是否可以说表扫描和索引扫描具有相同的性能?

编辑第 1 部分:

谷歌搜索写道:

当发生表扫描时,SQL Server 将所有行和列读入内存。发生索引扫描时,它将读取索引中的所有行,并且只读取列。

【问题讨论】:

  • "聚集索引扫描只搜索在该索引上定义的任何列。" - 这是不正确的。聚集索引扫描是表扫描:它访问表中的每一页,因为在 SQL Server 中,(单个)聚集索引是表。即使它只检查查询所需的列,它仍然会读取每一页。
  • 同一个东西为什么会有不同的名字呢?它们只是在某些情况下是一样的吗?
  • “如果它们是同一个东西,为什么它们有不同的名字?” - 也许问微软!最初,术语表扫描用于涵盖堆和聚簇表。后来条款被拆分(AFAIK)。但是,聚集索引扫描 == 表扫描。
  • 不,我不是想成为一个混蛋,只是想确保我理解正确。
  • 聚集索引的索引扫描是表扫描!因为唯一的聚集索引就是表。

标签: sql-server indexing


【解决方案1】:

查看执行计划。我希望聚集索引查找,以便仅触及具有指定 City 的那些行。如果您在非索引列上搜索,将执行聚集索引扫描,因此所有行都被触及,但仅返回符合条件的行。

在扫描或查找操作期间,只会从行中提取查询所需的列,而不会检查无关的列。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-24
    • 1970-01-01
    • 2012-02-04
    • 2019-10-11
    • 1970-01-01
    • 2021-01-03
    • 1970-01-01
    • 2018-03-28
    相关资源
    最近更新 更多