我正在查询一个在三列上有非聚集索引的表。
例如:
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;
我估计的执行计划是一个表扫描操作,他没有使用我的索引。我的桌子有千行;我重建了索引,我的估计执行计划仍然是表扫描操作。
为什么不使用索引?
答案 0 :(得分:0)
索引不会是因为它没有col4和col5 索引不是covering。它必须是
Create nonclustered index IdxTableA ON TableA (Col1, Col2, Col3) INCLUDE (col4, col5)
然而,表和查询存在更深层次的问题。
SELECT *
表示如果添加col6所有列,则需要更新索引。
这导致表也没有聚集索引的问题。所以你删除了“密钥查找”的途径。通常通过覆盖索引来防止密钥查找,或者如果您只需要一行,则可以更高效。