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;
第一个只是按预期更新基表并且不触及索引视图。第二个也像预期的那样击中了索引视图。
推荐阅读
- python-3.x - 如何将列分成组并在组之间循环
- oracle - 如何在客户端 PC 上运行 Oracle APEX 应用程序
- powerbi - DAX 问题,当我在 RETURN 子句中使用 IF 时,过滤器/关系被忽略
- amazon-web-services - 如何在 Hibernate 中以编程方式提供对 ColumnTransofrmer 的读写?
- django - 第 8 行:“空”。您是否忘记注册或加载此标签?
- java - 哪个 PlatformTransactionManager 在 Spring 中用于处理 @Transactional
- integer-overflow - 左移计数 >= 类型的宽度 [-Wshift-count-overflow]
- angular - 允许直接访问路由中定义的 Angular 应用程序 url(浏览器导航)
- java - 在其他几条消息完成后发送消息而不使用外部存储?
- c++ - C++20 模块实现分区的 hpp/cpp 拆分