回答
這是一個略微簡化的解釋。在引擎蓋下有很多技術性的哈囉,但聽起來像是你想要一個通用的「wassup」解釋。
一個視圖本質上是一個預先編寫和存儲的查詢;每當您訪問視圖時,您都會將該預先寫好的查詢檢索並插入到當前查詢中。 (最低限度這是我的看法。)
因此,這些「基本」視圖讀取存儲在數據庫/硬盤上已存在的表中的數據。當您在視圖上構建聚簇索引時,您真正在做的是製作視圖引用的數據的第二個物理副本。例如,如果您有表A,請將view vA創建爲「select * from A」,然後在該視圖上構建一個聚集索引,最終得到的是硬盤驅動器上的兩個數據副本。
如果表A非常大,並且您希望快速訪問表格的一小部分(例如只有2-3列,或者只有Status = 1的地方,或者您希望快速訪問需要難看的加入才能生成的數據)。
當您更新表A(實際上是視圖引用的任何表)時,有趣的是進來,因爲還必須對「基」表進行任何更改「查看」表。在大量使用的OLTP系統中不是一個好主意。我相信SQL的「索引視圖」在Oracle中被稱爲「物化視圖」。對於我的錢來說,物化視圖是一個更好的名稱/描述。
這隻適用於非常昂貴的SQL Server版本。 – 2011-01-19 14:32:43
它比這更復雜。你可以在任何版本的SQL Server 2005及更高版本中創建索引視圖,但在2005年,版本,索引提示以及查詢優化器是否會考慮使用它們都有一些困難。在2008年,查詢優化器將一直考慮索引視圖。 – 2011-01-19 14:52:36
雖然視圖不是一個真正的對象,但聚集索引是。
視圖返回的行可以被排序和存儲。
但是,爲了可以索引,視圖應該滿足一些條件。
大多數情況下,他們確保結果是持久的,並且可以在視圖中輕鬆跟蹤底層表的更新(以便每次更新底層表時不必重新編譯索引)。
例如,SUM(*)
和COUNT_BIG(*)
是分配功能:
SUM(set1) + SUM(set2) = SUM(set1 + set2)
COUNT_BIG(set1) + COUNT_BIG(set2) = COUNT_BIG(set1 + set2)
,所以很容易當表更改爲重新計算的SUM
和COUNT_BIG
值,僅使用視圖中的行和列的影響值。
但是,其他聚合不是這種情況,所以它們不能在索引視圖中使用。
索引始終存在於磁盤上。當您創建索引時,即使視圖本身不是「真實」行,您也正在實現磁盤上視圖的行。
MSDN White paper帶有解釋
- 1. 聚簇索引和非聚簇索引
- 2. 如何使用休眠在多列上創建聚簇索引
- 3. 如何在視圖上實現聚簇索引
- 4. 並行SQL Server聚簇索引創建
- 5. 索引視圖的兩列上的唯一聚簇索引
- 6. 非主鍵列上的聚簇索引或非聚簇索引?
- 7. 聚簇索引
- 8. SQL Server - 在特定分區上創建非聚簇索引
- 9. 在(日期+鍵)上創建聚簇索引
- 10. 在這個堆上創建聚簇索引?
- 11. 如何停止DataContext.CreateDatabase爲表的主鍵創建聚簇索引?
- 12. 爲什麼SQL索引視圖始終使用聚簇索引
- 13. 具有非聚簇索引但沒有聚簇索引
- 14. 如何執行非聚簇索引查找而不是聚簇索引掃描
- 15. 如何在SQL Azure中的另一列上重新創建聚簇索引?
- 16. 在SQL中禁用聚簇索引的方法和哪個列會創建默認非聚簇索引?
- 17. 如何用非聚集索引查找或聚簇索引查找替換聚簇索引掃描?
- 18. 如何在索引視圖上創建空間索引?
- 19. 改變聚簇索引列
- 20. SQL Server非聚簇索引
- 21. 插入聚簇索引表
- 22. 瞭解聚簇索引
- 23. 在ServiceStack/ORMLite codefirst中創建聚簇索引的能力
- 24. 儘管有聚簇索引,SQL Server仍在使用非聚簇索引
- 25. 全文索引vs %%和聚簇索引
- 26. SQL空間索引和聚簇索引
- 27. 在視圖中創建聚集/非聚集索引
- 28. 在視圖上創建全文索引
- 29. 應將主鍵聚簇索引列添加到非聚簇索引中?
- 30. SQL Server性能:非聚簇索引+ INCLUDE列與聚簇索引 - 等效嗎?
索引視圖被認爲是「實現」視圖數據 - 通過添加葉級是實際數據頁的聚簇索引,這正是發生的情況。這就是爲什麼索引視圖通常比「常規」視圖快得多的原因 – 2009-08-26 16:26:18