定義:
預存程序(Stored Procedure )是一組為了完成特定功能的SQL 陳述式集,經編譯後儲存在資料庫中。使用者通過指定預存程序的名字並給出參數(如果該預存程序
帶有參數)來執行它。
預存程序是資料庫中的一個重要對象,任何一個設計良好的資料庫應用程式都應該用到預存程序。
預存程序是由流量控制和SQL 陳述式書寫的過程,這個過程經編譯和最佳化後儲存在資料庫伺服器中,應用程式使用時只要調用即可。
在Oracle 中,若干個有聯絡的過程可以組合在一起構成程式包。
優 點:
1. 預存程序只在創造時進行編譯,以後每次執行預存程序都不需再重新編譯,而一般SQL語句每執行一次就編譯一次,所以使用預存程序可提高資料庫執行速度。
2.當對資料庫進行複雜操作時(如對多個表進行Update、Insert、Query、Delete時),可將此複雜操作用預存程序封裝起來與資料庫提供的交易處理結合一起使用。
3.預存程序可以重複使用,可減少資料庫開發人員的工作量。
4.安全性高,可設定只有某使用者才具有對指定預存程序的使用權。
預存程序與函數的對比
預存程序的優缺點
優點:減少網路互動的成本。
缺點:
a、不可移植性,每種資料庫的內部編程文法都不太相同,當你的系統需要相容多種資料庫時,最好不要用預存程序。
b、學習成本高,DBA一般都擅長寫預存程序,但並不是每個程式員都能寫好預存程序,除非你的團隊有較多的開發人員熟悉寫預存程序,否則後期系統維護會產生問題。
c、商務邏輯多處存在,採用預存程序後也就意味著你的系統有一些商務邏輯不是在應用程式裡處理,這種架構會增加一些系統維護和調試成本。
d、預存程序和常用應用程式語言不一樣,它支援的函數及文法有可能不能滿足需求,有些邏輯就只能通過應用程式處理。
e、如果預存程序中有複雜運算的話,會增加一些資料庫服務端的處理成本,對於集中式資料庫可能會導致系統可擴充性問題。
f、為了提高效能,資料庫會把預存程序代碼編譯成中間運行代碼(類似於Java的class檔案),所以更像靜態語言。當預存程序引用的對像(表、視圖等等)結構改變後,
預存程序需要重新編譯才會生效,在24*7高並發應用情境,一般都是線上變更結構的,所以在變更的瞬間要同時編譯預存程序,這可能會導致資料庫瞬間壓力上升引起故障
(oracle資料庫就存在這樣的問題)。
本質上沒區別。只是函數有如:只能返回一個變數的限制。而預存程序可以返回多個。而函數是可以嵌入在sql中使用的,可以在select中調用,而預存程序不行。執行的本質都一樣。
函數限制比較多,比如不能用暫存資料表,只能用表變數.還有一些函數都不可用等等.而預存程序的限制相對就比較少
1. 一般來說,預存程序實現的功能要複雜一點,而函數的實現的功能針對性比較強。
2. 對於預存程序來說可以返回參數,而函數只能傳回值或者表對象。
3. 預存程序一般是作為一個獨立的部分來執行(EXEC執行),而函數可以作為查詢語句的一個部分來調用(SELECT調用),由於函數可以返回一個表對象,因此它可以在查詢語句中位於FROM關鍵字的後面。
4. 當預存程序和函數被執行的時候,SQL Manager會到procedure cache中去取相應的查詢語句,如果在procedure cache裡沒有相應的查詢語句,SQL Manager就會對預存程序和函數進行編譯。
Procedure cache中儲存的是執行計畫 (execution plan) ,當編譯好之後就執行procedure cache中的execution plan,之後SQL SERVER會根據每個execution plan的實際情況來考慮是否要在cache中儲存這個plan,評判的標準一個是這個execution plan可能被使用的頻率;其次是產生這個plan的代價,也就是編譯的耗時。儲存在cache中的plan在下次執行時就不用再編譯了。