我估计的执行计划使用TableScan而不是Index Seek

时间:2014-12-12 08:44:11

标签: sql-server performance indexing

我正在查询一个在三列上有非聚集索引的表。

例如:

Create Table TableA (Col1 int, Col2 int, Col3 int, Col4 int, Col5 int)
Create nonclustered index IdxTableA ON TableA (Col1, Col2, Col3)

执行查询时:

select * from TableA where Col1 = 1 and Col2 = 2 and Col3 = 3;

我估计的执行计划是一个表扫描操作,他没有使用我的索引。我的桌子有千行;我重建了索引,我的估计执行计划仍然是表扫描操作。

为什么不使用索引?

1 个答案:

答案 0 :(得分:0)

索引不会是因为它没有col4和col5 索引不是covering。它必须是

Create nonclustered index IdxTableA ON TableA (Col1, Col2, Col3) INCLUDE (col4, col5)

然而,表和查询存在更深层次的问题。

SELECT *表示如果添加col6所有列,则需要更新索引。

这导致表也没有聚集索引的问题。所以你删除了“密钥查找”的途径。通常通过覆盖索引来防止密钥查找,或者如果您只需要一行,则可以更高效。

相关问题