1. 程式人生 > >深入了解oracle存儲過程的優缺點

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

提高 書寫 大量 procedure 損壞 t-sql語句 輸入 數列 重新編譯

定義:

存儲過程(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請另行查詢

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

  技術分享圖片

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

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

存儲過程與函數的對比

技術分享圖片

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