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

2021-09-23 17:49:51 字數 1285 閱讀 2208

58到家資料庫30條軍規,有一條是「禁止使用儲存過程、檢視、觸發器、event」,

高併發大資料的網際網路業務,架構設計思路是「解放資料庫cpu,將計算轉移到服務層」,

併發量大的情況下,這些功能很可能將資料庫拖死,業務邏輯放到服務層具備更好的擴充套件性,能夠輕易實現「增機器就加效能」。

資料庫擅長儲存與索引,在目前的網際網路系統架構中,伺服器的擴充套件要比儲存的擴充套件更簡單,

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

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

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

儲存過程中可以應用條件判斷和游標等語句,有很強的靈活性,可以直接呼叫資料庫的一些內建函式,完成複雜的判斷和較複雜的運算。

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

(1)資料庫管理人員可以更好的進行許可權控制,儲存過程可以遮蔽對底層資料庫物件的直接訪問,使用 execute 許可權呼叫儲存過程,無需擁有訪問底層資料庫物件的顯式許可權。

(2)在通過網路呼叫過程時,只有對執行過程的呼叫是可見的。無法看到表和資料庫物件名稱,不能嵌入sql 語句,有助於避免 sql 注入攻擊。

儲存過程不太適合物件導向的設計,無法採用物件導向的方式將業務邏輯進行封裝,業務邏輯在儲存層實現,增加了業務和儲存的耦合,**的可讀性也會降低,

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

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

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

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

(1)當乙個事務涉及到多個sql語句時或者涉及到對多個表的操作時可以考慮應用儲存過程

(2)在乙個事務的完成需要很複雜的商業邏輯時可以考慮應用儲存過程

(3)比較複雜的統計和彙總可以考慮應用後台儲存過程

儲存過程與SQL語句對比

優勢 1 提高效能 sql語句在建立過程時進行分析和編譯。儲存過程是預編譯的,在首次執行乙個儲存過程時,查詢優化器對其進行分析 優化,並給出最終被存在系統表中的儲存計畫,這樣,在執行過程時便可節省此開銷。2 降低網路開銷 儲存過程呼叫時只需用提供儲存過程名和必要的引數資訊,從而可降低網路的流量。3 ...

分頁SQL語句 儲存過程

分頁儲存過程一 alter procedure dbo fy startrowindex int,maximumrows int asbegin select from select ugid,uname,row number over order by ugid desc rownum from ...

儲存過程分頁Sql語句

create proc proc page pageindex int,當前頁碼 pagesize int,每頁多少條 tablename nvarchar 50 所要查詢的表名稱 pagecount int output,計算 總共多少頁 recordcount int output 記錄的總數量...