2009-08-26 96 views
3

如何在SQL Server 2008中的視圖上創建聚簇索引。 視圖不是一個真正的表,因此聚集數據的物理排列沒有意義索引創建。如何在視圖上創建聚簇索引

我在哪裏錯過了這一點?

+0

索引視圖被認爲是「實現」視圖數據 - 通過添加葉級是實際數據頁的聚簇索引,這正是發生的情況。這就是爲什麼索引視圖通常比「常規」視圖快得多的原因 – 2009-08-26 16:26:18

回答

2

這是一個略微簡化的解釋。在引擎蓋下有很多技術性的哈囉,但聽起來像是你想要一個通用的「wassup」解釋。

一個視圖本質上是一個預先編寫和存儲的查詢;每當您訪問視圖時,您都會將該預先寫好的查詢檢索並插入到當前查詢中。 (最低限度這是我的看法。)

因此,這些「基本」視圖讀取存儲在數據庫/硬盤上已存在的表中的數據。當您在視圖上構建聚簇索引時,您真正在做的是製作視圖引用的數據的第二個物理副本。例如,如果您有表A,請將view vA創建爲「select * from A」,然後在該視圖上構建一個聚集索引,最終得到的是硬盤驅動器上的兩個數據副本。

如果表A非常大,並且您希望快速訪問表格的一小部分(例如只有2-3列,或者只有Status = 1的地方,或者您希望快速訪問需要難看的加入才能生成的數據)。

當您更新表A(實際上是視圖引用的任何表)時,有趣的是進來,因爲還必須對「基」表進行任何更改「查看」表。在大量使用的OLTP系統中不是一個好主意。我相信SQL的「索引視圖」在Oracle中被稱爲「物化視圖」。對於我的錢來說,物化視圖是一個更好的名稱/描述。

+0

這隻適用於非常昂貴的SQL Server版本。 – 2011-01-19 14:32:43

+0

它比這更復雜。你可以在任何版本的SQL Server 2005及更高版本中創建索引視圖,但在2005年,版本,索引提示以及查詢優化器是否會考慮使用它們都有一些困難。在2008年,查詢優化器將一直考慮索引視圖。 – 2011-01-19 14:52:36

2

雖然視圖不是一個真正的對象,但聚集索引是。

視圖返回的行可以被排序和存儲。

但是,爲了可以索引,視圖應該滿足一些條件。

大多數情況下,他們確保結果是持久的,並且可以在視圖中輕鬆跟蹤底層表的更新(以便每次更新底層表時不必重新編譯索引)。

例如,SUM(*)COUNT_BIG(*)是分配功能:

SUM(set1) + SUM(set2) = SUM(set1 + set2) 
COUNT_BIG(set1) + COUNT_BIG(set2) = COUNT_BIG(set1 + set2) 

,所以很容易當表更改爲重新計算的SUMCOUNT_BIG值,僅使用視圖中的行和列的影響值。

但是,其他聚合不是這種情況,所以它們不能在索引視圖中使用。

3

索引始終存在於磁盤上。當您創建索引時,即使視圖本身不是「真實」行,您也正在實現磁盤上視圖的行。

MSDN White paper帶有解釋