為什么要用存儲過程

幾個去 IBM 面試的兄弟回來抱怨:去了好幾個不同的 IBM 項目組,幾乎每個面試官問到數據庫的時候都要問用沒用過存儲過程,煩人不?大家去面的程序員鳄哭,又不是 DBA,以前的項目都沒有用到存儲纲熏,不照樣運行的好好的妆丘?
存儲過程真的那么重要嗎,它到底有什么好處呢局劲?
筆者認為勺拣,存儲過程說白了就是一堆 SQL 的合并。中間加了點邏輯控制鱼填。
但是存儲過程處理比較復雜的業(yè)務時比較實用药有。比如說,一個復雜的數據操作。如果你在前臺處理的話愤惰∥可能會涉及到多次數據庫連接。但如果你用存儲過程的話宦言。就只有一次扇单。從響應時間上來說有優(yōu)勢。也就是說存儲過程可以給我們帶來運行效率提高的好處蜡励。另外令花,程序容易出現 BUG 不穩(wěn)定,而存儲過程凉倚,只要數據庫不出現問題,基本上是不會出現什么問題的嫂沉。也就是說從安全上講稽寒,使用了存儲過程的系統(tǒng)更加穩(wěn)定。
數據量小的趟章,或者和錢沒關系的項目不用存儲過程也可以正常運作杏糙。mysql 的存儲過程還有待實際測試。如果是正式項目蚓土,建議你用 sql server 或 oracle 的存儲過程宏侍。數據與數據之間打交道的話,過程會比程序來的快的多蜀漆。面試官問有沒有用存儲谅河,實際上就是想知道前來面試的程序員到底做過數據量大的項目沒。如果是培訓出來的确丢,或者小項目小公司出來的绷耍,對存儲肯定接觸的少了。
所以鲜侥,要想進大公司褂始,沒有豐富存儲過程經驗,是不行的描函。
那么什么時候才可以用存儲崎苗?對于數據量不是很大以及業(yè)務處理不是很復雜的小項目就無需要了么?錯舀寓。存儲過程不僅僅適用于大型項目胆数,對于中小型項目,使用存儲過程也是非常有必要的基公。其威力和優(yōu)勢主要體現在: 1.存儲過程只在創(chuàng)造時進行編譯幅慌,以后每次執(zhí)行存儲過程都不需再重新編譯,而一般 SQL 語句每執(zhí)行一次就編譯一次,所以使用存儲過程可提高數據庫執(zhí)行速度轰豆。 2.當對數據庫進行復雜操作時(如對多個表進行 Update,Insert,Query,Delete 時)胰伍,可將此復雜操作用存儲過程封裝起來與數據庫提供的事務處理結合一起使用齿诞。這些操作,如果用程序來完成骂租,就變成了一條條的 SQL 語句祷杈,可能要多次連接數據庫。而換成存儲渗饮,只需要連接一次數據庫就可以了但汞。 3.存儲過程可以重復使用,可減少數據庫開發(fā)人員的工作量。 4.安全性高,可設定只有某此用戶才具有對指定存儲過程的使用權互站。
本文來自CSDN博客私蕾,轉載請標明出處:http://blog.csdn.net/defonds/archive/2009/07/15/4349922.aspx

存儲過程的使用,好像一直是一個爭論胡桃。 我不傾向于盡可能使用存儲過程踩叭,是這么認為的: 1. 運行速度: 大多數高級的數據庫系統(tǒng)都有statement cache的,所以編譯sql的花費沒什么影響翠胰。但是執(zhí)行存儲過程要比直接執(zhí)行sql花費更多(檢查權限等)容贝,所以對于很簡單的sql,存儲過程沒有什么優(yōu)勢之景。 2. 網絡負荷:如果在存儲過程中沒有多次數據交互斤富,那么實際上網絡傳輸量和直接sql是一樣的。 3. 團隊開發(fā):很遺憾锻狗,比起成熟的IDE满力,沒有什么很好存儲過程的IDE工具來支持,也就是說屋谭,這些必須手工完成脚囊。 4. 安全機制:對于傳統(tǒng)的C/S結構,連接數據庫的用戶可以不同桐磁,所以安全機制有用悔耘;但是在web的三層架構中,數據庫用戶不是給用戶用的我擂,所以基本上衬以,只有一個用戶,擁有所有權限(最多還有一個開發(fā)用戶)校摩。這個時候看峻,安全機制有點多余。 5. 用戶滿意:實際上這個只是要將訪問數據庫的接口統(tǒng)一衙吩,是用存儲過程互妓,還是EJB,沒太大關系,也就是說冯勉,在三層結構中澈蚌,單獨設計出一個數據訪問層,同樣能實現這個目標灼狰。 6. 開發(fā)調試:一樣由于IDE的問題宛瞄,存儲過程的開發(fā)調試要比一般程序困難(老版本DB2還只能用C寫存儲過程,更是一個災難)交胚。 7. 移植性:算了份汗,這個不用提,反正一般的應用總是綁定某個數據庫的蝴簇,不然就無法靠優(yōu)化數據庫訪問來提高性能了杯活。 8. 維護性:的確,存儲過程有些時候比程序容易維護熬词,這是因為可以實時更新DB端的存儲過程轩猩,但是在3層結構下,更新server端的數據訪問層一樣能實現這個目標荡澎,可惜現在很多平臺不支持實時更新而已。 從上面可知道晤锹,存儲過程的使用不能有死規(guī)定(全用摩幔,或全不用),以前Terminal - Server, Client-DB的方式已經過時了鞭铆,存儲過程很多優(yōu)勢已經不明顯或衡。 現在,我認為的原則是:所有數據訪問在應用層封裝為數據訪問層车遂,在那里封断,如果SQL簡單的話,直接用SQL舶担;如果SQL復雜坡疼,或者數據交互多且中間數據最后不會用到,使用存儲過程衣陶。其他憑經驗吧柄瑰。
本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/zy1691/archive/2009/01/09/3742780.aspx

存儲過程是由一些SQL語句和控制語句組成的被封裝起來的過程剪况,它駐留在數據庫中教沾,可以被客戶應用程序調用,也可以從另一個過程或觸發(fā)器調用译断。它的參數可以被傳遞和返回授翻。與應用程序中的函數過程類似,存儲過程可以通過名字來調用,而且它們同樣有輸入參數和輸出參數堪唐。   根據返回值類型的不同巡语,我們可以將存儲過程分為三類:返回記錄集的存儲過程,返回數值的存儲過程(也可以稱為標量存儲過程)羔杨,以及行為存儲過程捌臊。顧名思義,返回記錄集的存儲過程的執(zhí)行結果是一個記錄集兜材,典型的例子是從數據庫中檢索出符合某一個或幾個條件的記錄理澎;返回數值的存儲過程執(zhí)行完以后返回一個值,例如在數據庫中執(zhí)行一個有返回值的函數或命令曙寡;最后糠爬,行為存儲過程僅僅是用來實現數據庫的某個功能,而沒有返回值举庶,例如在數據庫中的更新和刪除操作执隧。   使用存儲過程的好處   相對于直接使用SQL語句,在應用程序中直接調用存儲過程有以下好處:   (1)減少網絡通信量户侥。調用一個行數不多的存儲過程與直接調用SQL語句的網絡通信量可能不會有很大的差別镀琉,可是如果存儲過程包含上百行SQL語句,那么其性能絕對比一條一條的調用SQL語句要高得多蕊唐。   (2)執(zhí)行速度更快屋摔。有兩個原因:首先,在存儲過程創(chuàng)建的時候替梨,數據庫已經對其進行了一次解析和優(yōu)化钓试。其次,存儲過程一旦執(zhí)行副瀑,在內存中就會保留一份這個存儲過程弓熏,這樣下次再執(zhí)行同樣的存儲過程時,可以從內存中直接調用糠睡。   (3)更強的適應性:由于存儲過程對數據庫的訪問是通過存儲過程來進行的挽鞠,因此數據庫開發(fā)人員可以在不改動存儲過程接口的情況下對數據庫進行任何改動,而這些改動不會對應用程序造成影響铜幽。   (4) 布式工作:應用程序和數據庫的編碼工作可以分別獨立進行滞谢,而不會相互壓制。 優(yōu)點: 1.由于應用程序隨著時間推移會不斷更改除抛,增刪功能狮杨,T-SQL過程代碼會變得更復雜,StoredProcedure為封裝此代碼提供了一個替換位置到忽。 2.執(zhí)行計劃(存儲過程在首次運行時將被編譯橄教,這將產生一個執(zhí)行計劃-- 實際上是 Microsoft SQL Server為在存儲過程中獲取由 T-SQL 指定的結果而必須采取的步驟的記錄清寇。)緩存改善性能。 ........但sql server新版本护蝶,執(zhí)行計劃已針對所有 T-SQL 批處理進行了緩存华烟,而不管它們是否在存儲過程中,所以沒比較優(yōu)勢了持灰。 3.存儲過程可以用于降低網絡流量盔夜,存儲過程代碼直接存儲于數據庫中,所以不會產生大量T-sql語句的代碼流量堤魁。 4.使用存儲過程使您能夠增強對執(zhí)行計劃的重復使用喂链,由此可以通過使用遠程過程調用 (RPC) 處理服務器上的存儲過程而提高性能。RPC 封裝參數和調用服務器端過程的方式使引擎能夠輕松地找到匹配的執(zhí)行計劃妥泉,并只需插入更新的參數值椭微。 5.可維護性高,更新存儲過程通常比更改盲链、測試以及重新部署程序集需要較少的時間和精力蝇率。 6.代碼精簡一致,一個存儲過程可以用于應用程序代碼的不同位置刽沾。 7.更好的版本控制本慕,通過使用 Microsoft Visual SourceSafe 或某個其他源代碼控制工具,您可以輕松地恢復到或引用舊版本的存儲過程侧漓。 8.增強安全性: a间狂、通過向用戶授予對存儲過程(而不是基于表)的訪問權限,它們可以提供對特定數據的訪問火架; b、提高代碼安全忙菠,防止 SQL注入(但未徹底解決何鸡,例如,將數據操作語言--DML牛欢,附加到輸入參數)骡男; c、SqlParameter 類指定存儲過程參數的數據類型傍睹,作為深層次防御性策略的一部分隔盛,可以驗證用戶提供的值類型(但也不是萬無一失,還是應該傳遞至數據庫前得到附加驗證)拾稳。 缺點: 1.如果更改范圍大到需要對輸入存儲過程的參數進行更改吮炕,或者要更改由其返回的數據,則您仍需要更新程序集中的代碼以添加參數访得、更新 GetValue() 調用龙亲,等等陕凹,這時候估計比較繁瑣了。 2.可移植性差 由于存儲過程將應用程序綁定到 SQL Server鳄炉,因此使用存儲過程封裝業(yè)務邏輯將限制應用程序的可移植性杜耙。如果應用程序的可移植性在您的環(huán)境中非常重要,則將業(yè)務邏輯封裝在不特定于 RDBMS 的中間層中可能是一個更佳的選擇拂盯。 區(qū)別一佑女,存儲過程保存在數據庫里面,存儲過程可以被連接此數據庫的所有程序設計語言和程序使用谈竿,自定義函數不能团驱。 區(qū)別二,存儲過程可以有數據庫管理軟件修改榕订,使得多層結構程序調整系統(tǒng)邏輯時店茶,并不需要編譯和分發(fā)程序。 區(qū)別三劫恒,存儲過程執(zhí)行中贩幻,不會引起網絡流量,不占用程序服務器的內存和CPU資源两嘴。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末丛楚,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子憔辫,更是在濱河造成了極大的恐慌趣些,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贰您,死亡現場離奇詭異坏平,居然都是意外死亡,警方通過查閱死者的電腦和手機锦亦,發(fā)現死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門舶替,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人杠园,你說我怎么就攤上這事顾瞪。” “怎么了抛蚁?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵陈醒,是天一觀的道長。 經常有香客問我瞧甩,道長钉跷,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任肚逸,我火速辦了婚禮尘应,結果婚禮上惶凝,老公的妹妹穿的比我還像新娘。我一直安慰自己犬钢,他們只是感情好苍鲜,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著玷犹,像睡著了一般混滔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上歹颓,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天坯屿,我揣著相機與錄音,去河邊找鬼巍扛。 笑死领跛,一個胖子當著我的面吹牛,可吹牛的內容都是我干的撤奸。 我是一名探鬼主播吠昭,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼胧瓜!你這毒婦竟也來了矢棚?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤府喳,失蹤者是張志新(化名)和其女友劉穎蒲肋,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體钝满,經...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡兜粘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了弯蚜。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片妹沙。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖熟吏,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情玄窝,我是刑警寧澤牵寺,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站恩脂,受9級特大地震影響帽氓,放射性物質發(fā)生泄漏。R本人自食惡果不足惜俩块,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一黎休、第九天 我趴在偏房一處隱蔽的房頂上張望浓领。 院中可真熱鬧,春花似錦势腮、人聲如沸联贩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽泪幌。三九已至,卻和暖如春署照,著一層夾襖步出監(jiān)牢的瞬間祸泪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工建芙, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留没隘,地道東北人。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓禁荸,卻偏偏與公主長得像右蒲,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子屡限,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理品嚣,服務發(fā)現,斷路器钧大,智...
    卡卡羅2017閱讀 134,599評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,504評論 25 707
  • 1. Java基礎部分 基礎部分的順序:基本語法翰撑,類相關的語法,內部類的語法啊央,繼承相關的語法眶诈,異常的語法,線程的語...
    子非魚_t_閱讀 31,581評論 18 399
  • 有人說:“女人的衣柜里總缺那么一件瓜饥!” 可不是嗎逝撬?換季了,打開衣柜翻找秋裝乓土,怎么就沒有能穿的衣服呢宪潮? 和老公抱怨,...
    徍音_閱讀 818評論 2 0
  • 文/ 西風 探訪一鄉(xiāng)人支教團 雖然說趣苏,這天只是去探訪一鄉(xiāng)人支教團狡相,想必應該比較輕松。所以本想多睡會兒食磕,但爺爺還是...
    瞎比比閱讀 329評論 0 0