【问题标题】:SQL Index Update with Covering Columns覆盖列的 SQL 索引更新
【发布时间】:2014-08-16 05:07:49
【问题描述】:

我正在表上创建索引,我想包含一个覆盖列:messageText nvarchar(1024)

插入后,messageText 永远不会更新,因此它是包含在覆盖索引中以加快查找速度的理想候选者。

但是如果我更新同一索引中的其他列会发生什么?

索引中的整行是否需要重新分配,还是仅更新列中的数据在索引中更新?

简单示例

成像下表:

CREATE TABLE [Messages](
    [messageID] [int] IDENTITY(1,1) NOT NULL,
    [mbrIDTo] [int] NOT NULL,
    [isRead] [bit] NOT NULL,
    [messageText] [nvarchar](1024) NOT NULL
)

还有以下索引:

CREATE NONCLUSTERED INDEX [IX_messages] ON [Messages] ( [mbrIDTo] ASC, [messageID] ASC ) 
INCLUDE ( [isRead], [messageText])

当我们更新表格时:

UPDATE    Messages
SET       isRead = 1
WHERE     (mbrIDTo = 6546)

查询计划显示索引 IX_messages 已被使用,并且还将更新,因为列 isRead 是索引的一部分。

因此,将大文本字段(例如上面的 messageText)作为索引中覆盖列的一部分,是否会在更新同一索引中的其他值时影响性能?

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    在 SQL Server 中更新行时,会删除整行并插入包含更新记录的新行。因此,即使 messageText 字段没有变化,它仍然需要重新写入磁盘。

    这是 Paul Randall 的博客文章,其中有一个很好的例子:http://www.sqlskills.com/blogs/paul/do-changes-to-index-keys-really-do-in-place-updates/

    【讨论】:

    • 您是否有指向 msdn 文章的链接或其他可靠来源?
    猜你喜欢
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    • 2018-06-12
    • 2014-10-25
    • 1970-01-01
    • 2011-05-09
    • 2017-10-08
    • 2012-01-03
    相关资源
    最近更新 更多