2011-01-19 32 views
36

Microsoft SQL Server允許您爲視圖添加索引,但您爲什麼要這麼做?爲什麼你想要在視圖上放置索引?

我的理解是,一個觀點是實際上只是一個子查詢,也就是說,如果我說SELECT * FROM MyView的,我真的說SELECT * FROM(MyView的的查詢)

好像對標的指標表格將是最重要的表格。那麼爲什麼你要在視圖上有一個單獨的索引?

回答

32

如果視圖被編入索引,那麼任何可以使用索引回答的查詢都不需要引用基礎表。這可以導致性能的巨大提高。

實質上,數據庫引擎在更新基礎表時維護查詢的「已解決」版本(或更確切地說,查詢的索引),然後在可能的情況下使用該已解決的版本而不是原始表。

Database Journal中有一個很好的article

+0

我剛剛嘗試向某人解釋此事。 – msarchet 2011-01-19 16:03:10

+0

這裏有一個很好的關於索引視圖的文檔:http://msdn.microsoft.com/en-us/library/ms187864.aspx – 2011-01-19 16:04:31

0

您在視圖上創建索引出於同樣的原因爲在基表:提高對這一觀點的查詢的性能。這樣做的另一個原因是實現一些獨特性約束,你不能對基表實現。不幸的是,SQL Server不允許在視圖上創建約束。

4

Microsoft SQL Server允許您爲視圖添加索引,但爲什麼要這樣做呢?

加快查詢速度。

我的理解是,一個觀點是實際上只是一個子查詢,即,如果我說SELECT * FROM MyView的,我真的說SELECT * FROM(MyView的的查詢)

並非總是如此。

通過在視圖上創建聚簇索引,可以實現視圖,並更新基礎表,從而實際更新視圖。針對此視圖的查詢可能訪問或不訪問基礎表。

並非所有視圖都可以編入索引。

舉例來說,如果你是在一個視圖中使用GROUP BY,因爲它是可轉位則應該包含COUNT_BIG和所有聚合函數應該分佈在UNION ALL(僅SUMCOUNT_BIG其實都是)。這是索引需要維護的必要條件,對基礎表的更新可以及時更新視圖。

相關問題