2

我对索引相当陌生。我有下表 [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 fld 时才会调用索引。但问题是我必须在实际表上运行更多类似的查询,例如 date=something、userid=20、status=1。所以在每个索引中包含列对我来说并不好。

执行计划截图

4

1 回答 1

6

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

您可以通过例如在您的索引中包含来解决此问题:msg_title

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

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

于 2012-06-26T20:44:45.367 回答