为列索引时,为什么要进行聚簇索引扫描?

时间:2012-09-25 15:07:40

标签: sql-server-2005 indexing

因此,我们有一个表InventoryListItems,它有几列。因为我们有时会根据特定列(g_list_id,一个外键)来查找行,所以我们将该外键列放入一个非聚集索引中,我们将调用它们MYINDEX

所以当我搜索这样的数据时:

-- fake data for example
DECLARE @ListId uniqueidentifier
SELECT @ListId = '7BCD0E9F-28D9-4F40-BD67-803005179B04' 

SELECT *
FROM [dbo].[InventoryListItems]
WHERE [g_list_id] = @ListId

我希望它会使用MYINDEX索引来查找所需的行,然后在这些行中查找信息。所以不仅仅是在索引本身中找到我们需要的所有东西,但仍然是对表格进行全面扫描的重大胜利。

但相反,我似乎还在进行聚簇索引扫描。我无法弄清楚为什么会这样。

如果我执行类似于仅选择索引的包含列中的值的操作,它会执行我期望的操作,索引搜索,并从索引中提取所有内容。

但是,如果我SELECT *,为什么它只是保留索引并进行扫描,因为它在使用它时仍然会因为它在WHERE子句中被引用而大大受益?

1 个答案:

答案 0 :(得分:2)

由于您正在执行SELECT *并因此检索所有列,因此SQL Server的查询优化器可能已经决定仅执行聚簇索引扫描更容易,更有效 - 因为它需要转到聚集索引叶级别来获取所有列(并首先进行搜索,然后进行密钥查找以实际获取整个数据页面,这是一项非常昂贵的操作 - 扫描可能在此设置中更有效)。

我几乎可以肯定你是否尝试

SELECT g_list_id
FROM [dbo].[InventoryListItems]
WHERE [g_list_id] = @ListId

然后会有一个索引寻找(因为你只检索一个列而不是一切)。

这是我建议在使用SELECT * ....时要格外小心的原因之一 - 尽可能避免使用它。