日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

存储过程的优缺点 (转载)

發(fā)布時間:2023/11/27 生活经验 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 存储过程的优缺点 (转载) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

為什么要用存儲過程

?

幾個去 IBM 面試的兄弟回來抱怨:去了好幾個不同的 IBM 項目組,幾乎每個面試官問到數(shù)據(jù)庫的時候都要問用沒用過存儲過程,煩人不?大家去面的程序員,又不是 DBA,以前的項目都沒有用到存儲,不照樣運行的好好的?

存儲過程真的那么重要嗎,它到底有什么好處呢?

筆者認為,存儲過程說白了就是一堆 SQL 的合并。中間加了點邏輯控制。

但是存儲過程處理比較復雜的業(yè)務時比較實用。
比如說,一個復雜的數(shù)據(jù)操作。如果你在前臺處理的話。可能會涉及到多次數(shù)據(jù)庫連接。但如果你用存儲過程的話。就只有一次。從響應時間上來說有優(yōu)勢。
也就是說存儲過程可以給我們帶來運行效率提高的好處。
另外,程序容易出現(xiàn) BUG 不穩(wěn)定,而存儲過程,只要數(shù)據(jù)庫不出現(xiàn)問題,基本上是不會出現(xiàn)什么問題的。也就是說從安全上講,使用了存儲過程的系統(tǒng)更加穩(wěn)定。

數(shù)據(jù)量小的,或者和錢沒關系的項目不用存儲過程也可以正常運作。MySQL 的存儲過程還有待實際測試。如果是正式項目,建議你用 sql server 或 Oracle 的存儲過程。數(shù)據(jù)與數(shù)據(jù)之間打交道的話,過程會比程序來的快的多。面試官問有沒有用存儲,實際上就是想知道前來面試的程序員到底做過數(shù)據(jù)量大的項目沒。如果是培訓出來的,或者小項目小公司出來的,對存儲肯定接觸的少了。

所以,要想進大公司,沒有豐富存儲過程經(jīng)驗,是不行的。

那么什么時候才可以用存儲?對于數(shù)據(jù)量不是很大以及業(yè)務處理不是很復雜的小項目就無需要了么?
錯。存儲過程不僅僅適用于大型項目,對于中小型項目,使用存儲過程也是非常有必要的。其威力和優(yōu)勢主要體現(xiàn)在:
? 1.存儲過程只在創(chuàng)造時進行編譯,以后每次執(zhí)行存儲過程都不需再重新編譯,而一般 SQL 語句每執(zhí)行一次就編譯一次,所以使用存儲過程可提高數(shù)據(jù)庫執(zhí)行速度。
? 2.當對數(shù)據(jù)庫進行復雜操作時(如對多個表進行 Update,Insert,Query,Delete 時),可將此復雜操作用存儲過程封裝起來與數(shù)據(jù)庫提供的事務處理結合一起使用。這些操作,如果用程序來完成,就變成了一條條的 SQL 語句,可能要多次連接數(shù)據(jù)庫。而換成存儲,只需要連接一次數(shù)據(jù)庫就可以了。
? 3.存儲過程可以重復使用,可減少數(shù)據(jù)庫開發(fā)人員的工作量。
? 4.安全性高,可設定只有某此用戶才具有對指定存儲過程的使用權。

?

存儲過程的使用,好像一直是一個爭論。????
? 我不傾向于盡可能使用存儲過程,是這么認為的:????
? 1.?? 運行速度:?? 大多數(shù)高級的數(shù)據(jù)庫系統(tǒng)都有statement?? cache的,所以編譯sql的花費沒什么影響。但是執(zhí)行存儲過程要比直接執(zhí)行sql花費更多(檢查權限等),所以對于很簡單的sql,存儲過程沒有什么優(yōu)勢。????
? 2.?? 網(wǎng)絡負荷:如果在存儲過程中沒有多次數(shù)據(jù)交互,那么實際上網(wǎng)絡傳輸量和直接sql是一樣的。????
? 3.?? 團隊開發(fā):很遺憾,比起成熟的IDE,沒有什么很好存儲過程的IDE工具來支持,也就是說,這些必須手工完成。????
? 4.?? 安全機制:對于傳統(tǒng)的C/S結構,連接數(shù)據(jù)庫的用戶可以不同,所以安全機制有用;但是在web的三層架構中,數(shù)據(jù)庫用戶不是給用戶用的,所以基本上,只有一個用戶,擁有所有權限(最多還有一個開發(fā)用戶)。這個時候,安全機制有點多余。????
? 5.?? 用戶滿意:實際上這個只是要將訪問數(shù)據(jù)庫的接口統(tǒng)一,是用存儲過程,還是EJB,沒太大關系,也就是說,在三層結構中,單獨設計出一個數(shù)據(jù)訪問層,同樣能實現(xiàn)這個目標。????
? 6.?? 開發(fā)調(diào)試:一樣由于IDE的問題,存儲過程的開發(fā)調(diào)試要比一般程序困難(老版本DB2還只能用C寫存儲過程,更是一個災難)。????
? 7.?? 移植性:算了,這個不用提,反正一般的應用總是綁定某個數(shù)據(jù)庫的,不然就無法靠優(yōu)化數(shù)據(jù)庫訪問來提高性能了。????
? 8.?? 維護性:的確,存儲過程有些時候比程序容易維護,這是因為可以實時更新DB端的存儲過程,但是在3層結構下,更新server端的數(shù)據(jù)訪問層一樣能實現(xiàn)這個目標,可惜現(xiàn)在很多平臺不支持實時更新而已。????
???
? 從上面可知道,存儲過程的使用不能有死規(guī)定(全用,或全不用),以前Terminal?? -?? Server,?? Client-DB的方式已經(jīng)過時了,存儲過程很多優(yōu)勢已經(jīng)不明顯。????
? 現(xiàn)在,我認為的原則是:所有數(shù)據(jù)訪問在應用層封裝為數(shù)據(jù)訪問層,在那里,如果SQL簡單的話,直接用SQL;如果SQL復雜,或者數(shù)據(jù)交互多且中間數(shù)據(jù)最后不會用到,使用存儲過程。其他憑經(jīng)驗吧。

?

存儲過程是由一些SQL語句和控制語句組成的被封裝起來的過程,它駐留在數(shù)據(jù)庫中,可以被客戶應用程序調(diào)用,也可以從另一個過程或觸發(fā)器調(diào)用。它的參數(shù)可以被傳遞和返回。與應用程序中的函數(shù)過程類似,存儲過程可以通過名字來調(diào)用,而且它們同樣有輸入?yún)?shù)和輸出參數(shù)。

  根據(jù)返回值類型的不同,我們可以將存儲過程分為三類:返回記錄集的存儲過程,返回數(shù)值的存儲過程(也可以稱為標量存儲過程),以及行為存儲過程。顧名思義,返回記錄集的存儲過程的執(zhí)行結果是一個記錄集,典型的例子是從數(shù)據(jù)庫中檢索出符合某一個或幾個條件的記錄;返回數(shù)值的存儲過程執(zhí)行完以后返回一個值,例如在數(shù)據(jù)庫中執(zhí)行一個有返回值的函數(shù)或命令;最后,行為存儲過程僅僅是用來實現(xiàn)數(shù)據(jù)庫的某個功能,而沒有返回值,例如在數(shù)據(jù)庫中的更新和刪除操作。

  使用存儲過程的好處

  相對于直接使用SQL語句,在應用程序中直接調(diào)用存儲過程有以下好處:

  (1)減少網(wǎng)絡通信量。調(diào)用一個行數(shù)不多的存儲過程與直接調(diào)用SQL語句的網(wǎng)絡通信量可能不會有很大的差別,可是如果存儲過程包含上百行SQL語句,那么其性能絕對比一條一條的調(diào)用SQL語句要高得多。

  (2)執(zhí)行速度更快。有兩個原因:首先,在存儲過程創(chuàng)建的時候,數(shù)據(jù)庫已經(jīng)對其進行了一次解析和優(yōu)化。其次,存儲過程一旦執(zhí)行,在內(nèi)存中就會保留一份這個存儲過程,這樣下次再執(zhí)行同樣的存儲過程時,可以從內(nèi)存中直接調(diào)用。

  (3)更強的適應性:由于存儲過程對數(shù)據(jù)庫的訪問是通過存儲過程來進行的,因此數(shù)據(jù)庫開發(fā)人員可以在不改動存儲過程接口的情況下對數(shù)據(jù)庫進行任何改動,而這些改動不會對應用程序造成影響。

  (4) 布式工作:應用程序和數(shù)據(jù)庫的編碼工作可以分別獨立進行,而不會相互壓制。

優(yōu)點:
1.由于應用程序隨著時間推移會不斷更改,增刪功能,T-SQL過程代碼會變得更復雜,StoredProcedure為封裝此代碼提供了一個替換位置。

2.執(zhí)行計劃(存儲過程在首次運行時將被編譯,這將產(chǎn)生一個執(zhí)行計劃-- 實際上是 Microsoft SQL Server為在存儲過程中獲取由 T-SQL 指定的結果而必須采取的步驟的記錄。)緩存改善性能。
........但sql server新版本,執(zhí)行計劃已針對所有 T-SQL 批處理進行了緩存,而不管它們是否在存儲過程中,所以沒比較優(yōu)勢了。

3.存儲過程可以用于降低網(wǎng)絡流量,存儲過程代碼直接存儲于數(shù)據(jù)庫中,所以不會產(chǎn)生大量T-sql語句的代碼流量。

4.使用存儲過程使您能夠增強對執(zhí)行計劃的重復使用,由此可以通過使用遠程過程調(diào)用 (RPC) 處理服務器上的存儲過程而提高性能。RPC 封裝參數(shù)和調(diào)用服務器端過程的方式使引擎能夠輕松地找到匹配的執(zhí)行計劃,并只需插入更新的參數(shù)值。

5.可維護性高,更新存儲過程通常比更改、測試以及重新部署程序集需要較少的時間和精力。

6.代碼精簡一致,一個存儲過程可以用于應用程序代碼的不同位置。

7.更好的版本控制,通過使用 Microsoft Visual SourceSafe 或某個其他源代碼控制工具,您可以輕松地恢復到或引用舊版本的存儲過程。

8.增強安全性:
a、通過向用戶授予對存儲過程(而不是基于表)的訪問權限,它們可以提供對特定數(shù)據(jù)的訪問;
b、提高代碼安全,防止 SQL注入(但未徹底解決,例如,將數(shù)據(jù)操作語言--DML,附加到輸入?yún)?shù));
c、SqlParameter 類指定存儲過程參數(shù)的數(shù)據(jù)類型,作為深層次防御性策略的一部分,可以驗證用戶提供的值類型(但也不是萬無一失,還是應該傳遞至數(shù)據(jù)庫前得到附加驗證)。



缺點:

1.如果更改范圍大到需要對輸入存儲過程的參數(shù)進行更改,或者要更改由其返回的數(shù)據(jù),則您仍需要更新程序集中的代碼以添加參數(shù)、更新 GetValue() 調(diào)用,等等,這時候估計比較繁瑣了。

2.可移植性差

由于存儲過程將應用程序綁定到 SQL Server,因此使用存儲過程封裝業(yè)務邏輯將限制應用程序的可移植性。如果應用程序的可移植性在您的環(huán)境中非常重要,則將業(yè)務邏輯封裝在不特定于 RDBMS 的中間層中可能是一個更佳的選擇。


區(qū)別一,存儲過程保存在數(shù)據(jù)庫里面,存儲過程可以被連接此數(shù)據(jù)庫的所有程序設計語言和程序使用,自定義函數(shù)不能。

區(qū)別二,存儲過程可以有數(shù)據(jù)庫管理軟件修改,使得多層結構程序調(diào)整系統(tǒng)邏輯時,并不需要編譯和分發(fā)程序。

區(qū)別三,存儲過程執(zhí)行中,不會引起網(wǎng)絡流量,不占用程序服務器的內(nèi)存和CPU資源。

本文來自CSDN博客,原文地址:http://blog.csdn.NET/defonds/archive/2009/07/15/4349922.aspx

轉載于:https://www.cnblogs.com/littlewu/p/5949127.html

總結

以上是生活随笔為你收集整理的存储过程的优缺点 (转载)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。