深入了解oracle存儲過程的優缺點


定義:

存儲過程(Stored Procedure )是一組為了完成特定功能的SQL 語句集,經編譯后存儲在數據庫中。用戶通過指定存儲過程的名字並給出參數(如果該存儲過程帶有參數)來執行它。存儲過程是數據庫中的一個重要對象,任何一個設計良好的數據庫應用程序都應該用到存儲過程。 存儲過程是由流控制和SQL 語句書寫的過程,這個過程經編譯和優化后存儲在數據庫服務器中,應用程序使用時只要調用即可。在Oracle 中,若干個有聯系的過程可以組合在一起構成程序包。

優 點:

 

1.存儲過程可以使得程序執行效率更高、安全性更好,因為過程建立之后 已經編譯並且儲存到數據庫,直接寫sql就需要先分析再執行因此過程效率更高,直接寫sql語句會帶來安全性問題,如:sql注入 。存儲過程只在創造時進行編譯,以后每次執行存儲過程都不需再重新編譯,而一般SQL語句每執行一次就編譯一次,所以使用存儲過程可提高數據庫執行速度。

 

2.建立過程不會很耗系統資源,因為過程只是在調用才執行。

 

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

 

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

 

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

 

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

 

7.增強安全性:

a、通過向用戶授予對存儲過程(而不是基於表)的訪問權限,它們可以提供對特定數據的訪問;

b、提高代碼安全,防止 SQL注入(但未徹底解決,例如,將數據操作語言--DML,附加到輸入參數);

c、SqlParameter 類指定存儲過程參數的數據類型,作為深層次防御性策略的一部分,可以驗證用戶提供的值類型(但也不是萬無一失,還是應該傳遞至數據庫前得到附加驗證)。

 

 

 

  • 可以封裝數據邏輯和業務規則,以便用戶可以僅通過開發人員和數據庫管理員打算使用的方式訪問數據和對象。
  • 驗證所有用戶輸入的參數化存儲過程可用於阻止 SQL 注入攻擊。 如果使用動態 SQL,請確保將命令參數化,並絕對不能將參數值直接包括在查詢字符串中。
  • 可禁止即席查詢和數據修改。 這樣將阻止用戶惡意或無意中損壞數據或執行查詢,以避免降低服務器或網絡的性能。
  • 可以在過程代碼中處理錯誤,而無需將錯誤直接傳遞給客戶端應用程序。 這樣可防止返回錯誤消息,以避免其可能有助於探測攻擊。 在服務器上記錄錯誤並對其進行處理。
  • 存儲過程只能編寫一次,可由很多應用程序訪問。
  • 客戶端應用程序不需要知道有關基礎數據結構的任何信息。 只要更改不影響參數列表或返回的數據類型,就可以更改存儲過程代碼,而無需在客戶端應用程序中進行更改。
  • 存儲過程可通過將多個操作組合到一個過程調用中來減少網絡通訊。
  • 安全性好—可以訪問執行存儲過程而不必擁有直接操作基礎表的權限
  • 減少網絡通信流—存儲過程可以包含多條SQL語句,但只要用一條語句來執行該存儲過程,從而減少了客戶端應用程序對服務器的調用次數和長度
  • 快速執行—存儲過程在第一次執行時進行語法檢查和編譯,編譯好的版本存儲在高速緩存中,用於再次調用
  • 保證一致性—如果用戶只通過存儲過程修改數據,則可以消除偶然修改帶來的問題減少操作人員和編程人員的錯誤—由於傳遞信息少,因此執行復雜任務更容易,不易出現SQL錯誤

 

缺點:

考慮移植性,存儲過程的致命傷
        如果一個系統過多的使用了存儲過程,那系統的業務邏輯過於依賴數據庫,這樣就會給系統額外的增加一層數據庫中的業務邏輯層,如果開發的時候用的sql server,后來發現數據量過大,需要提高性能移植到oracle或者mysql,這樣就會很麻煩,相當於把存儲過程重寫一遍,這是不能忍受的。我們平時在做項目的時候,往往一個功能在客戶端實現起來很費勁,在服務端很容易就可以實現,這樣好多人就會選擇在服務端做,卻為以后留下隱患。在分析項目的需求的時候,一定要考慮性能問題,多久有可能會升級, 如果數據量很小,幾十年用sql server都沒問題,那就可以多用存儲過程;但是數據量有可能會逐漸累積成千萬條甚至更多,就不得不考慮系統的可移植性,這時候盡量不要用存儲過程,全部代碼控制。
 
存儲過程的代碼可復用性差。
        面向對象的思維在存儲過程這毫無用武之地,兩個很相似的功能在也需要兩個存儲過程,因為他們是互相獨立的,可以互相調用,但是不能繼承等面向對象的操作,這也就增加了代碼量。

 

 

 借用SQL SERVER的存儲過程示意圖來表達一下,理解一下概念就好,具體到Oracle請另行查詢

 存儲過程的運行示意圖如下:

  

  首先運行CREATE PROC過程。這回解析查詢以確保會實際運行這些代碼。它與直接運行腳本的區別在於CREATE PROC命令可以利用所謂的延遲名稱解析。延遲名稱解析可以忽略一些對象還不存在的事實。

  在創建了存儲過程后,它將等待第一次執行。在那時,存儲過程被優化,而查詢計划被編譯並且緩存到系統上。后續幾次運行該存儲過程時,除非通過使用WITH RECOMPILE選項指定,否則都會使用緩存的查詢計划而不是創建一個新的查詢計划。這意味着每次使用該存儲過程時,存儲過程都會跳過很多優化和編譯工作。節省的確切時間取決於批處理的復雜性,批處理中表的大小,以及每個表上索引的數量。通常,節省的時間不是很多。但對於大多數場景來說可能是1秒或更少-但通過百分比可以計算出此區別(1秒比2秒快了100%)。當需要進行多次調用時或針對循環的情況,這一區別會變得更明顯。

 

 

存儲過程與函數的對比

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM