2012-02-08 135 views
11

我想在SQL Server中創建一個索引視圖,我想知道如果我需要索引視圖列。SQL Server索引視圖

我這樣問,因爲視圖是由已經有索引列的表組成的。

所以,如果TABLE1已列FOO已經索引作爲一個非聚集索引,我必須爲列FOO添加一個索引來爲SQL Server使用索引新創建的看法?

或者SQL Server知道在搜索視圖時使用TABLE1中的索引嗎?

的看法是這樣的

CREATE VIEW [dbo].[v_eventActivity] 
WITH SCHEMABINDING 
AS 
    SELECT ea.id, 
     e.eventID, 
     e.name, 
     ea.userID, 
     ea.activityTypeID, 
     ea.timeStamp, 
     ea.visitDuration 
    FROM dbo.table1 e, 
     dbo.table2 ea 
    WHERE e.eventID = ea.eventID 

我要在所有這些列的搜索在一起。

如前所述,table1和table2都已經有了索引的列。

+0

我想我知道這個問題的答案,但在寫它確定,其實我不知道。好Q!知道的最好方法可能是嘗試一下並看看。你也應該指定什麼SS版本。 – JNK 2012-02-08 18:42:12

+0

通常,索引視圖不表示整個表格,因此在特定列上表示索引通常沒有意義。你有沒有創建視圖?你可以分享表格結構,你正在談論的索引以及視圖的定義(包括它的索引)嗎? – 2012-02-08 18:44:27

+0

我確實嘗試過。查詢執行計劃表示它確實使用原始表的索引。但我只是想確定一下。 – KDV 2012-02-08 18:44:48

回答

4

SQL Server中的索引視圖幾乎沒有區別,在別處稱爲物化視圖。如果您的視圖具有使用在基表上定義的索引的基礎查詢,則視圖上的選擇也將使用該索引,這不是索引視圖所關注的內容。

如果您經常使用視圖並且性能很重要,您可以選擇放棄更多的磁盤空間(和cpu時間)並在視圖上創建唯一的聚集索引,從而實現對視圖的更快查詢,因爲SQL Server不必返回到基表或表,並從視圖的索引獲取所需的所有內容。

看一看here

+1

如果它已經是索引視圖,則不能在視圖上添加唯一的聚簇索引。這就是索引視圖的定義(除非唯一的聚集索引已經存在,否則不能在視圖上創建非唯一索引或非聚集索引)。 – 2012-02-08 18:55:11

+1

@AaronBertrand:視圖必須沒有事先索引,我不暗示它有!表格可能有索引。 – Mithrandir 2012-02-08 18:57:50

+1

我讀它的方式,你的描述應該像你應該添加一個獨特的聚集索引到索引視圖。 – 2012-02-08 19:00:17

7

除非提供NOEXPAND提示(文檔here),否則視圖將簡單地使用表索引。

可以按如下自己測試:

CREATE TABLE [test].[TestTable] (
    id INT IDENTITY PRIMARY KEY, 
    foo INT 
) 

CREATE NONCLUSTERED INDEX ixFoo 
ON [test].[TestTable] (foo) 

CREATE VIEW [test].[TestTableView] WITH SCHEMABINDING 
AS 
    SELECT 
     t.id, 
     t.foo 
    FROM [test].[TestTable] t 
GO 

CREATE UNIQUE CLUSTERED INDEX ixFooId 
ON [test].[TestTableView] (id) 

CREATE NONCLUSTERED INDEX ixFooView 
ON [test].[TestTableView] (foo) 

下面是三個單獨的查詢執行計劃:

SELECT 
    t.[id], 
    t.[foo] 
FROM [test].[TestTable] t 
ORDER BY t.[foo] 

The table query execution plan

SELECT 
    v.[id], 
    v.[foo] 
FROM [test].[TestTableView] v 
ORDER BY v.[foo] 

The view with no hint

SELECT 
    v.[id], 
    v.[foo] 
FROM [test].[TestTableView] v WITH (NOEXPAND) 
ORDER BY v.[foo] 

The view with the NOEXPAND hint