爲了提高查詢的性能,我創建了一個非規範化索引視圖,其中包含一些我需要報告的信息。當我沒有獲得我期望的性能增益時,我創建了一個帶有索引的表格版本,並且性能顯着提高。更好的SQL查詢性能使用實際非規格化表與索引而不是索引視圖?
我應該注意到,當我創建我的視圖時,SELECT中有很多ISNULL。我知道,如果這些列以常規觀點加入,這些會損害性能,但我的印象是,如果視圖被編入索引,則可以。 ISNULLs會成爲問題嗎?
爲了提高查詢的性能,我創建了一個非規範化索引視圖,其中包含一些我需要報告的信息。當我沒有獲得我期望的性能增益時,我創建了一個帶有索引的表格版本,並且性能顯着提高。更好的SQL查詢性能使用實際非規格化表與索引而不是索引視圖?
我應該注意到,當我創建我的視圖時,SELECT中有很多ISNULL。我知道,如果這些列以常規觀點加入,這些會損害性能,但我的印象是,如果視圖被編入索引,則可以。 ISNULLs會成爲問題嗎?
你是否索引了你實際選擇的列?如果您在查詢的索引視圖中沒有覆蓋索引,那麼您肯定會發現表格更快。不過,如果你這樣做,應該沒有真正的區別。例如:
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)
那麼相同的查詢從持久指數完全服務 - 更快,其實相當的性能從表中進行選擇。
什麼是SQL Server SKU?只有企業版考慮查詢計劃中的索引視圖。除非選擇來自視圖並使用NOEXPAND提示,否則標準版不會考慮索引視圖。
更新
因爲我已經有兩個意見表明這是有用的知道,我鏈接相關MSDN頁面Resolving Indexes on Views:
索引視圖可以在任何 版的創建SQL Server。在SQL Server 企業版中,查詢優化器 會自動考慮索引爲 的視圖。要在所有 其他版本中使用索引視圖,必須使用NOEXPAND表 提示。
這是EE。儘管如此,很高興知道NOEXPAND提示。 – 2010-01-07 18:04:00
+1:非常有趣的知道 – 2010-01-08 02:43:25
表格和視圖是彼此精確匹配的。索引和所有。性能應該不一樣嗎? – 2010-01-07 17:36:46
否請參閱上面的示例。 – 2010-01-07 17:40:21
非常好的解釋。謝謝! – 2010-01-07 17:59:46