2012-09-14 79 views
2

我的視圖命名爲「Ge_Entry」運行速度非常慢,因此希望使用select distinct語句創建索引視圖,但sql server不允許它。如何使用sql 2005中的select distinct語句創建索引視圖

所以我想知道有沒有什麼辦法用s.dist語句創建i.view。

因此,我可以在此視圖上創建索引以獲得快速結果。

感謝名單

尼爾

+0

不,你不能使用DISTINCT。是否有一些列或列的組合可以應用某些條件來產生您感興趣的行? –

回答

16

您不能使用不同。但是你可以使用COUNT_BIG(*)GROUP BY,可能是:

CREATE VIEW v1 
WITH SCHEMABINDING 
AS 
    SELECT ColumnA,ColumnB,COUNT_BIG(*) as Cnt 
    FROM BaseTable 
    GROUP BY ColumnA,ColumnB 
GO 
CREATE UNIQUE CLUSTERED INDEX IX_v1 ON v1 (ColumnA,ColumnB) 
GO 

而是創建索引視圖的DISTINCT ColumnA,ColumnB


大多數規則似與維護索引的效率。想象一下,你有一個基表,內容如下:

ID  ColumnA  ColumnB 
1   abc   def 
2   abc   def 
3   ghi   jkl 

允許創建基於上不同的純粹你的看法。現在,您從表格中刪除ID 2的行。 SQL Server是否應該從視圖的索引中刪除行abc,def?它只能通過再次掃描整個基表來找出。

將此與我上面的視圖定義進行對比。這裏的視圖中的數據是什麼樣子:

ColumnA  ColumnB  Cnt 
abc   def   2 
abc   def   1 

如果刪除ID 2從基表中的行,SQL Server可以從Cnt列減去1行abc,def。如果該列的新值是0,它知道它應該從索引中刪除該行。相反,如果值爲>0,那麼它知道基表中仍存在此值的行。

+0

達米恩,很多thanx您的廣泛答覆,我明白,索引視圖不支持選擇不同的聲明,實際上查看「Ge_Entry」包含很多意見。所以我要求創建索引視圖 – Kamal

+0

@Kamal - 是我的解決方案(而不是使用'DISTINCT',在所有列上使用'GROUP BY')適合您,還是有問題? (不知道你的評論) –