如果我有一個包含數萬個多個位置帳戶記錄的表。SQL Server 2005視圖vs物化視圖vs存儲過程
如果我查詢選擇所有帳戶的特定位置和使用相同SQL語句的存儲過程的視圖,是否有速度差異?
編輯:我跑過這個物化視圖。這似乎總是會被使用。
什麼時候你想要使用存儲過程,視圖和物化視圖?做出這個決定時你想記住哪些利弊?
如果我有一個包含數萬個多個位置帳戶記錄的表。SQL Server 2005視圖vs物化視圖vs存儲過程
如果我查詢選擇所有帳戶的特定位置和使用相同SQL語句的存儲過程的視圖,是否有速度差異?
編輯:我跑過這個物化視圖。這似乎總是會被使用。
什麼時候你想要使用存儲過程,視圖和物化視圖?做出這個決定時你想記住哪些利弊?
簡短的回答:「這取決於」
較長的回答:「這取決於查詢的形狀」
與有關SQL Server性能的任何問題(什麼是更好的:X對y)沒有正確的答案。在查看與sprocs的情況下,沒有辦法可靠地預測哪個(如果有的話)會更快,而且不能分析查詢。
我已經看到兩者都會更快,並且這取決於如何使用視圖以及它是否是更大查詢的一部分。我還看到視圖緩慢查詢,因爲它們可以隱藏很多使用視圖的查詢實際上不需要的複雜性。你需要評估你試圖達到的目標:如果你所要做的只是想訪問表格行,而你不打算把輸出作爲另一個查詢的一部分, d選擇一個存儲過程,特別是如果針對該表的查詢將採用某個WHERE子句。
查詢將從哪裏被調用? SQL的另一部分?一些應用框架?自定義數據訪問層?值得思考調用代碼如何將查詢放在一起,因爲這會影響SQL Server如何緩存和重用執行計劃。如果它只是將一堆動態SQL捆綁在一起,那麼性能可能會受到一些影響,因爲SQL Server可能需要每次重新生成查詢計劃;因此在這種情況下,存儲緩存計劃的優勢在於存儲優勢。如果訪問層是智能的並且執行了參數化動態SQL,則可能沒有太多內容。
結論:明白你想達到的目標。然後輪廓,調整,調整,並重復,直到滿意。
是的,沒有。
視圖是一種查詢定義,在使用時基本上被原地替換,並被編譯到引用視圖的查詢中。這意味着實際執行取決於引用視圖的查詢。如果查詢是一個簡單的SELECT * FROM view
,那麼這將與等效過程幾乎完全相同的執行計劃。但是,如果查詢是SELECT onefield FROM view
的查詢是顯着不同。沒有等效的過程,並且由於投影列表縮減,此查詢可能會顯着改善。
也有巨大的可用性差異。存儲過程只能執行。可以從和中選擇一個視圖,與多個其他語句(如連接,子查詢等)一起使用。
鑑於視圖具有更好的靈活性,除非沒有其他因素髮揮作用,否則只有具有參數時過程纔有意義,因爲視圖不能有參數。
視圖和存儲過程都被編譯到數據庫中,因此它們比直接查詢更快,它們之間的速度差異在您需要具有動態參數時出現。意見只是不接受他們。
每個人都有他自己的具體用途。視圖可用於其他查詢或視圖,存儲過程只能執行。但在你的問題與相同的SELECT * FROM他們有完全相同的速度。
SQL Server中沒有「編譯到數據庫」。從視圖,過程和即席查詢的查詢在編譯計劃的速度,編譯和緩存方面都將完全相同,只要它們具有相同的相同定義即可。 – 2009-09-11 21:03:03
這個Post的anserws將提供SQL Server中索引(物化)視圖的有用背景。
我也看到每個人都比另一個快,取決於上下文。
我遵循的一般經驗法則是:如果視圖具有複雜的WHERE,取決於其他適度複雜的視圖或是UNION [ALL]的結果,那麼幾乎可以肯定SQL S將無法將適用於視圖的WHERE條件適當地傳播到各個表,因此在某一時刻,您將開始獲取表掃描(除非它是物化視圖),否則您的執行計劃將比執行計劃複雜得多他們可能是。
在這些情況下,最好選擇proc。正如其他人所說,永遠是個人資料!
如果您需要參數,但希望獲得視圖的其他優勢,例如「從多個其他語句(如連接...)中選擇並使用它們」,那麼應該考慮使用表值的用戶定義函數。 – 2009-09-14 04:09:44