參考其他文章列舉存儲過程的優劣,據此分析目前智慧電站總項目下,還有那些地方的資料庫操作,適合使用存儲過程進行優化。 存儲過程是什麼? 儲存程式 (Stored Procedure),又可稱預儲程式或者存儲過程,是一種在資料庫中存儲複雜程式,以便外部程式調用的一種資料庫對象,它可以視為資料庫中的一種函 ...
參考其他文章列舉存儲過程的優劣,據此分析目前智慧電站總項目下,還有那些地方的資料庫操作,適合使用存儲過程進行優化。
存儲過程是什麼?
儲存程式 (Stored Procedure),又可稱預儲程式或者存儲過程,是一種在資料庫中存儲複雜程式,以便外部程式調用的一種資料庫對象,它可以視為資料庫中的一種函數或子程式。——維基百科
可以理解為資料庫中的函數過程。
存儲過程的優勢
就我在項目中實際使用來說,當前臺處理涉及多條資料庫查詢語句操作,並出現臨時表需整合多個表篩選多餘信息的情況下使用到了存儲過程。並且發現在資料庫中寫一個存儲過程,web端、移動端以及桌面端都可以調用。
減少了伺服器/客戶端網路流量
過程中的命令作為代碼的單個批處理執行。這可以顯著減少伺服器和客戶端之間的網路流量,因為只有對執行過程的調用才會跨網路發送。 如果沒有過程提供的代碼封裝,每個單獨的代碼行都不得不跨網路發送。
更強的安全性
- 多個用戶和客戶端程式可以通過過程對基礎資料庫對象執行操作,即使用戶和程式對這些基礎對象沒有直接許可權。 過程式控制制執行哪些進程和活動,並且保護基礎資料庫對象。 這消除在了單獨的對象級別授予許可權的要求,並且簡化了安全層。
- 在通過網路調用過程時,只有對執行過程的調用是可見的。 因此,惡意用戶無法看到表和資料庫對象名稱、嵌入自己的 Transact-SQL 語句或搜索關鍵數據。
- 使用過程參數有助於避免 SQL 註入攻擊。 因為參數輸入被視作文字值而非可執行代碼,所以,攻擊者將命令插入過程內的 Transact-SQL 語句並損害安全性將更為困難。
- 可以對過程進行加密,這有助於對源代碼進行模糊處理。
代碼的重覆使用
任何重覆的資料庫操作的代碼都非常適合於在過程中進行封裝。這消除了不必要地重覆編寫相同的代碼、降低了代碼不一致性,並且允許擁有所需許可權的任何用戶或應用程式訪問和執行代碼。
更容易維護
在客戶端應用程式調用過程並且將資料庫操作保持在數據層中時,對於基礎資料庫中的任何更改,只有過程是必須更新的。 應用程式層保持獨立,並且不必知道對資料庫佈局、關係或進程的任何更改的情況。
改進的性能
預設情況下,在首次執行過程時將編譯過程,並且創建一個執行計劃,供以後的執行重覆使用。 因為查詢處理器不必創建新計劃,所以,它通常用更少的時間來處理過程。
存儲過程的劣勢
很多文章提到存儲過程的可移植性差:
由於存儲過程將應用程式綁定到 SQL Server,因此使用存儲過程封裝業務邏輯將限制應用程式的可移植性。如果應用程式的可移植性在您的環境中非常重要,則將業務邏輯封裝在不特定於 RDBMS 的中間層中可能是一個更佳的選擇。
但目前項目,是確認綁定在SQL Server資料庫中,不會輕易更改,可移植性不是考慮的重點。
適用範圍
依據存儲過程的優勢,目前可以封裝成存儲過程的幾個數據處理:
- 訂餐系統中的提交操作
【遇到問題】之前在做這一功能時,就受限於提交多個表增、刪、改的順序以及完成狀態,利用php多次判斷數據操作的執行狀態的方式不僅繁瑣,而且進行到其中一步發生錯誤,還需要把前面的數據操作撤銷,不影響該次訂餐操作性質。
【解決當時】封裝為存儲過程,利用資料庫本身的邏輯控制,一次性提交執行一次訂餐提交操作。