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

Sql server 我估计的执行计划使用TableScan而不是Index Seek,sql-server,performance,indexing,Sql Server,Performance,Indexing,我正在查询一个表,它的索引在三列上是非聚集的 例: 执行查询时: select * from TableA where Col1 = 1 and Col2 = 2 and Col3 = 3; 我估计的执行计划是一个表扫描操作,他不使用我的索引。我的桌子排了一千行;我重建了索引,估计的执行计划仍然是表扫描操作 为什么不使用索引?索引不会被使用,因为它没有col4和col5。 该指数并非如此。这是必须的 Create nonclustered index IdxTableA ON TableA (

我正在查询一个表,它的索引在三列上是非聚集的

例:

执行查询时:

select * from TableA where Col1 = 1 and Col2 = 2 and Col3 = 3;
我估计的执行计划是一个表扫描操作,他不使用我的索引。我的桌子排了一千行;我重建了索引,估计的执行计划仍然是表扫描操作


为什么不使用索引?

索引不会被使用,因为它没有col4和col5。
该指数并非如此。这是必须的

Create nonclustered index IdxTableA ON TableA (Col1, Col2, Col3) INCLUDE (col4, col5)
但是,给定的表和查询存在更深层次的问题

SELECT*
mean all columns to如果添加col6,则需要更新索引


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

那么分布统计信息呢?如果有一半的行具有这些值,那么进行表扫描比搜索更便宜,尤其是对于这样一个小的表。重建索引不会修复未损坏的内容。您可以强制优化器使用带有表提示的索引,但我怀疑您会发现它更昂贵。如果您尝试更新统计信息(EXEC sp_updatestats;),数千行太小了。尝试添加十万-如果值分布是有益的,那么执行计划将使用索引。此外,多列索引可能很棘手-请确保在未使用之前所有列的情况下,不要使用后面的列。但核心仍然是一样的-确定它是否真的意味着对您的性能影响,而不仅仅是期望规划师做您认为最好的事情-大多数情况下,它比您更聪明:)编辑:我也更新了统计数据,使用FullScanThank Luaan,我用十万行进行了测试,结果成功了!
Create nonclustered index IdxTableA ON TableA (Col1, Col2, Col3) INCLUDE (col4, col5)