Sql-Server
創建索引時會保留多少視圖?
假設我有一個由以下 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);
以下是連接中的三個值,儘管它們並不都是聚集索引的獨特方面的一部分: