SQL 服务器不使用索引

SQL Server Does Not Use Index

我有一个 Material table,其中有两列已编入索引。

CREATE NONCLUSTERED INDEX [MaterialName_PartType_idx] ON [dbo].[Material]
(
    [MaterialName] ASC,
    [PartType] ASC
)

CREATE NONCLUSTERED INDEX [PartType_idx] ON [dbo].[Material]
(
    [PartType] ASC
)

当我查询时

SELECT PartType FROM Material

它使用索引扫描,但是当我查询时

SELECT MaterialName FROM Material

它使用 Table 扫描。

SELECT MaterialName, PartType FROM Material

也使用Table扫描

PartTypeMaterialName 都是 VARCHAR(50) 类型。

为什么不使用索引扫描?我正在使用 SQL Server 2000。

标准答案:视情况而定。

列有多宽?他们 "full" 怎么样? table 中有多少列?多少行?

如果只有两列,并且如果 Material 是一个 varchar(100),通常填充 25 个或更多字符,并且如果 PartType 是一个整数, 如果有成千上万行[注意这是 4 个 ifs] 那么:

  • 在仅选择 PartType 时,SQL 优化器意识到读取索引(每行 4 个字节)比 table 更有效,并且这样做
  • 在选择 Material 时,SQL 优化器意识到它正在读取几乎整个 table——没有节省读取索引的时间。 (我并不完全相信这一点,但我避免在更多的 IF 中折腾,例如是否有其他索引,是否有聚集索引等等)
  • 在选择 Material PartType 时,SQL 同样的逻辑适用,只是更多。
  • 一个关键因素,您没有 order by 子句——您只是要求所有数据以最方便的顺序从 SQL 到 return 它in. 如果你 order by Material,赔率非常好 SQL 将使用该索引。