2014-11-04 52 views
0

我正在使用SQL Server 2005數據庫,並且我的應用程序位於ASP.NET MVC4中。 應用程序的業務邏輯有點複雜,包含多個表連接和搜索條件。在極端條件下,我需要加入大約10個表格來獲取單個網格所需的數據。 我想知道我是否應該使用SP或Linq到SQL應用程序代碼來最大化我的應用程序性能。根據性能比較Linq to SQL和存儲過程

回答

0

您通常會在存儲過程中發現更快的性能,因爲存儲過程將盡可能重新使用執行計劃。 Linq查詢基本上成爲針對數據庫的即席查詢,每次都將未緩存作爲新請求處理。

+0

任何適當的設計和參數化「即席」 SQL查詢將使用**完全相同的重用執行計劃 - 使用存儲過程絕對**沒有性能優勢**! (這是一個非常長久的神話 - 但它只是一個神話,它不是真實的!)而不是:存儲過程***不是***預編譯 - 他們經歷了**完全相同的過程任何即時查詢當第一次執行..... – 2014-11-04 05:52:37

+0

如果您假設緩存命中率是相同的,這完全正確,這取決於您的服務器如何針對臨時工作負載進行優化(默認情況下)。 – 2014-11-04 06:02:40

+0

另外,通過擁有大量獨立的Linq查詢,您可以輕鬆地生成大量一次性執行計劃,這些計劃會再次浪費緩存中的空間,除非您的服務器針對臨時工作負載進行了優化。 – 2014-11-04 06:10:28

3

SQL服務器基本上會經過以下步驟執行任何查詢(存儲過程調用或即席SQL語句):如果這沒關係

  1. 語法檢查查詢
  2. - 它會檢查計劃緩存以查看它是否已經有針對該查詢的執行計劃
  3. 如果存在執行計劃 - 該計劃被(重新)使用並且執行查詢
  4. 如果還沒有計劃,則確定執行計劃
  5. 該計劃被存儲到計劃緩存以備後用
  6. 執行查詢

的一點是:即席SQL和存儲過程處理無異

如果一個特設的SQL查詢是否已正確使用參數 - 因爲它應該無論如何,以防止SQL注入攻擊 - 其性能特點是沒有什麼不同和最肯定不超過執行一個存儲過程更糟

存儲過程有其他的好處(無需授予用戶直接訪問表,例如),但在性能方面,採用適當的參數化即席SQL查詢是一樣高效如使用存儲過程。

更新:使用存儲過程非參數化查詢是更好的原因主要有兩個:

  • ,因爲每一個非參數化查詢是新的,不同的查詢到SQL Server,它必須經歷確定每個查詢的執行計劃的所有步驟(從而浪費時間 - 並且浪費計劃緩存空間,因爲將執行計劃存儲到計劃緩存中並不真的有助於最終,因爲該特定查詢可能會而不是

  • 非參數化查詢是在SQL注入攻擊的風險,應不惜一切代價避免再次執行)

+2

+1的偉大的總結。如果您預計許多具有不同參數的linq查詢,並且您擁有SQL2k8或更高版本,請考慮針對特定工作負載優化您的服務器(http://msdn.microsoft.com/zh-cn/library/cc645587.aspx)。 – 2014-11-04 06:13:30

+0

您忘記了1和2之間的參數嗅探步驟。另請注意,即席查詢必須完全相同,包括參數名稱和大小,才能在緩存中找到。 varchar參數上的'.AddWithValue'將大量使用緩存。 – adrianm 2014-11-04 07:01:32

+0

@adrianm:是的,好點 - 完全同意,臨時查詢必須完全一樣 - 到每個空格和逗號和分號 - 不只是「相似」.... – 2014-11-04 07:20:39