回答
這是一個略微簡化的解釋。在引擎蓋下有很多技術性的哈囉,但聽起來像是你想要一個通用的「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. 在(日期+鍵)上創建聚簇索引
- 5. 爲什麼SQL索引視圖始終使用聚簇索引
- 6. 如何停止DataContext.CreateDatabase爲表的主鍵創建聚簇索引?
- 7. 在SQL中禁用聚簇索引的方法和哪個列會創建默認非聚簇索引?
- 8. 如何在索引視圖上創建空間索引?
- 9. 瞭解聚簇索引
- 10. 插入聚簇索引表
- 11. 改變聚簇索引列
- 12. 儘管有聚簇索引,SQL Server仍在使用非聚簇索引
- 13. 在視圖中創建聚集/非聚集索引
- 14. 混淆了聚簇索引和非聚簇索引。包含5個疑問
- 15. SQL Server性能:非聚簇索引+ INCLUDE列與聚簇索引 - 等效嗎?
- 16. 在nhibernate中設置聚簇索引
- 17. SQL Server索引 - HEAP上的非聚簇索引
- 18. SQL Server中唯一標識符列上的聚簇/非聚簇索引
- 19. 如何創建這個索引視圖?
- 20. 索引視圖索引創建失敗
- 21. 創建視圖,索引
- 22. Azure無法識別聚簇索引
- 23. H2數據庫:聚簇索引支持
- 24. 更改sybase中的非聚簇索引
- 25. SqlServer聚簇索引存儲(> 1列)?
- 26. 帶聚簇索引的文件表
- 27. MySql錯誤1064唯一聚簇索引
- 28. Sybase非聚簇索引選擇
- 29. 如何在創建表中創建非聚集索引?
- 30. SQL Server - 如何查找聚簇索引是否存在
索引視圖被認爲是「實現」視圖數據 - 通過添加葉級是實際數據頁的聚簇索引,這正是發生的情況。這就是爲什麼索引視圖通常比「常規」視圖快得多的原因 – 2009-08-26 16:26:18