幾個去 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資源两嘴。