SQL Server不使用索引

时间:2016-03-11 00:04:54

标签: sql sql-server sql-server-2000

我有一个Material表,其中有两列被编入索引。

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

它使用表扫描。

SELECT MaterialName, PartType FROM Material

也使用表扫描

PartTypeMaterialName都属于VARCHAR(50)类型。

为什么不使用Index Scan?我正在使用SQL Server 2000。

1 个答案:

答案 0 :(得分:2)

股票回答:这取决于。

列有多宽?如何"完整"是吗?表中有多少列?多少行?

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

  • 在仅选择PartType时,SQL优化器意识到读取索引(每行4个字节)比表更高效,并且这样做
  • 在选择Material时,SQL优化器意识到它几乎读取整个表 - 没有时间保存读取索引。 (我并不完全相信,但我避免抛弃更多的IF,比如还有其他索引,是否有聚集索引,等等)
  • 在选择Material PartType时,SQL相同的逻辑适用,只有更多。
  • 一个关键因素,你没有和order by子句 - 你只需要以最便于SQL返回的顺序询问所有数据。如果你{{1}材料,赔率非常好SQL将使用该索引。