Microsoft SQL Server允許您爲視圖添加索引,但您爲什麼要這麼做?爲什麼你想要在視圖上放置索引?
我的理解是,一個觀點是實際上只是一個子查詢,也就是說,如果我說SELECT * FROM MyView的,我真的說SELECT * FROM(MyView的的查詢)
好像對標的指標表格將是最重要的表格。那麼爲什麼你要在視圖上有一個單獨的索引?
Microsoft SQL Server允許您爲視圖添加索引,但您爲什麼要這麼做?爲什麼你想要在視圖上放置索引?
我的理解是,一個觀點是實際上只是一個子查詢,也就是說,如果我說SELECT * FROM MyView的,我真的說SELECT * FROM(MyView的的查詢)
好像對標的指標表格將是最重要的表格。那麼爲什麼你要在視圖上有一個單獨的索引?
如果視圖被編入索引,那麼任何可以使用索引回答的查詢都不需要引用基礎表。這可以導致性能的巨大提高。
實質上,數據庫引擎在更新基礎表時維護查詢的「已解決」版本(或更確切地說,查詢的索引),然後在可能的情況下使用該已解決的版本而不是原始表。
Database Journal中有一個很好的article。
下面的鏈接提供了更好的措辭信息,比我可以說在性能提高的部分尤其如此。希望它可以幫助
您在視圖上創建索引出於同樣的原因爲在基表:提高對這一觀點的查詢的性能。這樣做的另一個原因是實現一些獨特性約束,你不能對基表實現。不幸的是,SQL Server不允許在視圖上創建約束。
Microsoft SQL Server允許您爲視圖添加索引,但爲什麼要這樣做呢?
加快查詢速度。
我的理解是,一個觀點是實際上只是一個子查詢,即,如果我說SELECT * FROM MyView的,我真的說SELECT * FROM(MyView的的查詢)
並非總是如此。
通過在視圖上創建聚簇索引,可以實現視圖,並更新基礎表,從而實際更新視圖。針對此視圖的查詢可能訪問或不訪問基礎表。
並非所有視圖都可以編入索引。
舉例來說,如果你是在一個視圖中使用GROUP BY
,因爲它是可轉位則應該包含COUNT_BIG
和所有聚合函數應該分佈在UNION ALL
(僅SUM
和COUNT_BIG
其實都是)。這是索引需要維護的必要條件,對基礎表的更新可以及時更新視圖。
我剛剛嘗試向某人解釋此事。 – msarchet 2011-01-19 16:03:10
這裏有一個很好的關於索引視圖的文檔:http://msdn.microsoft.com/en-us/library/ms187864.aspx – 2011-01-19 16:04:31