2010-01-07 35 views
3

爲了提高查詢的性能,我創建了一個非規範化索引視圖,其中包含一些我需要報告的信息。當我沒有獲得我期望的性能增益時,我創建了一個帶有索引的表格版本,並且性能顯着提高。更好的SQL查詢性能使用實際非規格化表與索引而不是索引視圖?

我應該注意到,當我創建我的視圖時,SELECT中有很多ISNULL。我知道,如果這些列以常規觀點加入,這些會損害性能,但我的印象是,如果視圖被編入索引,則可以。 ISNULLs會成爲問題嗎?

回答

4

你是否索引了你實際選擇的列?如果您在查詢的索引視圖中沒有覆蓋索引,那麼您肯定會發現表格更快。不過,如果你這樣做,應該沒有真正的區別。例如:

CREATE VIEW dbo.denormalized 
WITH SCHEMABINDING 
AS 
    SELECT A.id, 
      A.col1, 
      A.col2, 
      ISNULL(B.col3, '') col3 
    FROM dbo.A LEFT JOIN dbo.B ON A.Bid = B.id 
GO 

CREATE UNIQUE CLUSTERED INDEX UIX_denormlaized 
ON dbo.denormalized (id) 

到目前爲止這麼好。現在,我們嘗試如下從該視圖中選擇:

SELECT id, col3 FROM denormalized 

唯一保留的數據爲這種觀點是對ID列的索引 - 其餘的必須是在飛行中鍛煉出來。所以ISNULL會再次爲每一行計算。但是,如果我們這個指數增加:

CREATE INDEX IX_denormalized 
ON dbo.denormalized (id, col3) 

那麼相同的查詢從持久指數完全服務 - 更快,其實相當的性能從表中進行選擇。

+0

表格和視圖是彼此精確匹配的。索引和所有。性能應該不一樣嗎? – 2010-01-07 17:36:46

+0

否請參閱上面的示例。 – 2010-01-07 17:40:21

+0

非常好的解釋。謝謝! – 2010-01-07 17:59:46

1

什麼是SQL Server SKU?只有企業版考慮查詢計劃中的索引視圖。除非選擇來自視圖並使用NOEXPAND提示,否則標準版不會考慮索引視圖。

更新

因爲我已經有兩個意見表明這是有用的知道,我鏈接相關MSDN頁面Resolving Indexes on Views

索引視圖可以在任何 版的創建SQL Server。在SQL Server 企業版中,查詢優化器 會自動考慮索引爲 的視圖。要在所有 其他版本中使用索引視圖,必須使用NOEXPAND表 提示。

+0

這是EE。儘管如此,很高興知道NOEXPAND提示。 – 2010-01-07 18:04:00

+0

+1:非常有趣的知道 – 2010-01-08 02:43:25