1. 程式人生 > >儲存過程的優缺點

儲存過程的優缺點

儲存過程是由一些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資源。