存儲過程的優缺點

爲什麼要用存儲過程

幾個去 IBM 面試的兄弟回來抱怨:去了好幾個不同的 IBM 項目組,幾乎每個面試官問到數據庫的時候都要問用沒用過存儲過程,煩人不?大家去面的程序員,又不是 DBA,以前的項目都沒有用到存儲,不照樣運行的好好的?
存儲過程真的那麼重要嗎,它到底有什麼好處呢?
筆者認爲,存儲過程說白了就是一堆 SQL 的合併。中間加了點邏輯控制。
但是存儲過程處理比較複雜的業務時比較實用。
比如說,一個複雜的數據操作。如果你在前臺處理的話。可能會涉及到多次數據庫連接。但如果你用存儲過程的話。就只有一次。從響應時間上來說有優勢。
也就是說存儲過程可以給我們帶來運行效率提高的好處。
另外,程序容易出現 BUG 不穩定,而存儲過程,只要數據庫不出現問題,基本上是不會出現什麼問題的。也就是說從安全上講,使用了存儲過程的系統更加穩定。
數據量小的,或者和錢沒關係的項目不用存儲過程也可以正常運作。mysql 的存儲過程還有待實際測試。如果是正式項目,建議你用 sql server 或 oracle 的存儲過程。數據與數據之間打交道的話,過程會比程序來的快的多。面試官問有沒有用存儲,實際上就是想知道前來面試的程序員到底做過數據量大的項目沒。如果是培訓出來的,或者小項目小公司出來的,對存儲肯定接觸的少了。
所以,要想進大公司,沒有豐富存儲過程經驗,是不行的。

那麼什麼時候纔可以用存儲?對於數據量不是很大以及業務處理不是很複雜的小項目就無需要了麼?

錯。存儲過程不僅僅適用於大型項目,對於中小型項目,使用存儲過程也是非常有必要的。其威力和優勢主要體現在:
1.存儲過程只在創造時進行編譯,以後每次執行存儲過程都不需再重新編譯,而一般 SQL 語句每執行一次就編譯一次,所以使用存儲過程可提高數據庫執行速度。
2.當對數據庫進行復雜操作時(如對多個表進行 Update,Insert,Query,Delete 時),可將此複雜操作用存儲過程封裝起來與數據庫提供的事務處理結合一起使用。這些操作,如果用程序來完成,就變成了一條條的 SQL 語句,可能要多次連接數據庫。而換成存儲,只需要連接一次數據庫就可以了。
3.存儲過程可以重複使用,可減少數據庫開發人員的工作量。
4.安全性高,可設定只有某此用戶才具有對指定存儲過程的使用權。
存儲過程的使用,好像一直是一個爭論。
我不傾向於儘可能使用存儲過程,是這麼認爲的:
1. 運行速度: 大多數高級的數據庫系統都有statement cache的,所以編譯sql的花費沒什麼影響。但是執行存儲過程要比直接執行sql花費更多(檢查權限等),所以對於很簡單的sql,存儲過程沒有什麼優勢。
2. 網絡負荷:如果在存儲過程中沒有多次數據交互,那麼實際上網絡傳輸量和直接sql是一樣的。
3. 團隊開發:很遺憾,比起成熟的IDE,沒有什麼很好存儲過程的IDE工具來支持,也就是說,這些必須手工完成。
4. 安全機制:對於傳統的C/S結構,連接數據庫的用戶可以不同,所以安全機制有用;但是在web的三層架構中,數據庫用戶不是給用戶用的,所以基本上,只有一個用戶,擁有所有權限(最多還有一個開發用戶)。這個時候,安全機制有點多餘。
5. 用戶滿意:實際上這個只是要將訪問數據庫的接口統一,是用存儲過程,還是EJB,沒太大關係,也就是說,在三層結構中,單獨設計出一個數據訪問層,同樣能實現這個目標。
6. 開發調試:一樣由於IDE的問題,存儲過程的開發調試要比一般程序困難(老版本DB2還只能用C寫存儲過程,更是一個災難)。
7. 移植性:算了,這個不用提,反正一般的應用總是綁定某個數據庫的,不然就無法靠優化數據庫訪問來提高性能了。
8. 維護性:的確,存儲過程有些時候比程序容易維護,這是因爲可以實時更新DB端的存儲過程,但是在3層結構下,更新server端的數據訪問層一樣能實現這個目標,可惜現在很多平臺不支持實時更新而已。

從上面可知道,存儲過程的使用不能有死規定(全用,或全不用),以前Terminal - Server, Client-DB的方式已經過時了,存儲過程很多優勢已經不明顯。
現在,我認爲的原則是:所有數據訪問在應用層封裝爲數據訪問層,在那裏,如果SQL簡單的話,直接用SQL;如果SQL複雜,或者數據交互多且中間數據最後不會用到,使用存儲過程。其他憑經驗吧。
本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/zy1691/archive/2009/01/09/3742780.aspx
存儲過程是由一些SQL語句和控制語句組成的被封裝起來的過程,它駐留在數據庫中,可以被客戶應用程序調用,也可以從另一個過程或觸發器調用。它的參數可以被傳遞和返回。與應用程序中的函數過程類似,存儲過程可以通過名字來調用,而且它們同樣有輸入參數和輸出參數。

  根據返回值類型的不同,我們可以將存儲過程分爲三類:返回記錄集的存儲過程,返回數值的存儲過程(也可以稱爲標量存儲過程),以及行爲存儲過程。顧名思義,返回記錄集的存儲過程的執行結果是一個記錄集,典型的例子是從數據庫中檢索出符合某一個或幾個條件的記錄;返回數值的存儲過程執行完以後返回一個值,例如在數據庫中執行一個有返回值的函數或命令;最後,行爲存儲過程僅僅是用來實現數據庫的某個功能,而沒有返回值,例如在數據庫中的更新和刪除操作。

  使用存儲過程的好處

  相對於直接使用SQL語句,在應用程序中直接調用存儲過程有以下好處:

  (1)減少網絡通信量。調用一個行數不多的存儲過程與直接調用SQL語句的網絡通信量可能不會有很大的差別,可是如果存儲過程包含上百行SQL語句,那麼其性能絕對比一條一條的調用SQL語句要高得多。

  (2)執行速度更快。有兩個原因:首先,在存儲過程創建的時候,數據庫已經對其進行了一次解析和優化。其次,存儲過程一旦執行,在內存中就會保留一份這個存儲過程,這樣下次再執行同樣的存儲過程時,可以從內存中直接調用。

  (3)更強的適應性:由於存儲過程對數據庫的訪問是通過存儲過程來進行的,因此數據庫開發人員可以在不改動存儲過程接口的情況下對數據庫進行任何改動,而這些改動不會對應用程序造成影響。

  (4) 布式工作:應用程序和數據庫的編碼工作可以分別獨立進行,而不會相互壓制。

優點:
1.由於應用程序隨着時間推移會不斷更改,增刪功能,T-SQL過程代碼會變得更復雜,StoredProcedure爲封裝此代碼提供了一個替換位置。

2.執行計劃(存儲過程在首次運行時將被編譯,這將產生一個執行計劃-- 實際上是 Microsoft SQL Server爲在存儲過程中獲取由 T-SQL 指定的結果而必須採取的步驟的記錄。)緩存改善性能。
……..但sql server新版本,執行計劃已針對所有 T-SQL 批處理進行了緩存,而不管它們是否在存儲過程中,所以沒比較優勢了。

3.存儲過程可以用於降低網絡流量,存儲過程代碼直接存儲於數據庫中,所以不會產生大量T-sql語句的代碼流量。

4.使用存儲過程使您能夠增強對執行計劃的重複使用,由此可以通過使用遠程過程調用 (RPC) 處理服務器上的存儲過程而提高性能。RPC 封裝參數和調用服務器端過程的方式使引擎能夠輕鬆地找到匹配的執行計劃,並只需插入更新的參數值。

5.可維護性高,更新存儲過程通常比更改、測試以及重新部署程序集需要較少的時間和精力。

6.代碼精簡一致,一個存儲過程可以用於應用程序代碼的不同位置。

7.更好的版本控制,通過使用 Microsoft Visual SourceSafe 或某個其他源代碼控制工具,您可以輕鬆地恢復到或引用舊版本的存儲過程。

8.增強安全性:
a、通過向用戶授予對存儲過程(而不是基於表)的訪問權限,它們可以提供對特定數據的訪問;
b、提高代碼安全,防止 SQL注入(但未徹底解決,例如,將數據操作語言--DML,附加到輸入參數);
c、SqlParameter 類指定存儲過程參數的數據類型,作爲深層次防禦性策略的一部分,可以驗證用戶提供的值類型(但也不是萬無一失,還是應該傳遞至數據庫前得到附加驗證)。

缺點:

1.如果更改範圍大到需要對輸入存儲過程的參數進行更改,或者要更改由其返回的數據,則您仍需要更新程序集中的代碼以添加參數、更新 GetValue() 調用,等等,這時候估計比較繁瑣了。

2.可移植性差

由於存儲過程將應用程序綁定到 SQL Server,因此使用存儲過程封裝業務邏輯將限制應用程序的可移植性。如果應用程序的可移植性在您的環境中非常重要,則將業務邏輯封裝在不特定於 RDBMS 的中間層中可能是一個更佳的選擇。

區別一,存儲過程保存在數據庫裏面,存儲過程可以被連接此數據庫的所有程序設計語言和程序使用,自定義函數不能。

區別二,存儲過程可以有數據庫管理軟件修改,使得多層結構程序調整系統邏輯時,並不需要編譯和分發程序。

區別三,存儲過程執行中,不會引起網絡流量,不佔用程序服務器的內存和CPU資源。

發佈了19 篇原創文章 · 獲贊 8 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章