存儲過程到底有什麼用?

最近有個朋友在研究存儲過程的事兒。看著他在那裡糾結,突然想問下存儲過程到底有用么?

bing了一下,在一些解釋中:

1、存儲過程集合了sql語句並且緩存,大大提高語言執行效率

2、增加安全性

3、保證原子性

對這些東西有些疑問:

1、據說現在sql語句也會進行緩存,是否提高效率,提高多少效率還真不好說

2、安全性為什麼要寫在資料庫裡面,不是應該在程序裡面就保證好了么

3、原子性的東西也可以在程序裡面實現,為什麼不?

總之,感覺存儲過程就是把資料庫訪問的邏輯與程序分離而放在資料庫上,這到底是為了什麼。


存儲過程能盡量發揮一個資料庫軟體(伺服器)的性能。多數情況下從多個表裡整合數據並下發到應用程序中(或者是內存變數)需要更大的帶寬和運算。存儲過程減少了這種壓力。同時對於應用程序來說,存儲過程減少了應用程序對於表的直接操作,當業務發生變化,例如SQL語句的優化、業務變更都可以在資料庫層面進行解決,減少了開發難度。


以我在做的項目來看,軟體的是用java寫的,但是處理能力很一般,開發是腦殘,寫出來的程序塞滿bug,一天打四個補丁也解決不了問題,基本就是個廢物。

計算的工作都交給了存儲過程,然後每次計算時調取存儲過程。

基本的參數存在配置表裡,存儲過程只需要用shell調取,取配置表的參數就好了。

這樣交給java的主要工作就是修改配置表,剛招進來的開發,sql寫增改查刪就已經很難了。

確實可以提高效率,具體要看dba優化sql的能力。

安全性涉及到sql注入,寫死存儲過程會有些幫助。

原子性肯定不如存儲過程高,一般執行存儲過程時會鎖表。

其實,用存儲過程本質就是把處理數據的工作全部交給資料庫,把數據和程序分離開來,這樣不管你程序怎麼改也不會改動數據。

版本控制的話,一般都是直接注掉舊的邏輯,加入新的邏輯。


優點是大數據量的情況下提高計算效率,缺點是存儲過程與系統代碼分離,有時可能隨手一動存儲過程,造成與代碼的不一致,不好進行版本控制。


推薦閱讀:

[跟吉姆一起讀LevelDB]3.Memory Barrier與leveldb::DB::Open操作(2)
阿里雲Elasticsearch的X-Pack:機器學習、安全保障和可視化
[MySQL]獵聘網數據分析職位數據清洗
如何用R訪問MySQL資料庫
[跟吉姆一起讀LevelDB]5.資料庫恢復(2)

TAG:資料庫 | 存儲過程 | 數據存儲技術 |