聊聊儲存過程的使用,你學會了嗎?

受到網路企業的影響,這些年在企業級應用開發中,預存程序的使用受到了一定的限制,甚至有些企業明確在IT技術應用規範中停用預存程序。實際上在二十多年前,使用預存程序是Oracle資料庫優化中的一個十分重要的技術手段,對於處理批量業務處理十分有幫助。因為當時的資料庫CPU、記憶體、IO資源都相對緊張,網路的頻寬與延遲也存在著許多瓶頸。使用預存程序可以將一些工作封裝在一個資料庫的內部執行單元中,減少前台進程與RDBMS核心的交互,從而獲得更高的效率。基於此,目前還有不少銀行還在大量使用預存程序。

二十年前,華為的一個專案組為了實現應用程式與資料庫無關,對應用程式進行改造的時候去掉了所有的儲存過程,上線後發現改造後的應用效能下降十分嚴重。我幫助分析後發現因為資料庫與應用程式模組跨資料中心部署,因此SQL在網路上的交互延時嚴重影響了效能。因此在當時的條件下,他們很難放棄預存程序,為此他們最終放棄了多資料庫支援而選擇了迴歸預存程序。

這些年隨著網路企業在IT上的成功,許多企業也在學習網路架構。大量的應用不再使用預存程序,應用的業務邏輯更多地被從資料庫中抽取出來,放到應用系統中。應用程式對資料庫的依賴就降低了,應用在不同品種的資料庫之中的遷移也變得簡單了。同時因為業務邏輯更遷移到應用程式伺服器上,資料庫伺服器的資源消耗也下降了,資料庫伺服器的瓶頸也得到了緩解。於是這些年應用去儲存過程在許多企業裡熱門起來,儲存過程的使用也大幅下降了。

不過也有一些企業發現,去掉儲存過程,將業務邏輯放到應用中去之後,應用的品質管控變得更加困難了。以前在一個研發隊伍中開發儲存過程的都是對業務邏輯理解十分深刻,資料庫功底比較好的老鳥,這些人寫出的儲存過程雖然複雜,不過品質還是槓槓的。就算存在一些問題,優化起來只要集中精力去優化PL/SQL的程式碼就可以了。而現在業務邏輯分散到應用程式中,由水平差異較大的開發人員去開發,應用的品質變得更難控制了,優化的難度也變大了。

實際上絕大多數傳統行業企業是缺乏互聯網基因的,互聯網企業與傳統企業最大的區別是在IT上的投入的區別。網路企業能把所有邏輯放到應用程式上,並不是網路企業的架構有多優秀,而是網路企業能夠在IT上投入大量資金,由大量優秀的開發人員來完成這項工作。而傳統產業企業的IT投入與網路企業無法相比,IT員工薪資收入低很多,IT部門人員的素質也肯定遠低於網路企業。在這種情況下,研發團隊往往是難以駕馭好網路架構的應用的。

企業級關係型資料庫都有預存程序這個功能,這個功能就是為了簡化應用開發難度,提升應用效率的。在應用中使用預存程序是可以降低應用軟體開發與維護成本,提高系統中批量處理業務的性能的。近來企業應用程式中使用較少除了受到網路企業的引導之外,還有一個因素是減少對某個資料庫的依賴。其實在前幾年去IOE的過程中,很多企業已經感受到了資料庫遷移帶來的痛苦,以及被Oracle資料庫綁定後不斷上升的資料庫使用成本的困擾。

當年許多企業決定借鏡網路架構的另一個原因是因為許多應用開發以資料庫為核心,而資料庫在橫向擴充方面的能力不足,因此資料庫往往會成為應用系統中最大的瓶頸。與其擴容昂貴的小型機,不如將部分應用負載轉移到相對便宜、比較容易橫向擴展的應用伺服器上。

有些企業在應用架構轉型中獲得了成功,不過很多企業轉型後雖然解決了資料庫伺服器瓶頸的問題,但是遇到了新的挑戰-應用開發的成本太高了。與傳統的IOE架構相比,現在的應用架構中引進了太多複雜的元件,應用開發成本增加,開發週期變長,運維難度也大幅上升。有些企業甚至已經在反思是否每個系統都需要採用如此複雜的架構。

在資料庫國產化替代的今天,我看到了一個十分有趣的現象,那就是國產資料庫大多數都提供了比較好的Oracle PL/SQL的兼容支援。而且大多數國產資料庫支援的PL/SQL語法肯定都不全面,不過因為PL/SQL中較為容易實現的部分都被國產資料庫所支援了,所以目前國產資料庫的PL/SQL語法反而是比較接近的。在國產資料庫之間遷移PL/SQL預存程序的難度很低。使用國產資料庫後,如果想要換另一個國產資料庫,基本上可以平替。

前幾天和一個國產數據庫廠商談到這方面的問題的時候,突然想到,國產數據庫時代,是不是可以回歸大量使用存儲過程,從而降低應用研發與應用維護的成本呢?似乎這是可行的,當年JAVA剛剛流行,替代C的時候就是如此。因為儲存過程這個大殺器的存在,讓企業使用熟悉業務邏輯與資料庫架構的高手將核心業務邏輯封裝在儲存過程中,再安排大量技術水平一般的JAVA程式設計師去解決前端應用易用性的問題,從而讓資訊系統開發的門檻一下子降低了幾個數量級。

已經脫離開發多年了,不太清楚目前應用架構師關注的是什麼。當我做應用架構師的時候,總是在追求化繁為簡,盡可能讓第一線開發人員變成工具人,而似乎現在的風向有些變化,應用開發已經變得相當複雜了。而讓部分企業級應用回歸到以資料庫為核心,對於國產資料庫而言也是一個巨大的挑戰,只有國產資料庫真的能打了,這個願望才能實現。不過對於企業級應用而言,適當回歸預存程序的使用,可能能夠解決目前的一些問題。

今天就聊到這裡吧,明天我們來分析分析,國產資料庫的PL/SQL相容能力,需要在哪些地方發力,或是使用者選用資料庫的時候從哪些角度來看預存程序的相容性。