2009-11-12 69 views
14

有人可以用簡單的英語向我解釋視圖上的索引是如何工作的嗎?我對錶格上的索引有一個相當簡單的理解;如何索引一個視圖的工作方式不同於讓底層表上的索引自然而然地完成它們的工作?索引如何在視圖上工作?

回答

8

假設你有限制表中某些行一個觀點:

create view dbo.vw_HotProducts 
as 
select * from dbo.Products where Hot = 1 

現在,如果你對這個觀點創建索引,該指數只包含熱門產品。您可以將其與將視圖結果存儲在臨時表中進行比較。這對於具有多個連接的複雜查詢可能非常有用;基本上他們的輸出被緩存。

索引視圖的最大的缺點是它們被重新創建每次基礎表中數據的變化。這將索引視圖的使用限制在不經常更改的數據上,通常在數據倉庫或商業智能環境中使用。

+0

我們可以創建基於視(非鍵)列的索引? – 2009-11-12 11:06:13

+0

@Q8-編碼器:視圖上的索引必須是聚簇且唯一的。所以你可以選擇一個非鍵列,只要它在視圖結果中唯一標識一行 – Andomar 2009-11-12 11:16:01

+2

@Andomar:在任何數據改變時重新創建索引視圖是不正確的。 SQL Server將修改實例化視圖以反映對基表的任何更改。這就是爲什麼SQL Server對可以實現哪些視圖設置太多限制:幾個聚合,沒有外部連接,沒有聯合,沒有自連接等。當然,它只能通過INSERT/DELETE修改數據,而不是更新。但是我已經看到了在連接百萬行表的OLTP應用程序中成功使用的索引視圖。 YMMV – Tadmas 2009-11-12 13:38:16

5

http://msdn.microsoft.com/en-us/library/aa258260(SQL.80).aspx

在 視圖創建唯一聚集索引提高查詢性能 因爲視圖存儲在數據庫 以同樣的方式與 表中的聚簇索引存儲。

該視圖是從適當的視圖到一個表變換。視圖定義用於更新此表。

甲骨文稱這些「物化視圖」。

+2

並且由於索引視圖現在確實是一個系統維護的表,因此還可以在其上創建其他非聚集索引。 – 2009-11-12 11:18:44

+0

Both:您*可以* *在視圖上創建NC索引。我這樣做。 – gbn 2009-11-12 13:13:29

+0

看起來你創建的第一個索引必須是唯一的,並且要聚集來定義緩存表。額外的索引可以是非唯一的,就像marc_s說的那樣! – Andomar 2009-11-12 13:18:07

6

本身的視圖不實或「堅持」,且沒有性能優勢。它只是一個宏觀that's expanded.

添加一個索引,它實際存在(堅持),所以優化器會考慮使用它。那不是宏。

我敢肯定,甲骨文稱他們爲「物化視圖」,這是一個更好的名字。

一個FYI相關:計算列有做同樣的事情一個持久選項...

+0

僅供參考 - 謝謝 – 2009-11-12 14:02:31