使用 update 语句更新包含列时,非聚集索引会发生什么情况?

Del*_*lta 8 sql-server-2008 clustered-index

关于包含列的非聚集索引的问题 (DB - MS SQL Server)。我阅读了博客优化的非聚集索引维护,其中提供了有关执行更新语句以及为表定义聚集索引和非聚集索引时的查询计划的信息。
我对包含列的非聚集索引有疑问。我指的是博主提供的相同示例

CREATE TABLE T (PK INT, A INT, B INT, C INT, D INT, E INT)
CREATE UNIQUE CLUSTERED INDEX TPK ON T(PK)

CREATE INDEX TB ON T(B)
CREATE INDEX TCD ON T(C,D)
CREATE INDEX TE ON T(E)
Run Code Online (Sandbox Code Playgroud)

-- 这是包含列的新非聚集索引

CREATE INDEX TF ON T(E) INCLUDE(A)


INSERT T VALUES(0, 10, 20, 30, 40, 50)

UPDATE T SET A = 19
Run Code Online (Sandbox Code Playgroud)

如果未定义索引 TF,则只会执行对聚集索引的更新,不会执行非聚集索引插入和删除操作。但是当定义了 TF 时会发生什么?

Mar*_*ith 4

您引用的博客文章还表明您自己可以如何回答这个问题。

如果你执行

SET SHOWPLAN_TEXT ON;
GO
UPDATE T SET A = 19;
Run Code Online (Sandbox Code Playgroud)

该计划看起来像

  |--Clustered Index Update(OBJECT:([AdventureWorks2008].[dbo].[T].[TPK]), OBJECT:([AdventureWorks2008].[dbo].[T].[TF]), SET:([AdventureWorks2008].[dbo].[T].[A] = [@1]))
       |--Compute Scalar(DEFINE:([Expr1009]=[Expr1009]))
            |--Compute Scalar(DEFINE:([Expr1009]=CASE WHEN CASE WHEN [AdventureWorks2008].[dbo].[T].[A] = [@1] THEN (1) ELSE (0) END THEN (0) ELSE (1) END))
                 |--Top(ROWCOUNT est 0)
                      |--Index Scan(OBJECT:([AdventureWorks2008].[dbo].[T].[TF]), ORDERED FORWARD)
Run Code Online (Sandbox Code Playgroud)

显示每行/窄计划,其中索引TF被列为更新的对象之一。