利用存儲過程優化複雜的數據庫操做

參考其餘文章列舉存儲過程的優劣,據此分析目前智慧電站總項目下,還有那些地方的數據庫操做,適合使用存儲過程進行優化。php

存儲過程是什麼?

儲存程序 (Stored Procedure),又可稱預儲程序或者存儲過程,是一種在數據庫中存儲複雜程序,以便外部程序調用的一種數據庫對象,它能夠視爲數據庫中的一種函數或子程序。——維基百科html

能夠理解爲數據庫中的函數過程。web

存儲過程的優點

就我在項目中實際使用來講,當前臺處理涉及多條數據庫查詢語句操做,並出現臨時表需整合多個表篩選多餘信息的狀況下使用到了存儲過程。而且發如今數據庫中寫一個存儲過程,web端、移動端以及桌面端均可以調用。sql

引用自微軟文檔-存儲過程(數據庫引擎)數據庫

減小了服務器/客戶端網絡流量

過程當中的命令做爲代碼的單個批處理執行。這能夠顯著減小服務器和客戶端之間的網絡流量,由於只有對執行過程的調用纔會跨網絡發送。 若是沒有過程提供的代碼封裝,每一個單獨的代碼行都不得不跨網絡發送。安全

更強的安全性

  • 多個用戶和客戶端程序能夠經過過程對基礎數據庫對象執行操做,即便用戶和程序對這些基礎對象沒有直接權限。 過程控制執行哪些進程和活動,而且保護基礎數據庫對象。 這消除在了單獨的對象級別授予權限的要求,而且簡化了安全層。
  • 在經過網絡調用過程時,只有對執行過程的調用是可見的。 所以,惡意用戶沒法看到表和數據庫對象名稱、嵌入本身的 Transact-SQL 語句或搜索關鍵數據。
  • 使用過程參數有助於避免 SQL 注入攻擊。 由於參數輸入被視做文字值而非可執行代碼,因此,攻擊者將命令插入過程內的 Transact-SQL 語句並損害安全性將更爲困難。
  • 能夠對過程進行加密,這有助於對源代碼進行模糊處理。

代碼的重複使用

任何重複的數據庫操做的代碼都很是適合於在過程當中進行封裝。這消除了沒必要要地重複編寫相同的代碼、下降了代碼不一致性,而且容許擁有所需權限的任何用戶或應用程序訪問和執行代碼。服務器

更容易維護

在客戶端應用程序調用過程而且將數據庫操做保持在數據層中時,對於基礎數據庫中的任何更改,只有過程是必須更新的。 應用程序層保持獨立,而且沒必要知道對數據庫佈局、關係或進程的任何更改的狀況。網絡

改進的性能

默認狀況下,在首次執行過程時將編譯過程,而且建立一個執行計劃,供之後的執行重複使用。 由於查詢處理器沒必要建立新計劃,因此,它一般用更少的時間來處理過程。函數

存儲過程的劣勢

不少文章提到存儲過程的可移植性差:佈局

因爲存儲過程將應用程序綁定到 SQL Server,所以使用存儲過程封裝業務邏輯將限制應用程序的可移植性。若是應用程序的可移植性在您的環境中很是重要,則將業務邏輯封裝在不特定於 RDBMS 的中間層中多是一個更佳的選擇。

但目前項目,是確認綁定在SQL Server數據庫中,不會輕易更改,可移植性不是考慮的重點。

適用範圍

依據存儲過程的優點,目前能夠封裝成存儲過程的幾個數據處理:

  • 訂餐系統中的提交操做
    【遇到問題】以前在作這一功能時,就受限於提交多個表增、刪、改的順序以及完成狀態,利用php屢次判斷數據操做的執行狀態的方式不只繁瑣,並且進行到其中一步發生錯誤,還須要把前面的數據操做撤銷,不影響該次訂餐操做性質。
    【解決當時】封裝爲存儲過程,利用數據庫自己的邏輯控制,一次性提交執行一次訂餐提交操做。

更多文章能夠來個人我的博客裏面看到

歡迎來訪:綿綿小站

參考文章

相關文章
相關標籤/搜索