Postgresql
何時使用儲存過程/使用者定義函式?
我對 SP(儲存過程)和 UDF(使用者定義函式)的使用感到困惑。通常,也可以在數據庫之外的程序中編寫程式碼。
是否有任何一般性建議來決定何時使用它們?
Postgres 11 或更新版本
SQL 過程(“儲存過程”)也可以開始和結束事務:
但是,事務塊中不允許的命令不能(還)包括在內。重要範例
CREATE DATABASE
或CREATE INDEX CONCURRENTLY
或VACUUM
。
INOUT
然而,當使用參數創建過程時,過程只能返回一個結果行。Postgres 14 或更高版本也允許使用OUT
參數。Postgres 10 或更早版本(原始答案)
嚴格來說,沒有“儲存過程”。只是功能,幾乎但不完全相同。最重要的是,函式總是在事務內部執行,這對於鎖管理、擷取錯誤或無法在事務上下文中執行的命令(見上文)很重要。有關的:
與將所有原始數據檢索到應用程序中並在那裡進行計算相比,在 SQL 中處理數據具有重大優勢:
相同的原則可以應用於無法在單個語句中完成的更大操作,即使在(數據修改)CTE中使用“鍊式”命令時也不行:
根據案例的不同,一個函式可以在性能上更出色,而且通常更方便——尤其是當多個應用程序訪問同一個數據庫時。您必須選擇一種伺服器端語言,最常見的是 SQL 或 PL/pgSQL:
在存在競爭並發事務(多使用者環境)的情況下要簡短。只在需要原子的相同功能中放入盡可能多的內容。如果可能,請避免使用許多鎖的長事務。鎖只在事務結束時釋放。長事務可能會停止並發訪問,甚至導致死鎖(Postgres 會自動檢測並解決死鎖,方法是為一個或多個競爭事務引發錯誤,然後回滾)…
如果您避免使用這些反模式,那麼伺服器端功能可能是一個很好的工具。出於某些目的,您無論如何都必須使用函式,例如觸發函式。