2

所以,我们有一个表,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 子句中被引用?

4

1 回答 1

2

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

我几乎可以肯定如果你尝试

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

那么将会有一个索引搜索(因为你只检索一个列 - 不是所有的)。

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

于 2012-09-25T15:23:54.197 回答