存儲過程與SQL語句如何選擇


58到家數據庫30條軍規,有一條是“禁止使用存儲過程、視圖、觸發器、Event”,

高並發大數據的互聯網業務,架構設計思路是“解放數據庫CPU,將計算轉移到服務層”,

並發量大的情況下,這些功能很可能將數據庫拖死,業務邏輯放到服務層具備更好的擴展性,能夠輕易實現“增機器就加性能”。

數據庫擅長存儲與索引,在目前的互聯網系統架構中,服務器的擴展要比存儲的擴展更簡單,

需要考慮系統可能的瓶頸在服務器還是數據存儲,存儲過程有它的優點,應該在開發中合理的選用。

 

應用存儲過程的優點

存儲過程是一組預先創建並用指定的名稱存儲在數據庫服務器上的 SQL 語句,將使用比較頻繁或者比較復雜的操作,預先用 SQL 語句寫好並存儲起來,以后當需要數據庫提供相同的服務時,只需再次執行該存儲過程。

1.具有更好的性能

存儲過程是預編譯的,只在創建時進行編譯,以后每次執行存儲過程都不需再重新編譯,而一般 SQL 語句每執行一次就編譯一次,因此使用存儲過程可以提高數據庫執行速度。

2.功能實現更加靈活

存儲過程中可以應用條件判斷和游標等語句,有很強的靈活性,可以直接調用數據庫的一些內置函數,完成復雜的判斷和較復雜的運算。

3.減少網絡傳輸

復雜的業務邏輯需要多條 SQL 語句,當客戶機和服務器之間的操作很多時,將產生大量的網絡傳輸。如果將這些操作放在一個存儲過程中,那么客戶機和服務器之間的網絡傳輸就會減少,降低了網絡負載。

4.具有更好的安全性

 (1)數據庫管理人員可以更好的進行權限控制,存儲過程可以屏蔽對底層數據庫對象的直接訪問,使用 EXECUTE 權限調用存儲過程,無需擁有訪問底層數據庫對象的顯式權限。

(2)在通過網絡調用過程時,只有對執行過程的調用是可見的。無法看到表和數據庫對象名稱,不能嵌入SQL 語句,有助於避免 SQL 注入攻擊。

 

存儲過程的弊端

1.架構不清晰,不夠面向對象

 存儲過程不太適合面向對象的設計,無法采用面向對象的方式將業務邏輯進行封裝,業務邏輯在存儲層實現,增加了業務和存儲的耦合,代碼的可讀性也會降低,

2.開發和維護要求比較高

存儲過程的編寫直接依賴於開發人員,如果業務邏輯改動較多,需要頻繁直接操作數據庫,大量業務降維到數據庫,很多異常不能在代碼中捕獲,出現問題較難排查,需要數據庫管理人員的幫助。 

3.可移植性差

過多的使用存儲過程會降低系統的移植性。在對存儲進行相關擴展時,可能會增加一些額外的工作。

 

存儲過程與SQL語句如何抉擇

架構設計沒有絕對,只有在當前的場景下最合適的。

普通的項目開發中,不建議大量使用存儲過程,對比SQL語句,存儲過程適用於業務邏輯復雜,比較耗時,同時請求量較少的操作,例如后台大批量查詢、定期更新等。

(1)當一個事務涉及到多個SQL語句時或者涉及到對多個表的操作時可以考慮應用存儲過程
(2)在一個事務的完成需要很復雜的商業邏輯時可以考慮應用存儲過程
(3)比較復雜的統計和匯總可以考慮應用后台存儲過程

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM