2013-09-30 14 views
0

我有一個包含多個where子句的多個表的多個連接的情況。查看,索引視圖和連接查詢。對於多個連接,哪種性能更好?

一個簡單的視圖將始終運行select語句(這就是在任何情況下保存在數據庫中的內容),所以事後過濾數據看起來像是浪費時間。

索引視圖可以做同樣的事情,但也可以通過使用索引來加快速度。在MSDN,我們也讀到當在視圖中創建一個唯一的聚集索引,結果集存儲在數據庫就像一個表

多個連接將通過的where子句把正確的數據查詢,而不需要先把所有東西都帶進去,然後過濾它(簡單的視圖),也不需要在頻繁變化的數據上維護索引視圖的索引,但會導致更復雜的查詢。

這些連接涉及多達20個表(某些外部(2到4個)連接,因爲索引視圖不支持這些連接,所以需要以任意一種方式寫入),並且結果行數爲幾千(約2至4每個視圖中有100萬行)。

這是更多的設計問題,但在這種情況下最有效的(perfomrance-wise和storage wise)會是什麼?

P.S.每次在前端環境開發中寫這些查詢都很麻煩,這就是爲什麼我正在尋找另一種解決方案。

+5

「*一個簡單的視圖將始終運行select語句(即在任何情況下保存在數據庫中)*」不,這不是視圖的工作方式。視圖本身不做任何事情,也不存儲任何數據。一個View只是一個SQL查詢的別名。它只能用於引用它的其他查詢。發生這種情況時,查詢編譯器會將其與查詢的所有其他部分一起優化,包括任何'WHERE'子句或其他約束。通常情況下,這會導致在視圖結果添加到其他任何內容之前應用外部顯式WHERE子句。 – RBarryYoung

+0

謝謝你我不知道。我認爲它是一個嵌套查詢的別名。所以使用簡單視圖在效率方面沒有問題。但索引視圖更好嗎? –

回答

1

有關優化查詢性能的一些技巧。

編號1:儘可能使用過濾器,優化器將使用這些過濾器來限制它返回的數據(擁有100,000,000行表格,過濾器實際上可加速查看過程)。

數字2:隱式轉換:隱式轉換是您看不到從一種數據類型到另一種數據類型轉換的地方,但在幕後他們咀嚼了大量時間。來自遠程服務器的6,000,000行表。 2分鐘隱式轉換的查詢時間,隱式轉換後5秒鐘刪除(順便說一句日期時間<> smalldatetime)。編號3:使用執行計劃,它可以讓你知道你最大的CPU密集型操作在哪裏(這就是我如何定位Datetime - > Smalldatetime隱式轉換)。