2014-06-25 49 views
0

我在表上创建一个索引,我想包括覆盖柱:MessageText中为nvarchar(1024)SQL索引更新与覆盖柱

插入后,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)作为索引中的覆盖列的一部分,影响其他值在同一索引中的更新时的性能?

回答

1

当在SQL Server中更新一行时,整个行将被删除,并插入一条包含更新记录的新行。因此,即使messageText字段没有更改,它仍然必须重新写入磁盘。

这里是保罗兰德尔一个博客帖子有一个很好的例子:http://www.sqlskills.com/blogs/paul/do-changes-to-index-keys-really-do-in-place-updates/

+0

你有一个链接到MSDN文章指出,或其他一些可靠的消息来源? – gh9

+0

非常感谢您提供丰富的链接! – gh9