數(shù)據(jù)庫使用存儲過程的優(yōu)缺點

好多年不做服務(wù)器項目了,最近幾個項目均和服務(wù)器有關(guān),出現(xiàn)很多性能相關(guān)問題,其中一個項目涉及到這么一個業(yè)務(wù),拿出來和大家分享下。

????業(yè)務(wù)大致為:刷身份證過檢,設(shè)備端生成一個過檢記錄id,需要把身份證文字信息和身份證圖片信息分別上傳到服務(wù)器S1和圖片服務(wù)器S2,其中服務(wù)器數(shù)據(jù)庫中身份證圖片信息保存的是身份證照片在圖片服務(wù)S2上的url。

????如果強制必須文本信息在服務(wù)器S1上傳成功后,再上傳身份證圖片,勢必會影響圖片上傳時間。如果不做這個強制限制,上傳圖片url和文字信息入庫時間先后就不能確定,url數(shù)據(jù)和文字信息在服務(wù)器數(shù)據(jù)庫中是執(zhí)行insert還是update就無法確定了,此時就必須處理insert失敗返再重新進行update操作,這個時候可以考慮使用存儲過程了。

????在使用存儲過程的問題上,和服務(wù)器端研發(fā)進行討論決定是否使用存儲過程,所以使用與否我們需要了解下存儲過程的優(yōu)缺點。

  優(yōu)點:

  1. 運行速度:對于很簡單的sql,存儲過程沒有什么優(yōu)勢。對于復(fù)雜的業(yè)務(wù)邏輯,因為在存儲過程創(chuàng)建的時候,數(shù)據(jù)庫已經(jīng)對其進行了一次解析和優(yōu)化。存儲過程一旦執(zhí)行,在內(nèi)存中就會保留一份這個存儲過程,這樣下次再執(zhí)行同樣的存儲過程時,可以從內(nèi)存中直接調(diào)用,所以執(zhí)行速度會比普通sql快。? ??

  2. ?減少網(wǎng)絡(luò)傳輸:存儲過程直接就在數(shù)據(jù)庫服務(wù)器上跑,所有的數(shù)據(jù)訪問都在數(shù)據(jù)庫服務(wù)器內(nèi)部進行,不需要傳輸數(shù)據(jù)到其它服務(wù)器,所以會減少一定的網(wǎng)絡(luò)傳輸。

  3. 可維護性:存儲過程有些時候比程序更容易維護,這是因為可以實時更新DB端的存儲過程。??有些bug,直接改存儲過程里的業(yè)務(wù)邏輯,而不用修改程序端代碼。?

  4.?增強安全性:提高代碼安全,防止?SQL注入。這一點sql語句也可以做到。

  5.?可擴展性:應(yīng)用程序和數(shù)據(jù)庫操作分開,獨立進行,而不是相互在一起。方便以后的擴展和DBA維護優(yōu)化。

  缺點??:

   1.?SQL本身是一種結(jié)構(gòu)化查詢語言,但不是面向?qū)ο蟮牡?,本質(zhì)上還是過程化的語言,面對復(fù)雜的業(yè)務(wù)邏輯,過程化的處理會很吃力。同時SQL擅長的是數(shù)據(jù)查詢而非業(yè)務(wù)邏輯的處理,如果如果把業(yè)務(wù)邏輯全放在存儲過程里面,違背了這一原則。

?  2.?如果需要對輸入存儲過程的參數(shù)進行更改,或者要更改由其返回的數(shù)據(jù),則您仍需要更新程序集中的代碼以添加參數(shù)、更新調(diào)用,等等,這時候估計會比較繁瑣了。

?  3.?開發(fā)調(diào)試復(fù)雜,由于IDE的問題,存儲過程的開發(fā)調(diào)試要比一般程序困難,不過這個對于有數(shù)據(jù)庫功底的研發(fā)來說調(diào)試不是問題。?????

?  4.?沒辦法應(yīng)用緩存。雖然有全局臨時表之類的方法可以做緩存,但同樣加重了數(shù)據(jù)庫的負擔(dān)。如果緩存并發(fā)嚴重,經(jīng)常要加鎖,那效率實在堪憂。

  ?5. 不支持群集,數(shù)據(jù)庫服務(wù)器無法水平擴展,或者數(shù)據(jù)庫的切割(水平或垂直切割)。數(shù)據(jù)庫切割之后,存儲過程并不清楚數(shù)據(jù)存儲在哪個數(shù)據(jù)庫中。

總結(jié):

  ?1. 適當(dāng)?shù)氖褂么鎯^程,能夠提高服務(wù)器性能。

?  2.?存儲過程不應(yīng)該大規(guī)模使用,DBA應(yīng)該在設(shè)計與維護數(shù)據(jù)庫時需要均衡考慮。

  ?3. 隨著眾多ORM?的出現(xiàn),存儲過程很多優(yōu)勢已經(jīng)不明顯。

????????4. 結(jié)合項目業(yè)務(wù)實際,從業(yè)務(wù)邏輯簡單的數(shù)據(jù)庫操作不建議使用存儲過程,復(fù)雜對數(shù)據(jù)實時性要求比較高,可以考慮從存儲過程觸發(fā)器上進行設(shè)計優(yōu)化。

? ? ?回到我們的這個項目業(yè)務(wù)上看。使用與否也需要結(jié)合客戶是否對身份證圖片信息實時性是否要求很高。最后與項目產(chǎn)品經(jīng)理確認,身份證圖片信息可延遲離線上傳,那么完全可以不使用存儲過程了。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容