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扫描
PartType
和 MaterialName
都是 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 将使用该索引。
我有一个 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扫描
PartType
和 MaterialName
都是 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 将使用该索引。