Stored-Procedures
儲存過程和網路擁塞
去面試的時候,面試官問我“儲存過程有什麼好處?” 我開始回答,但是當我說“它減少了網路擁塞”時,他突然說“不,它沒有”。
我突然停頓了一下,不敢問他為什麼。面試結束後,我在網上搜尋了很多,但我發現我說的點在那裡,但沒有解釋。所以我問了自己一些斷言:
由於儲存過程是預編譯的,即已經為它創建了執行計劃,它提高了執行速度。但是對於我們將一些變數傳遞給 SP 的情況,那些需要去伺服器執行,並且應該為每個變數檢索不同的結果。
所以我的觀點是面試官是正確的:網路擁塞並沒有減少,每次都必須將變數傳遞到數據庫並返回結果,所以網路忙於這些。正確的?
我的斷言正確嗎?
在 SQL Server 中,查詢優化器通過這些步驟來執行任何查詢(儲存過程呼叫或即席 SQL 語句):
- 從語法上檢查查詢
- 如果沒問題 - 它檢查計劃記憶體以查看它是否已經有該查詢的執行計劃
- 如果有執行計劃 - 該計劃被(重新)使用並執行查詢
- 如果還沒有計劃,則確定執行計劃
- 該計劃儲存到計劃記憶體中以供以後重用
- 查詢被執行
關鍵是:ad-hoc SQL 和儲存過程在處理上沒有什麼不同。
如果一個 ad-hoc SQL 查詢正確地使用了參數——無論如何,為了防止 SQL 注入攻擊——它的性能特徵沒有什麼不同,而且絕對不會比執行儲存過程差。
儲存過程還有其他好處(例如,無需授予使用者直接表訪問權限),但在性能方面,使用適當參數化的 ad-hoc SQL 查詢與使用儲存過程一樣有效。