2008-10-16 76 views
7

可能重複:
Are Stored Procedures more efficient, in general, than inline statements on modern RDBMS's?存儲過程更快的簡單查詢

如果我執行基本的查詢,如存儲過程:

SELECT ColA, ColB FROM MyTable WHERE ID = 123; 
SELECT * FROM MyTable,OtherTable WHERE MyTable.ID = OtherTable.ID ORDER BY CreatedAt desc 

有什麼如果它們頻繁運行,將這些查詢轉換爲存儲過程是否有益?什麼時候使用存儲的採購更好?我應該何時不是使用存儲過程?

創建和運行存儲過程時會發生什麼樣的優化(如果有)?您能否推薦任何資源來幫助我瞭解何時以及爲什麼要使用它們?

如果它有什麼不同,我的數據庫是MS SQL 2005 db。

回答

12

理由使用存儲過程:

  • 減少網絡流量 - 你必須在網絡上發送的SQL語句。使用sprocs,您可以批量執行SQL,這也更加高效。
  • 緩存查詢計劃 - 第一次執行sproc時,SQL Server創建一個執行計劃,該計劃被緩存以供重用。對於經常運行的小查詢來說,這是特別有效的。
  • 使用輸出參數的能力 - 如果發送返回一行的內聯SQL,則只能取回記錄集。使用sprocs,您可以將它們作爲輸出參數重新獲得,速度要快得多。
  • 權限 - 當您發送內嵌SQL,你必須在表(一個或多個)用戶,這是授予不僅僅是授予權限更加訪問以執行一個存儲過程
  • 分離邏輯的授予權限 - 刪除SQL生成代碼並將其分隔到數據庫中。
  • 無需重新編譯即可編輯 - 這可能會引起爭議。您可以在sproc中編輯SQL,而無需重新編譯應用程序。
  • 查找使用表的位置 - 使用sprocs時,如果要查找引用特定表的所有SQL語句,可以導出該sproc代碼並對其進行搜索。這比試圖在代碼中找到它容易得多。
  • 優化 - DBA在使用sprocs時優化SQL和調整數據庫更容易。找到缺失的索引等很容易。
  • SQL注入攻擊 - 正確寫入的內聯SQL可以抵禦攻擊,但sprocs更適合這種保護。
+0

優秀點。我特別希望更多的程序員能夠意識到,如果他們在表級別設置權限,他們如何能夠欺騙他們的數據庫。 – HLGEM 2008-10-16 15:59:32