gpt4 book ai didi

sql - 查询不进行索引查找或扫描

转载 作者:行者123 更新时间:2023-12-02 08:47:39 24 4
gpt4 key购买 nike

我对索引还很陌生。我有下表 [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。因此,在每个索引中包含列对我来说并不好。

Execution plan screenshot

最佳答案

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

您可以通过例如在您的索引中包含 msg_title:

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

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

关于sql - 查询不进行索引查找或扫描,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11215610/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com