首页 > 解决方案 > 更新基表中的任何字段会导致更新索引视图行的所有行吗?

问题描述

更新基表中的任何字段是否会导致索引视图的自动维护,即使该字段不包含在索引视图的定义中?

或者更糟糕的是,索引视图的所有行都会被重写还是只会更新受影响的行?

标签: sql-server

解决方案


不,它只在需要时更新。这是一个例子:

USE tempdb;
GO

DROP VIEW IF EXISTS dbo.TestValueOnly;
GO

DROP TABLE IF EXISTS dbo.Test;
GO

CREATE TABLE dbo.Test
(
    TestID int IDENTITY(1,1) NOT NULL 
        CONSTRAINT PK_dbo_Test PRIMARY KEY,
    TestName varchar(50) NOT NULL,
    ValueToChange int NOT NULL
);
GO

INSERT dbo.Test (TestName, ValueToChange)
VALUES ('Hello', 12),
       ('There', 14),
       ('And', 16),
       ('Again', 18);
GO

CREATE VIEW dbo.TestValueOnly
WITH SCHEMABINDING
AS
SELECT TestID, ValueToChange 
FROM dbo.Test;
GO

CREATE UNIQUE CLUSTERED INDEX CX_dbo_TestValueOnly
ON dbo.TestValueOnly (TestID);
GO

现在看看这两个查询的查询计划:

UPDATE dbo.Test 
SET TestName = 'Changed' 
WHERE TestID = 14;

UPDATE dbo.Test 
SET ValueToChange = 17 
WHERE TestID = 14;

在此处输入图像描述

第一个只是按预期更新基表并且不触及索引视图。第二个也像预期的那样击中了索引视图。


推荐阅读