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)
这是来自连接的三个值,即使它们不是聚集索引的独特方面的一部分:

| 归档时间: |
|
| 查看次数: |
3436 次 |
| 最近记录: |