一、存儲過程
優點
1.運行速度:對于很簡單的sql,存儲過程沒有什么優勢。對于復雜的業務邏輯,因為在存儲過程創建的時候,數據庫已經對其進行了一次解析和優化。存儲過程一旦執行,在內存中就會保留一份這個存儲過程,這樣下次再執行同樣的存儲過程時,可以從內存中直接調用,所以執行速度會比普通sql快。? ??
2.減少網絡傳輸:存儲過程直接就在數據庫服務器上跑,所有的數據訪問都在數據庫服務器內部進行,不需要傳輸數據到其它服務器,所以會減少一定的網絡傳輸。但是在存儲過程中沒有多次數據交互,那么實際上網絡傳輸量和直接sql是一樣的。而且我們的應用服務器通常與數據庫是在同一內網,大數據的訪問的瓶頸會是硬盤的速度,而不是網速。
3. 可維護性:的存儲過程有些時候比程序更容易維護,這是因為可以實時更新DB端的存儲過程。??有些bug,直接改存儲過程里的業務邏輯,就搞定了。?
4.增強安全性:提高代碼安全,防止?SQL注入。這一點sql語句也可以做到。
5.可擴展性:應用程序和數據庫操作分開,獨立進行,而不是相互在一起。方便以后的擴展和DBA維護優化。
缺點??
1.SQL本身是一種結構化查詢語言,但不是面向對象的的,本質上還是過程化的語言,面對復雜的業務邏輯,過程化的處理會很吃力。同時SQL擅長的是數據查詢而非業務邏輯的處理,如果如果把業務邏輯全放在存儲過程里面,違背了這一原則。
2.如果需要對輸入存儲過程的參數進行更改,或者要更改由其返回的數據,則您仍需要更新程序集中的代碼以添加參數、更新調用,等等,這時候估計會比較繁瑣了。
3.開發調試復雜,由于IDE的問題,存儲過程的開發調試要比一般程序困難。?????
4.沒辦法應用緩存。雖然有全局臨時表之類的方法可以做緩存,但同樣加重了數據庫的負擔。如果緩存并發嚴重,經常要加鎖,那效率實在堪憂。
5.不支持群集,數據庫服務器無法水平擴展,或者數據庫的切割(水平或垂直切割)。數據庫切割之后,存儲過程并不清楚數據存儲在哪個數據庫中。
使用場景
存儲過程一定要看情況使用,用得好系統質量上個臺階,用不好等著刪庫跑路。多數人不愛用,除了因為互聯網業務簡單沒必要外,還因為mysql這方面實在太弱而且它太流行了(我見過許多有多年開發經驗的人沒聽說過PG,Oracle和MS SQL倒是聽過但太貴不值當。總之mysql讓他們錯過太多好東西)。
延伸閱讀:
二、什么是存儲過程
存儲過程,百度百科上是這樣解釋的,存儲過程(Stored Procedure)是在大型數據庫系統中,一組為了完成特定功能的SQL 語句集,存儲在數據庫中,經過名列前茅次編譯后再次調用不需要再次編譯,用戶通過指定存儲過程的名字并給出參數(如果該存儲過程帶有參數)來調用存儲過程。
簡單的說就是專門干一件事一段sql語句。可以由數據庫自己去調用,也可以由java程序去調用。在oracle數據庫中存儲過程是procedure。