【发布时间】: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