查询未执行索引查找或扫描

时间:2012-06-26 20:42:42

标签: sql sql-server sql-server-2008 indexing rdbms

我对Indexes相当新。我有下表[FORUM1]

的表格
    [msg_id] [int] IDENTITY(1,1) NOT NULL,
    [cat_id] [int] NULL,
    [msg_title] [nvarchar](255) NULL

并创建了非聚集索引

CREATE NONCLUSTERED INDEX catindex ON forum1(cat_id)

现在当我运行这个简单的查询时,我可以看到索引没有被使用

SELECT msg_title FROM forum1 where cat_id=4

只有在我创建CI并包含MSG_TITLE字段时才会调用索引。但问题是我必须在实际的表上运行更多类似的查询,例如date = something,userid = 20,status = 1。因此,在每个索引中包含列对我来说都不好。

Execution plan screenshot

1 个答案:

答案 0 :(得分:6)

msg_title未包含在索引中 - >在非聚集索引中找到的任何值都需要键查找到实际数据页中,这是一个昂贵的操作 - 因此,很可能,表扫描是更快。另外:“表扫描”表示你有一个堆 - 一个没有聚簇索引的表 - 这是一件坏事(大部分时间)开始。为什么你没有聚集索引?

您可以通过以下方式解决此问题: 包括索引中的msg_title

CREATE NONCLUSTERED INDEX catindex 
ON forum1(cat_id) INCLUDE(msg_title)

现在,我很确定,SQL Server将使用该索引(因为它可以在索引结构中找到查询所需的所有数据 - 该索引被称为覆盖索引)。这里的好处是:额外的列只是包含在索引的叶级别,所以它使索引只有最小的大。然而,它可能导致索引被更频繁地使用。非常值得!