我正在使用SQL Server 2005數據庫,並且我的應用程序位於ASP.NET MVC4中。 應用程序的業務邏輯有點複雜,包含多個表連接和搜索條件。在極端條件下,我需要加入大約10個表格來獲取單個網格所需的數據。 我想知道我是否應該使用SP或Linq到SQL應用程序代碼來最大化我的應用程序性能。根據性能比較Linq to SQL和存儲過程
回答
您通常會在存儲過程中發現更快的性能,因爲存儲過程將盡可能重新使用執行計劃。 Linq查詢基本上成爲針對數據庫的即席查詢,每次都將未緩存作爲新請求處理。
SQL服務器基本上會經過以下步驟執行任何查詢(存儲過程調用或即席SQL語句):如果這沒關係
- 語法檢查查詢
- - 它會檢查計劃緩存以查看它是否已經有針對該查詢的執行計劃
- 如果存在執行計劃 - 該計劃被(重新)使用並且執行查詢
- 如果還沒有計劃,則確定執行計劃
- 該計劃被存儲到計劃緩存以備後用
- 執行查詢
的一點是:即席SQL和存儲過程處理無異。
如果一個特設的SQL查詢是否已正確使用參數 - 因爲它應該無論如何,以防止SQL注入攻擊 - 其性能特點是沒有什麼不同和最肯定不超過執行一個存儲過程更糟。
存儲過程有其他的好處(無需授予用戶直接訪問表,例如),但在性能方面,採用適當的參數化即席SQL查詢是一樣高效如使用存儲過程。
更新:使用存儲過程過非參數化查詢是更好的原因主要有兩個:
,因爲每一個非參數化查詢是新的,不同的查詢到SQL Server,它必須經歷確定每個查詢的執行計劃的所有步驟(從而浪費時間 - 並且浪費計劃緩存空間,因爲將執行計劃存儲到計劃緩存中並不真的有助於最終,因爲該特定查詢可能會而不是來
非參數化查詢是在SQL注入攻擊的風險,應不惜一切代價避免再次執行)
+1的偉大的總結。如果您預計許多具有不同參數的linq查詢,並且您擁有SQL2k8或更高版本,請考慮針對特定工作負載優化您的服務器(http://msdn.microsoft.com/zh-cn/library/cc645587.aspx)。 – 2014-11-04 06:13:30
您忘記了1和2之間的參數嗅探步驟。另請注意,即席查詢必須完全相同,包括參數名稱和大小,才能在緩存中找到。 varchar參數上的'.AddWithValue'將大量使用緩存。 – adrianm 2014-11-04 07:01:32
@adrianm:是的,好點 - 完全同意,臨時查詢必須完全一樣 - 到每個空格和逗號和分號 - 不只是「相似」.... – 2014-11-04 07:20:39
- 1. SQL Server存儲過程和Linq-to-SQL
- 2. 存儲過程性能比較
- 3. 性能的LINQ VS SQL存儲過程
- 4. F#Linq to sql - 調用存儲過程
- 5. LINQ to SQL - 嵌套存儲過程
- 6. LINQ to SQL:存儲過程結果
- 7. ASP.Net MVC3 - Linq to SQL或存儲過程?
- 8. 比較存儲過程性能ex和新版本
- 9. SQL存儲過程比較值
- 10. LINQ to SQL + SQLite.NET +存儲過程+ VISUAL STUDIO 2008可能嗎?
- 11. LINQ to SQL存儲庫 - 緩存數據
- 12. Linq to SQL存儲屬性問題
- 13. Linq to SQL錯誤SQL不比較Xml?
- 14. LINQ To SQL - SQL性能差
- 15. MySQL性能:視圖與功能與存儲過程的比較
- 16. 的LINQ to SQL和存儲過程返回類型
- 17. Linq to Sql和T-SQL性能差異
- 18. LINQ to SQL和存儲庫模式
- 19. LINQ to sql在ms sql 2005中製作存儲過程嗎?
- 20. LINQ to SQL調用使用動態SQL的存儲過程
- 21. 在SQL Server存儲過程中使用LINQ to SQL結果
- 22. LINQ to SQL多對多比較查詢
- 23. Linq to SQL - 左加入>比較
- 24. 動態比較LINQ to sql的時間
- 25. 的LINQ to SQL比較時只
- 26. LINQ基本性能比較
- 27. 用存儲過程LINQ to DATASET更新
- 28. LINQ to Entities而不是存儲過程?
- 29. Linq to SQL循環性能
- 30. LINQ to SQL表級性能
任何適當的設計和參數化「即席」 SQL查詢將使用**完全相同的重用執行計劃 - 使用存儲過程絕對**沒有性能優勢**! (這是一個非常長久的神話 - 但它只是一個神話,它不是真實的!)而不是:存儲過程***不是***預編譯 - 他們經歷了**完全相同的過程任何即時查詢當第一次執行..... – 2014-11-04 05:52:37
如果您假設緩存命中率是相同的,這完全正確,這取決於您的服務器如何針對臨時工作負載進行優化(默認情況下)。 – 2014-11-04 06:02:40
另外,通過擁有大量獨立的Linq查詢,您可以輕鬆地生成大量一次性執行計劃,這些計劃會再次浪費緩存中的空間,除非您的服務器針對臨時工作負載進行了優化。 – 2014-11-04 06:10:28