多列索引的最左边一列不起单列索引的作用

我的印象是,像一个指数

CREATE NONCLUSTERED INDEX IX_Name_Age ON People ( Name ASC, Age ASC ) 

将不仅用于像Select * From People WHERE Name ='X'和Age = Y这样的查询,而且还将用作类似于Select * From People的单列索引WHERE Name ='Z'

然而,在我迄今为止所做的一些testing中,似乎并不是这样。 例如,我有制造商作为领先的列的制造商/零件编号索引,但select* WHERE制造商=“A”仍然进行表扫描。

我在做/解释错误的东西还是我最初的假设错了?

如果SQL Server认为如果您正在search最左边的列,使用非聚集索引将会更便宜。 在你的情况(我猜测)的问题是,你正在做一个SELECT *,而不是只指定你想要回来的列。 如果指定不在非聚集索引内的列,那么SQL Server将需要在索引查找之后进行键查找,并返回到聚集索引(如果没有聚集索引,则返回堆)以获取其余的列。

如果您只需要返回几个列,请指定这些列,然后将它们添加为现有索引中的包含列,SQL Server将开始使用索引。

表中有多less行? 如果表足够小,SQL Server有时不会使用索引,因为来自非聚簇索引的RID /书签查找的开销可能会超过避免表扫描的性能收益。 只要你保持统计表上的统计数据更新,那么SQL Server就应该在它认为有必要的时候使用索引。