Sql-Server

創建索引時會保留多少視圖?

  • May 6, 2019

假設我有一個由以下 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

據我了解,如果我在這個視圖上創建一個索引,那麼數據將被持久化,但我不清楚究竟是什麼被持久化了。假設我在 t1.id 上創建了一個唯一的聚集索引,是否會將所有三列都保存到磁碟,或者從 table2 和 table3 中提取的值是否仍會在執行時計算?

讓我知道這是否有任何意義,或者我是否遺漏了任何重要的內容。

所有三列都保存在索引視圖上的聚集索引中的磁碟上(實際上,與正常表上的聚集索引沒有什麼不同)。您可以使用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

打開跟踪標誌,以便我可以使用IND/ PAGE

DBCC TRACEON(3604, -1);
DBCC IND('tempdb', 'dbo.v', 1);

結果:

在此處輸入圖像描述

所以我知道要檢查第 312 頁:

DBCC PAGE(2, 1, 312, 3);

以下是連接中的三個值,儘管它們並不都是聚集索引的獨特方面的一部分:

在此處輸入圖像描述

引用自:https://dba.stackexchange.com/questions/31664