需要在 SQL 索引视图聚集索引中包含 FK?

pie*_*rs7 7 sql-server materialized-view sql-server-2012

我正在使用 SQL Server 索引视图来提高连接的性能,该连接按小表上的类别过滤(非常)大的表。例如:

CREATE VIEW BigTableSubset WITH SCHEMABINDING 
AS 
SELECT b.ID, b.SomeValue from BigTable b 
INNER JOIN SmallTable s on (b.CategoryFK = s.CategoryPK) 
where s.Type = 'Blah'

CREATE UNIQUE CLUSTERED INDEX PK_BigTableSubset ON BigTableSubset
(ID) 
INCLUDE (SomeValue)
Run Code Online (Sandbox Code Playgroud)

(BigTable.ID是BigTable上的PK)

查询性能大大增加(因为需要Bigtable中的子集已经存储),但我会确保SQL可以更新索引本身在最优化的方式时,无论是源表进行更新。

所以问题是:我是否需要在视图的聚集索引中包含 SmallTable.CategoryPK 以确保这一点,或者 SQL 是否会作为索引结构的一部分自动执行此操作?或者换句话说,每次“左手”(SmallTable)表更新时,SQL 如何识别索引中的哪些页面需要更新,我是否需要做任何事情来促进这一点?

Jon*_*gel 4

当源表发生变化时,SQL Server 将始终能够自动更新视图的索引;您不需要做任何额外的事情。

您可以检查修改源表之一的查询计划,您将看到有额外的运算符来更新视图的索引,就像数据更改时更新源表上所有适用的非聚集索引一样。