创建索引时保留了多少视图?

Abe*_*ler 6 index sql-server-2008 sql-server materialized-view

假设我有一个由以下 SQL 定义的视图:

SELECT t1.id, t2.name, t3.address
FROM Table1 as t1
INNER JOIN Table2 t2
  ON t1.id = t2.tID
INNER JOIN Table3 t3
  ON t1.id = t3.tID
Run Code Online (Sandbox Code Playgroud)

据我所知,如果我在这个视图上创建一个索引,那么数据将被持久化,但我不清楚究竟是什么被持久化了。假设我在 t1.id 上创建了一个唯一的聚集索引,是否将所有三列都保存到磁盘中,或者是否仍会在运行时计算从 table2 和 table3 中提取的值?

如果其中任何一个没有意义,或者我是否遗漏了任何重要内容,请告诉我。

Aar*_*and 15

所有三列都保存在索引视图上的聚集索引中的磁盘中(实际上,与常规表上的聚集索引没有什么不同)。您可以使用DBCC PAGE. 我在 tempdb 中创建了以下结构:

USE tempdb;
GO

CREATE TABLE dbo.a(a INT);
CREATE TABLE dbo.b(a INT, b DATETIME);
CREATE TABLE dbo.c(a INT, c CHAR(32));

INSERT dbo.a SELECT 1;
INSERT dbo.b SELECT 1, SYSDATETIME();
INSERT dbo.c SELECT 1, REPLICATE('c', 32);
GO

CREATE VIEW dbo.v
WITH SCHEMABINDING 
AS
  SELECT a.a, b.b, c.c
  FROM dbo.a
  INNER JOIN dbo.b
  ON a.a = b.a
  INNER JOIN dbo.c
  ON a.a = c.a;
GO

CREATE UNIQUE CLUSTERED INDEX x ON dbo.v(a);
GO
Run Code Online (Sandbox Code Playgroud)

打开跟踪标志,以便我可以使用IND/ PAGE

DBCC TRACEON(3604, -1);
DBCC IND('tempdb', 'dbo.v', 1);
Run Code Online (Sandbox Code Playgroud)

结果:

在此处输入图片说明

所以我知道要查看第 312 页:

DBCC PAGE(2, 1, 312, 3);
Run Code Online (Sandbox Code Playgroud)

这是来自连接的三个值,即使它们不是聚集索引的独特方面的一部分:

在此处输入图片说明