回覆列表
  • 1 # 使用者8050248142867

    儲存過程的定義:

    一組為了完成特定功能的SQL 語句集,儲存在資料庫中,經過第一次編譯後再次呼叫不需要再次編譯,使用者透過指定儲存過程的名字並給出引數(如果該儲存過程帶有引數)來執行它。

    透過定義很容易知道儲存過程的本質是SQL語集;因此如果你會SQL語句,其實你只需要再學習一些SQL儲存過程裡面的語法,關鍵字,你也就會使用儲存過程了,和儲存過程非常類似的觸發器也是如此。

    那麼它有什麼優缺點呢?

    還是繼續看定義“完成特定功能的SQL 語句集” “經過第一次編譯後再次呼叫不需要再次編譯”;是的,它可以完成特定的功能並且只需編譯一次。

    什麼是特定的功能?

    例如所有的業務邏輯,以及在進行入庫的時候需要統一對入庫資料進行格式化處理等等功能。

    有過專案開發經歷的同學應該知道,當我們將很多業務邏輯寫在儲存過程裡面的時候,我們統一修改業務邏輯會非常方便。

    我程式部署到正式伺服器環境以後,如果這時候發現業務邏輯有問題,更改程式程式碼是很危險的事情,用“牽一髮而動全身”來形容也不為過,而且由於本地測試程式碼和釋出到正式環境的程式碼有諸多不同,因此臨時更改程式碼非常危險。

    如果我們將業務邏輯寫在了儲存過程裡面,我們甚至無需要重新更改程式碼,重新編譯,重新發布。我們直接更改資料庫裡面的儲存過程就可以完成程式的相應更改,這大大方便了我們釋出以後對程式的更改,增強了程式安全性。

    因此儲存過程的優點1:

    實現特定的功能,將業務和程式程式碼進行分離,增強程式維護性。

    什麼是編譯?

    利用編譯程式從源語言編寫的源程式產生目標程式的過程。

    這是編譯的定義,我是做C#開發的,每次更改完程式碼,需要對整個專案重新進行編譯,程式才可以看到更改以後的效果,直接寫的程式碼如果不進行編譯直接執行,計算機是無法識別的,計算機會在特定的環境下將程式碼編譯成計算機可以識別的中間檔案,這樣程式才能在計算機上正常執行,這個過程稱之為“編譯”,每次執行,程式都需要重新進行編譯。

    但是儲存過程經過第一次執行呼叫編譯,後面的呼叫就無需再進行編譯,儲存過程在建立的過程中,資料庫已經對其進行了一次解析和最佳化,一旦儲存過程執行,記憶體中也會相應保留一份,下次呼叫的時候直接呼叫記憶體裡面的,執行速度就會快很多。

    另外由於儲存過程直接在資料庫伺服器上執行,因此可以減少伺服器與伺服器之間不必要的網路互動,同樣也可以提高程式執行的整體速度。

    因此儲存過程的優點2:

    讓程式執行速度更快,效率更高。

    無獨有偶,儲存過程也有相應的缺點:

    那麼儲存過程有什麼缺點呢?

    SQL語句本身是一種結構化查詢語言,它不是面向物件的的,本質上是過程化的語言,因此SQL語句違背了我們程式設計的面向物件思想。

    面對複雜的業務邏輯,過程化的處理會很吃力。同時SQL擅長的是資料查詢而並非業務邏輯處理,如果把業務邏輯全放在儲存過程裡面,也就違背了這一原則。

    因此儲存過程缺點1:

    違反面向物件思想,並不適合大量業務邏輯處理。

    我曾經使用PL/SQL除錯過儲存過程,由於這種語言不是在特定的整合開發環境下執行,因此除錯起來非常不方便,出現問題,定位到相應的地方非常吃力。同時大量的使用也讓資料庫負荷很重。

    因此儲存過程缺點2:

    除錯麻煩,定位問題不方便大量使用加重了資料庫的負擔

    最後總結:

    適當的使用儲存過程有一定的好處,最佳化我們SQL語句執行的效能,實現了業務的分離。但是大量的使用會讓伺服器執行負荷過重,同時也難以定位相應的業務問題。

  • 中秋節和大豐收的關聯?
  • 5個月的寶寶便秘,而且大便黏還很臭,怎麼改善呢?